2009年2月11日

[linux-users:108201] Re: grepとパイプについて

楠根です。

こういうお題は新しい発見があっていいですね。

(2009/02/10 19:23), Kazuhiro NISHIYAMA さんは書きました:
> xargsを使わなくてもgrepの-fオプションを使って
> 何らかの処理 | grep -i -f - fileName
> でいいと思います。


エレガントですね。
-f もその引数としての - もそれぞれ使い方は知ってますが、
こういうケースでそう使う発想はできませんでした。脱帽です。


ちなみに、コマンド実行結果それぞれに対して何らかの実行をする時は、
中司さんの書かれた `` + for 以外に while + read もありますね。
$ 何らかの処理 | while read 変数名; do コマンド $変数名; done
のような形です。

read のオプションや IFS 環境変数の設定、あるいは変数参照時の書き方によって、
微妙にいろいろ違う処理になります。
例をいくつか挙げてみますので、興味があれば試してみて下さい。

( echo 'a b'; echo ' c d'; echo; echo 'fg \n h i' ) | while read line; do echo -e $line; done
( echo 'a b'; echo ' c d'; echo; echo 'fg \n h i' ) | while read line; do echo -e "$line"; done
( echo 'a b'; echo ' c d'; echo; echo 'fg \n h i' ) | while read -r line; do echo -e "$line"; done
( echo 'a b'; echo ' c d'; echo; echo 'fg \n h i' ) | while read -d ' ' line; do echo -e "$line"; done
( echo 'a b'; echo ' c d'; echo; echo 'fg \n h i' ) | while IFS='' read line; do echo -e "$line"; done

複数の処理を組み合わせる場合など、
$() や `` を使うよりシンプルに表現できることもありますし、
処理内容によっては並列実行によりメモリ節約や所要時間短縮になることもあるので、
覚えておくと役にたつかもしれません。


なお、今回の grep のケースで while + read を使う場合は、
$ 何らかの処理 | while read pattern; do grep -i "$pattern" fileName; done
で似たようなことができます。

ただし、西山さんが紹介された "-f -" を使った場合は
複数行のいずれかにマッチしたものを重複なく出力できるので、
そういう用途の場合は普通に -f - を使った方がいいと思います。

以上、蛇足かもしれませんが、せっかくなので便乗して紹介してみました。
--
Takeshi Kusune <kusune@xxxxx>

投稿者 xml-rpc : 2009年2月11日 05:51
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/82080
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。