![AWK - 改行印刷内の「for ループ」](https://rvso.com/image/154449/AWK%20-%20%E6%94%B9%E8%A1%8C%E5%8D%B0%E5%88%B7%E5%86%85%E3%81%AE%E3%80%8Cfor%20%E3%83%AB%E3%83%BC%E3%83%97%E3%80%8D.png)
「print」内に for ループを配置する方法を探しています。ログ ファイルから必要なすべての情報を取得する方法はわかりましたが、print の後に「for ループ」を使用すると、新しい情報はすべて新しい行で提供されます。毎回 print が呼び出されることはわかっていますが、すべてを新しい行で印刷するにはどうすればよいでしょうか。たとえば、次のようになります。
cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " "} {for(i=12; i<=NF; i++) print $i}'
次の出力をください:
66.249.65.172 - [29/May/2019:02:48:20 +0200]
"Mozilla/5.0
(compatible;
Googlebot/2.1;
+http://www.google.com/bot.html)"
しかし、最後に 12 列と NF の間で見つけたものを渡したい場合:
cat /var/log/apache2/domlogs/xxxx/xxxx.com* | awk -F " " '{print $1 " - " $4 " " $5 " " for(i=12; i<=NF; i++) " " $i}'
すると、次のものだけが得られます:
66.249.65.172 - [29/May/2019:02:48:20 +0200]
次のように出力します:
66.249.65.172 - [29/May/2019:02:48:20 +0200] "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
答え1
後者はデフォルトで指定された文字列の後に改行を埋め込むため、printf()
overを使用する必要があります。各文字列の書式指定子を使用するようにコードを変更します。print
printf
awk '{ printf "%s - %s %s ", $1, $4, $5 }
{ for(i=12; i<=NF; i++) printf "%s ", $i; printf "\n" }'