AWK - „for-Schleife“ innerhalb des neuen Zeilendrucks

AWK - „for-Schleife“ innerhalb des neuen Zeilendrucks

Ich suche, wie man eine For-Schleife in "print" einfügt. Ich habe es geschafft, alle benötigten Informationen aus der Protokolldatei zu erhalten, aber wenn ich nach "print" eine "For-Schleife" verwende, werden alle neuen Informationen in einer neuen Zeile angezeigt. Ich weiß, dass jedes Mal "print" aufgerufen wird, also ... wie drucke ich alles in einer neuen Zeile? Zum Beispiel das hier:

cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " "} {for(i=12; i<=NF; i++) print $i}'

Geben Sie mir diese Ausgabe:

66.249.65.172 - [29/May/2019:02:48:20 +0200]
"Mozilla/5.0
(compatible;
Googlebot/2.1;
+http://www.google.com/bot.html)"

Aber wenn ich am Ende weitergeben möchte, was ich zwischen 12 col und NF gefunden habe:

cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " " for(i=12; i<=NF; i++) " " $i}'

Dann bekomme ich nur:

66.249.65.172 - [29/May/2019:02:48:20 +0200]

Ich werde etwa Folgendes ausgeben:

66.249.65.172 - [29/May/2019:02:48:20 +0200] "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Antwort1

Sie müssen printf()over verwenden print, da letzteres standardmäßig eine neue Zeile nach der angegebenen Zeichenfolge einbettet. Ändern Sie Ihren Code, um printfFormatbezeichner für jede Zeichenfolge zu verwenden.

awk '{ printf "%s - %s  %s ", $1, $4, $5 } 
     { for(i=12; i<=NF; i++) printf "%s ", $i; printf "\n" }'

verwandte Informationen