私は何千もの仮想マシンに何百ものログを分散させており、ログをすばやくスキャンするためにいくつかのスクリプトを作成しようとしていて、プレゼンテーションの大部分を見つけました。そのような方法でprintfなどを使用する方法を知っていますが、特にログファイルで繰り返し値の範囲を印刷する方法は何ですか?
例:
awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.
私は印刷物を正しく生成し、フォーマットし、分離するなどの方法を知っていますが、印刷したいフィールドの範囲を指定できる場合は良いと思いました。
提案された同様の質問を使用するか、問題を直接解決する方法を見つけたら、私の質問を更新します。
ありがとうございます!
編集:$ 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つのフィールドを無視するには、次の手順を実行します。
$ 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
これが必要なものであれば、ループよりはるかに簡単です。