- PR -

grepでの複数条件指定

投稿者投稿内容
NA(-_-)MI
常連さん
会議室デビュー日: 2003/10/30
投稿数: 32
投稿日時: 2007-08-27 11:39
いつもお世話になります。

syslogからキーワードでエラー行のみを抽出しようと思っております。
例えば、以下のようなことは出来ないでしょうか?

「error」を含む行、かつ「failed」を含むが「cdrom」を含まない行

をまとめて1文で実現できればと思っております。


色々試してみたのですが、実現できません。
どなたか分かる方いらっしゃいましたら、ご回答をお願いいたします。

亜衣
常連さん
会議室デビュー日: 2007/07/11
投稿数: 24
お住まい・勤務地: 都内
投稿日時: 2007-08-27 11:49
grep "error" /var/log/messages |grep "failed" |grep -v "cdrom"
では、まずいのかな?
NA(-_-)MI
常連さん
会議室デビュー日: 2003/10/30
投稿数: 32
投稿日時: 2007-08-27 12:02
回答ありがとうございます。
頂いた内容だと

 「error」を含むかつ「failed」を含むかつ「cdrom」を含まない

という一つの条件です。

実現したい内容は

 「error」を含む
 「failed」を含むかつ「cdrom」を含まない

という2つの条件をORで両方とも抽出するといったものになります。

2回に分けると、時系列で並ばないので、
い1回のコマンドでかければと思います。

以上、よろしくお願いいたします。
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2007-08-27 12:36
引用:

2回に分けると、時系列で並ばないので、
い1回のコマンドでかければと思います。



こんにちは。
直接回答ではありませんが、sort で時系列順に並びなおさせるのがダメですか?
亜衣
常連さん
会議室デビュー日: 2007/07/11
投稿数: 24
お住まい・勤務地: 都内
投稿日時: 2007-08-27 12:50
perlを組み合わせたらいけるような気がするのですが、perlとgrepを使用できる環境が今無いので...

grep "error|failed" -v "cdrom" /var/log/messages
では、errorにcdromが含まれていたら、はじかれちゃいますしね...
正規表現で
((B not C) or A)ってどう表現するんでしょうか?
正規表現に詳しい方、お願いします。
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2007-08-27 13:03
引用:

亜衣さんの書き込み (2007-08-27 12:50) より:
正規表現で
((B not C) or A)ってどう表現するんでしょうか?
正規表現に詳しい方、お願いします。



これでできます。
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-4-13.html
NA(-_-)MI
常連さん
会議室デビュー日: 2003/10/30
投稿数: 32
投稿日時: 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);
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 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 のようにファイル名を指定します。

スキルアップ/キャリアアップ(JOB@IT)