私の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