SIM フリーどさにっき 〜2014年10月下旬〜

by やまや
<< = >>

2014年10月31日(金)

無題

_ また耳の聞こえが悪くなった…。

zgrep

_ 検索パターンをファイルから読む。

% grep -f pattern filename
パターンは標準入力からも食える。
% cat pattern | grep -f - filename
ファイルが圧縮されてるなら zgrep の出番。
% zgrep -f pattern filename.gz
が、こいつはうまくいかないことがある。
% cat pattern | zgrep -f - filename.gz

_ zgrep って、sh スクリプトで書かれてるものと、C で書かれてるものと2通りある。sh で書かれてるものは、要するに内部的に zcat filename.gz | grep -options pattern となるように書き換えてるだけ。よって zgrep -f - filename.gz は内部的には zcat filename.gz | grep -f - というコマンドを実行することになり、つまり grep は検索パターンも検索対象もどっちも標準入力から読めという無茶を要求されることになる。動くわけがない。

_ 具体的には、圧縮済みの古いログから条件にマッチしたものを抽出するのに、

% (なんか実行してキーワードを出力) | zfgrep -f - hoge.log.*.gz
みたいなことをやりたい機会がけっこうあるんだよね。sh で書かれた zgrep はこれがちゃんと動いてくれないから困る。bash/zsh ならば、
$ zgrep -f <(command) filename.gz
のように無理をすればまあできなくもないんだけれど。

_ でも、C で実装されてる zgrep は、内部的な動作が異なっていて、このような使い方をしてもまったく問題なく動く。近所を見回してみたところではそういう zgrep は FreeBSD と OSX ぐらいしかなさげで、むしろこっちの方が例外っぽいんだけど、ほかの実装もマネしてくれないですかねぇ。


<< = >>
やまや