68user's page 掲示板

Prev< No. 2797〜2802> Next  [最新発言に戻る] [過去ログ一覧]
No. 2797 # HIDE 2002/06/22 (土) 18:05:25
あるログファイルに1行出力されるごとに、その行に特定のキーワードが
あるかどうかを判断して、あった場合はその行を別のログに出力する
といったことをUNIXコマンドでできないかと調べています。
イメージとしては、「tail -f」と「grep」の組み合わせみたいな
感じですが、二つのコマンドをパイプで結合してもダメでした。
何か良い手はないでしょうか? ご存知の方がいたら教えてください。
よろしくお願いします。

No. 2798 # 68user 2002/06/22 (土) 19:26:19
>>2797 HIDE
tail -f log | grep foo でできる環境もあります。FreeBSD と Solaris2.6/8
あたりはできるはず。

というか、できない環境をしらないのでアドバイスはできませんが、tail が
バッファリングしてるのかな?

tail 自体それほど複雑な機能ではないので、さくっと perl などで
自作するのがいいかもしれません。

No. 2799 # HIDE 2002/06/22 (土) 20:19:02
>>2798 68user
ご回答いただきまして、ありがとうございます。

>tail -f log | grep foo でできる環境もあります。FreeBSD と>Solaris2.6/8あたりはできるはず。
  こちらの環境はSolaris2.6です。
         tail -f log | grep foo
  だと意図した形で画面に表示されるのですが、
         tail -f log | grep foo >> log2
  とやるとlog2には何も出力されないんです・・・・・・
  何か環境が変なのかな?

>tail 自体それほど複雑な機能ではないので、さくっと perl などで
>自作するのがいいかもしれません。
  そうですね。実はこの処理は大容量の性能関連のログから必要な
  行を抽出/判定するための使用しようとしているのですが、Perl
  で作ったらログの行が多いからか、逆にそのツールが動いている
  時間はCPUが100%になってしまったのでUNIXコマンドでできないかと
  調べている次第です。(Perlはあまり詳しくないので私の作り方が
  マズイだけかもしれませんが)

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2800 # 68user 2002/06/22 (土) 21:36:23
>>2799 HIDE
> tail -f log | grep foo >> log2
なるほど。grep が出力をバッファリングしてるからですね。ちょっと調べて
みた限りでは、/dev/stderr にリダイレクトしてもダメだし、バッファリング
ありにするオプションはないようなので、
    % tail -f log | perl -ne '$|=1;print if m/foo/' >> log2
てな感じで。

でも、grep でなんとかなりそうな気もするなぁ…。

No. 2801 # 68user 2002/06/22 (土) 22:38:23
>>2800 68user
> /dev/stderr にリダイレクトしてもダメだし
あー、grep 自体は stdout に出力してるだけだから、シェルで
いくら stderr に振ってもどうにもならないですね。

というわけで、続きはここで。
    http://pc.2ch.net/test/read.cgi/unix/1022769156/l50
2ch で質問するのなら最初からそっちで聞けっつーの。

No. 2802 # HIDE 2002/06/22 (土) 22:47:54
>>2800 68user

% tail -f log | perl -ne '$|=1;print if m/foo/' >> log2
をやってみたら、うまくいきました!
いろいろ調べていただいたようで、ありがとうございました。m(__)m

>でも、grep でなんとかなりそうな気もするなぁ…。
微妙〜なとこでうまくいかないのが悔しいですね。(^^;)
でも、この件は急いでいたので大変助かりました。

Prev< No. 2797〜2802> Next  [最新発言に戻る] [過去ログ一覧]