数千の VM にまたがる数百のログがあり、ログをすばやくスキャンするためのスクリプトをいくつか作成しようとしています。プレゼンテーションの大部分は理解しましたが、awk、printf など、使い方はわかっているものの、具体的にはログ ファイルから反復された範囲の値を印刷する簡単な方法があるかどうか知りたいです。
例:
awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.
印刷出力を適切に awk、フォーマット、分離する方法などは知っていますが、印刷したいフィールドの範囲を指定できれば便利だと思いました。
提案された同様の質問や自分で解決方法がわかったら、質問を更新します。
ありがとう!
編集: $1 $2 $3 を手動で印刷する方法は知っていますが、例には含めませんでした。
編集 2: NF を使用して awk でフィールドの数をカウントし、後で範囲を動的にする方法も知っています。これが私の長期的な目標です。
答え1
最初のフィールドから始まる範囲
次のテスト ファイルを検討してみましょう。
$ cat input.csv
a,b,c,d,e,f,g,h,i,j
少なくとも GNU awk では、最初の 5 つのフィールド (または他の数値) を次のように出力できます。
$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e
明瞭さよりも簡潔さを重視する人のために、次のように書くこともできます。
$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e
動的サイズ変更
最後の 2 つのフィールドを、その 2 つのフィールドの前にいくつのフィールドがあっても省略するには、次のようにします。
$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h
その他の範囲
任意のフィールドで開始と終了を印刷するには、ループが必要です。
$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f
3 番目のフィールドから印刷し、最後の 2 つのフィールドを動的に省略するには、次のようにします。
$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h
答え2
簡単に言うと、 はawk
はるかに柔軟性がありますが、特定の範囲のフィールドだけが必要な場合は、 を使用しますcut
。
cut -d, -f1-5 huge_log_file.csv
awk
これが必要なすべてであれば、ループよりもはるかに簡単です。