![AWK - „for-Schleife“ innerhalb des neuen Zeilendrucks](https://rvso.com/image/154449/AWK%20-%20%E2%80%9Efor-Schleife%E2%80%9C%20innerhalb%20des%20neuen%20Zeilendrucks.png)
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 printf
Formatbezeichner 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" }'