awk検索パターンにシェル変数を渡すには? [コピー]

awk検索パターンにシェル変数を渡すには? [コピー]

私のbashスクリプトには、awkを使用して検索するためにパターンに渡したい変数があります。しかし、私が起こると予想したことは起こりませんでした。次のテキストファイル(text.txt)があります。

-----------
Task:           a
 (some info)
  ....
------------
Task:           b 
 (some info)
  ....
------------
Task:           c
 (some info)
  ....
------------

私のスクリプトの内容は次のとおりです。

letter=a
awk -v var="$letter" '/Task .* \var/' RS='-+' text.txt

しかし、これを行うと、次以外は何も得られません。

awk '/Task .* a/' RS='-+' text.txt

私は私が期待したものを得ます:

Task:           a
 (some info)
  ....

メモ:私が探している変数を変更し続けるループがあるので、それを変数に渡す必要があります。私はawkを使用するほうが私に最も慣れているので好むが、sedやgrepのような他の提案を聞くことに反対するわけではない。

答え1

パターン全体をawkに渡すことができます

letter=a
awk -v pattern="Task .* $letter" -v RS='-+' '
    $0 ~ pattern
' text.txt

または、awk でパターンを文字列として整理します。

letter=a
awk -v ltr="$letter" -v RS='-+' '
    BEGIN {pattern = "Task .* " ltr}
    $0 ~ pattern
' text.txt

awk変数にはプレフィックスがないため、$変数に含めることはできません。/regex constant/変数はその中にあるテキストだけです。

(私は最初にすべてのawk変数を入れる傾向があります-v

答え2

最良のオプションは、おそらく環境を介して変数を渡すことです。

letter=a
p="Task: *$letter" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

または:

p="Task: *a" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

を使用すると、-v var=valueエスケープawkシーケンスの値が拡張されます。awkシェルからデータをそのまま渡そうとすると、-v var="$shell_var"これは信頼できません。

ENVIRON(または)を使用すると、whenがエスケープシーケンスを拡張しないため、ARGVより安定しています。awk

関連情報