会社の以前の従業員が作成したいくつかのスクリプトを修正/再作成していますが、シェルスクリプトの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
に割り当てます。awk
benchmark
awk
この値(30
この場合)がある場合は、入力ファイルの列6がこの値より大きいことをawk
確認してください。wk.txt
$6 > benchmark
したがって、あなたの例を使ったテストは文字列比較です。
for > 30
合法的ですが、実際にはあまり意味がありません。サンプル入力ファイルは実際の例ですか、それともランダムなテストですか?
true と評価されるため、行awk
全体が印刷され、行数が計算wc -l
されます。入力ファイルには行が1つだけなので、列6から30より大きい行数はです1
。
この値はシェル変数に割り当てられますb
。