シェルスクリプトでawk -v変数を使用する

シェルスクリプトでawk -v変数を使用する

会社の以前の従業員が作成したいくつかのスクリプトを修正/再作成していますが、シェルスクリプトの1つで次の行が見つかりました。

b=`benchmark=30;grep "Waiting for timer" wk.txt | awk -vbenchmark=$benchmark '$6 > benchmark' | wc -l`

しかし、残念ながら、上記のコード行が何をしたいのかわかりません。ここで「基準」変数を使用するのは混乱しています。次の値を使用してダミーの「wk.txt」ファイルを作成し、エコーされると、$ b変数の値は1(grep + awkコマンドで出力された行数)です。

[sreeraj@server ~]$ cat wk.txt
24  here  above the Waiting for timer 37 make sure

スクリプト作成者が$ benchmarkで何をしようとしているのかを説明できる人はいますか?

awkマニュアルページには以下が表示されますが、-vその機能を理解していません。

-v var=val
--assign var=val
          Assign the value val to the variable var, before execution of the program begins.   Such  variable  values  are
          available to the BEGIN block of an AWK program.

答え1

これにより:

awk -v benchmark=30 '...'

これは次のとおりです。

awk 'BEGIN{ benchmark = 30 } ... '

変数の初期値を設定するために使用されます。

著者がなぜこのようなことをしたのかは理解できないが、

benchmark=30; ... | awk -v benchmark=$benchmark ..

彼らは次のようにすることもできます:

... | awk -v benchmark=30 ..

答え2

元の作成者がシェルで同じ変数名を使用して混乱を招く可能性があります。

benchmark=30;gr...

彼/彼女がするようにawk

awk -vbenchmark=$benchmark

どのはいまたはいいえシェル変数の値を変数benchmarkに割り当てます。awkbenchmark

awkこの値(30この場合)がある場合は、入力ファイルの列6がこの値より大きいことをawk確認してください。wk.txt

$6 > benchmark

したがって、あなたの例を使ったテストは文字列比較です。

for > 30

合法的ですが、実際にはあまり意味がありません。サンプル入力ファイルは実際の例ですか、それともランダムなテストですか?

true と評価されるため、行awk全体が印刷され、行数が計算wc -lされます。入力ファイルには行が1つだけなので、列6から30より大きい行数はです1

この値はシェル変数に割り当てられますb

関連情報