1 変数によるパターンマッチ
先日、プログラミング言語AWKにおける、変数を使ったパターンマッチングを記事にしました。
⇒ 2026年1月28日付け記事「AWKのパターンに変数を使用(シェルスクリプトの引数として指定した文字列でデータ検索)」をご覧ください。
その記事は長文になったため、今回、その結論部分を抜き出して短い記事にまとめました。自分自身の記憶にしっかり定着させるためです。

2 結論(スラッシュの要否)
AWKの正規表現マッチングには、大きく分けて2つの方法があります。
(1)リテラル(固定文字)による正規表現
/パターン/ のようにスラッシュで囲って直接パターンを記述する方法です。
例:$3 ~ /hoge/ ・・・第3フィールドに「hoge」という文字列が含まれていればマッチ
(2)変数による正規表現
awkの変数に正規表現パターンを格納し、その変数を使ってマッチングする方法です。
例:$3 ~ pattern ・・・第3フィールドに変数「pattern」に代入された文字列が含まれていればマッチ
上記のように、パターンに変数を使う場合、スラッシュで囲まずに変数名のみを記述する必要があります。これが結論で、大事な点です。
3 なぜ?・・・の理屈
正規表現パターンにおいて、文字列をスラッシュで囲むと、スラッシュ内の文字列はリテラル(固定文字)として扱われます。スラッシュ内に変数名を記述したとしても、変数として扱ってもらえず、変数展開は行われません。
スラッシュで囲まずに変数名のみを記述すれば、通常どおり変数展開が行われます。
4 具体例
具体的には、次のとおりです。
【誤】 $ echo hogefuga | awk -v hensu="hoge" '$0 ~ /hensu/'
【正】 $ echo hogefuga | awk -v hensu="hoge" '$0 ~ hensu'
上記の【誤】においては、実行の結果は何も表示されないのに対し、【正】では想定どおりの動作をして、hogehugaと表示されます。
【誤】の書き方では、「hensu」というリテラル文字との照合が行われるから、マッチしません。
5 補足(おまけ)
(1) awkプログラム内での変数呼び出しでは、「$」は付けない。
(2) 「'$0 ~ hensu'」の部分は、単に「'hensu'」の省略記述も可。
それではまた次の記事で。
goosyun
