2011/07/04
awk (1) 小技
先日参加した勉強会で awk (1) 関連の発表があったので、 ちょっとした小技を紹介してみる。
- system() を利用する際の注意
-
awk の中で外部コマンドを実行する場合は
組み込み関数 system() が利用できるが、
この関数を利用して外部コマンドを実行すると
入出力 stream がオープンされるので、
ファイルディスクリプタが消費されてしまう。
従って awk 内で何度も system() を実行すると、 オープンできるディスクリプタの上限を超過してしまい、 awk の実行が中断されてしまう可能性がある。
その場合 close() を利用して system() がオープンした stream を閉じれば良いのだが、 awk の system() では stream を明示的に扱わない。 そこで system() で実行したコマンドを close() の引数で指定する事で stream を閉じる事ができる。1awk '{ 2 : 3 # コマンドを生成 4 command = sprintf("%s %s %s", command, arg1, arg2); 5 # コマンドを実行して結果を取得 6 buf = system(command); 7 # stream をclose 8 close(command); 9 : 10}'
- 関数内ローカルな変数の使用
-
nawk は function を利用する事で
内部関数を作成する事ができるが、
関数内でローカルな変数を明示的に定義する事ができない。
そこで関数宣言の仮引数部に変数を定義する事で、
関数内ローカルの変数として利用できる。
1awk '{ 2 : 3 # 関数 foo の定義 4 # num: ループ数 5 # 以下ローカル変数 6 # i: ループウンタ 7 function foo(num, i) 8 { 9 # i はローカル変数扱いなので呼出元の i は影響を受けない 10 for(i=0; i<1num; i++) 11 : 12 } 13 : 14 foo(num); 15 : 16 }'
但し関数呼び出し時と関数定義時に引数の数が等しくないので、 後に混乱しないためにコメントで明記するなどの処置は必要。
トラックバック
https://blog.bsdhack.org/index.cgi/Computer/20110704.trackback