web-dev-qa-db-ja.com

シェル変数を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などの他の提案を聞くことに反対していません。

3
pdm

パターン全体を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で前に置くのが私の好みです)

8
glenn jackman

あなたの最良の選択は、環境を通して変数を渡すかもしれません:

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

または:

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

-v var=valueawkを使用すると、値のエスケープシーケンスが展開されます。 Shellからawkにデータをそのまま渡す場合、-v var="$Shell_var"は信頼できません。

ENVIRON(またはARGV)を使用すると、awkがエスケープシーケンスを展開しないため、より信頼性が高くなります。

3
cuonglm