- - PR -
grepでの複数条件指定
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-08-27 11:39
いつもお世話になります。
syslogからキーワードでエラー行のみを抽出しようと思っております。 例えば、以下のようなことは出来ないでしょうか? 「error」を含む行、かつ「failed」を含むが「cdrom」を含まない行 をまとめて1文で実現できればと思っております。 色々試してみたのですが、実現できません。 どなたか分かる方いらっしゃいましたら、ご回答をお願いいたします。 | ||||
|
投稿日時: 2007-08-27 11:49
grep "error" /var/log/messages |grep "failed" |grep -v "cdrom"
では、まずいのかな? | ||||
|
投稿日時: 2007-08-27 12:02
回答ありがとうございます。
頂いた内容だと 「error」を含むかつ「failed」を含むかつ「cdrom」を含まない という一つの条件です。 実現したい内容は 「error」を含む 「failed」を含むかつ「cdrom」を含まない という2つの条件をORで両方とも抽出するといったものになります。 2回に分けると、時系列で並ばないので、 い1回のコマンドでかければと思います。 以上、よろしくお願いいたします。 | ||||
|
投稿日時: 2007-08-27 12:36
こんにちは。 直接回答ではありませんが、sort で時系列順に並びなおさせるのがダメですか? | ||||
|
投稿日時: 2007-08-27 12:50
perlを組み合わせたらいけるような気がするのですが、perlとgrepを使用できる環境が今無いので...
grep "error|failed" -v "cdrom" /var/log/messages では、errorにcdromが含まれていたら、はじかれちゃいますしね... 正規表現で ((B not C) or A)ってどう表現するんでしょうか? 正規表現に詳しい方、お願いします。 | ||||
|
投稿日時: 2007-08-27 13:03
これでできます。 http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-4-13.html | ||||
|
投稿日時: 2007-08-27 14:13
grepコマンドではできませんでしたが、
perlの正規表現を使うことで、実現できました。 ありがとうございました。(^人^)感謝♪ 一応、ソースを記載しておきます。 $pattern = '^((?=.*error)|(?=.*failed)(?!.*cdrom)).*$'; open(SEARCH, $filename); while ($line = <SEARCH>){ if($line =~ /$pattern/){ print "$line\n"; } } close(SEARCH); | ||||
|
投稿日時: 2007-08-27 14:29
こんにちは。
…すでに解決済みのようですが、せっかくなので。 私なら、perl で楽をしようと考えます。 grep PATTERN は、perl -pne '/PATTERN/ or $_=""' とほぼ同じですから。 今回のような複合条件は、 perl -pne '/error/ || /failed/ && ! /cdrom/ or $_=""' のように。 ※実際は perl -pne '/error/ || /failed/ && ! /cdrom/ or $_=""' /var/log/messages のようにファイル名を指定します。 |