Subject: Is it possible to pass shell variable settings into an awk program?
Date: Thu Mar 18 17:16:55 EST 1993

3.12) シェル変数の内容を awk のプログラムに渡す方法は。

これをするには、2つの方法があります。まず一つ目は、プログラムで必要な変 数を単純に展開してしまう方法です。例えば、あなたが使っている全ての tty の一覧を得るためには:

who | awk '/^'"$USER"'/ { print $2 }'(1)
awk プログラムを囲うためには、普通シングルクォ−トが使われます。これ は、プログラムの中で '$' という文字がよく使われていますが、'$' はもし シングルクォ−トでなくダブルクォ−トで囲まれていたら、シェルが解釈して しまうからです。この場合、"$USER" の中の '$' はシェルに解釈させたいの で、シングルクォ−トを閉じて、"$USER" をダブルクォ−トの中にいれます。 これらの間に空白がないため、シェルはひとつの引数として見なすことに注意 して下さい。さらに、特にこのような場合、ダブルクォ−トは必要ないことに 注意して下さい(つまり、
who | awk '/^'$USER'/ { print $2 }'(2)
のようにしてもできます)。しかし、シェル変数が特種文字や空白を含んでいる 場合ダブルクォートが必要になるので、いつも使っておいたほうがよいでしょ う。

awk に変数の値を引き渡す二番目の方法は、コマンドライン上で '偽のファイ ル名' として、変数の設定が可能であるという awk のあまり文書化されていな い仕様を使う方法です。例えば:

who | awk '$1 == user { print $2 }' user="$USER" -(3)
変数の設定はコマンドライン上で現われたとき効果するので、このテクニック を使って、例えば、異なるファイルに対してそれぞれどのように振る舞うかを awk に指示することができます。例えば:
awk '{ program that depends on s }' s=1 file1 s=0 file2(4)
awk のあるバ−ジョンでは、変数の設定が、本物のファイル名よりも前にあれ ば BEGIN ブロックが実行される前に効果しますが、そうではないものもあり、 どちらの方法かはっきりしないということに注意して下さい。

さらに、変数の値を示した場合、もし本物のファイル名を示さなければ awk は stdin から自動的に読み込むようにはなっていません。ですから、(3)でやった ようにコマンドの最後に引数 "-" を付け加える必要があります。


UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや