1 awkの疑問と答え
【疑問】
シェルスクリプト内でawk(オーク)を使用するとき、シェルスクリプト側で値を代入した変数をawk内でそのまま使用できないか。
【答え】
できない。
シェルスクリプト側で値を代入した変数は、awk内では通用しない。
【対応策】
awkの-vオプションによって、改めて変数に値を代入して、awkで利用可能なawk用の変数を別途用意する。
2 初学者が抱く疑問
上記の問題は、私がプログラミング言語awkにまだ詳しくなかった頃に抱いた疑問です。
シェルスクリプト内でawkを使用することは、よくあることです。その場合、シェルスクリプトとawkスクリプトは連続的なコードなので、記述上の差異は特にありません。だから、シェルスクリプトで値を代入した変数は、そのままawkにおいても使用できる、と初学者が考えるのも無理もないことです。現に、私がそう受け取っていました。
3 変数の扱い(説明)
プログラミング言語awkのことをある程度勉強した人にとっては当たり前のことになりますが、シェルスクリプトとawkは別世界です。別世界とは言っても、同じファイル内に同じようにコードの記述ができるので、壁一枚だけ隔てた世界、隣り合った世界、・・・ではあるのですが。
イメージとしては、シェルスクリプトという「大きな部屋」の中に、awkという「小さな独立した部屋(プロセス)」がある状態です。awkの部屋の中からは、外のシェルスクリプトで値代入された変数を扱うことができません。見ることすらできません。
そこで用意されているのが、-v オプションです。-v は、いわば「外の世界のメモの内容を、中の部屋の変数に書き写して持ち込む」ための窓口のような役割を果たします。
4 実例を呈示(検索用のスクリプト)
一つの実例を示します。
ファイル名を「data.txt」とする、次のテキストファイルがあります。
1 鬼滅の刃 きめつのやいば
2 進撃の巨人 しんげきのきょじん
3 名探偵コナン めいたんていこなん
4 東京卍リベンジャーズ とうきょうまんじりべんじゃーず
5 ワンピース わんぴーす
6 怪獣8号 かいじゅうはちごう
7 チェンソーマン ちぇんそーまん
上記テキストファイルから、特定の文字列を含む行を抽出するために、次のシェルスクリプト(ファイル名:kensaku.sh )を用意しました。
● 検索用のシェルスクリプト【ファイル名: kensaku.sh 】
#!/bin/bash
# 検索したい文字列が引数として指定されているか確認
Input="$1"
if [ -z "$Input" ]; then
echo "引数が指定されていません。"
exit 1
fi
# AWKコマンドを実行
awk -v pattern="$Input" '$3 ~ pattern' data.txt
上記のコードでは、変数Inputにシェルスクリプトの引数が代入されており、さらにawkの-vで変数patternにその値が代入されています。これにより、awkのパターンで変数patternを使用できるようなりました。
スクリプト kensaku.sh に実行権限を付加( chmod +x kensaku.sh )したうえで、同スクリプトを実行してみます。例えば、「わん」を含む文字列を検索したい場合、ターミナル画面に次のように打ち込み、実行します。
./kensaku.sh わん
そうすると、「5 ワンピース わんぴーす」の行が抽出できます。おぉ、こりゃぁ、便利ぃ!

5 補足(注意すべき点)
awk内での変数の扱いに当たって、一つだけ注意が必要です。-vで設定した変数をawk内で使用する場合には、「$」を付けずに変数名だけを記述する、ということです。上記4で呈示のコード中でも、「'$3 ~ pattern'」と記述しています(「$pattern」としない。)。
これは、シェルでの一般的な変数呼び出しとは異なることから、注意が必要なところです。
6 まとめ
このように、プログラミング言語awkが使えるようなると、とっても便利です。
シェルスクリプトで定義の変数と、awkで定義の変数が別物であること、それが分かるまで、その答えを見つけるまで、ずいぶん長いこと苦しみましたが。でも、長いこと悩んだ末の解決は感動もので、その分だけしっかりと身につく思いがします。
それではまた次の記事で。
goosyun
