2012-09-18 109 views
1

我想使用grep和-f,-i和-v选项。我有以下内容的模式文件:grep -f使用-i选项

的vchkpw-POP3
的vchkpw提交
USER_UNKNOWN
unknown_user
address_rejected
no_such_user
does_not_exist
invalid_recipient
mailbox_unavailable
user_not_found
no_mailbox_here

我想在处理我的qmail邮件日志文件时排除所有上述条款。

使用Grep 2.5.1,它似乎不适用于从第3个位置开始的任何模式。

我正在使用一行bash代码来解析我的maillog文件。请参阅下面的一行:和

cat /var/log/maillog | tai64n2tai | awk '{$1="";$2="";$3="";$4="";$5="";print}' 
| grep -v vchkpw-pop3 | grep -v vchkpw-submission | awk '{sub(/^[ \t]+/,"")};1' 
| qlogselect start $STARTDAY end $ENDDAY | matchup > $QMAILSTATS 5>/dev/null 

而不是管道使用多个的grep -v“SomeText”则会,我想在他们的地方用grep -vif patterns.txt。

但是,我的问题是,在我的grep版本中,如果模式中包含下划线(_),它将不允许我一起使用f和i选项。如果我删除下划线,那么模式与预期相符。

这里是什么,我想一个例子行解析我的maillog时ommit:

Sep 20 15:46:50 m qmail: 1348123610.323831 delivery 11150428: failure: 204.119.19.51_does_not_like_recipient./Remote_host_said:_550_5.1.1_User_unknown/Giving_up_on_204.119.19.51./ 

由于错误信息是依赖于我联系邮件服务器,有时图案USER_UNKNOWN有大写字母,有时它没有。

任何人都有更好的解决方案?

我喜欢不必每次都编辑一行bash命令的想法,只需从文件中添加/删除模式即可。

+0

' grep -if patterns.txt file.txt'适用于我。我用'GNU grep 2.6.3'测试了这个。你确定你有问题吗? – Steve

+0

@steve感谢您的回复。我会尝试升级Grep,看看这是否有所作为。 –

+0

它在grep 2.5.1中可用,但只适用于前两种模式。如果我将“user_unknown”移动到第一或第二位置,它将找到并排除行.....否则不行。 –

回答

0

以下是使用GNU awk的一种方法,假设您将模式保存在名为patterns.txt的文件中。这是script.awk内容:

BEGIN { 
    IGNORECASE=1 
} 

FNR==NR { 
    patterns[$0]++ 
    counter++ 
    next 
} 

{ 
    $1=$2=$3=$4=$5="" 
    sub(/^[ \t]+/,"") 

    for (i in patterns) { 
     if ($0 !~ i) { 
      count++ 
     } 
    } 

    if (counter == count \ 
     && !/^$/) { 
      print 
    } 

    count = 0 
} 

像这样运行:

< /var/log/maillog | tai64n2tai | awk -f script.awk patterns.txt - | qlogselect start $STARTDAY end $ENDDAY | matchup > $QMAILSTATS 5>/dev/null 

另外,如果你不喜欢使用脚本,你会发现有用的这一个班轮:

< /var/log/maillog | tai64n2tai | awk 'BEGIN { IGNORECASE=1 } FNR==NR { patterns[$0]++; counter++; next } { $1=$2=$3=$4=$5=""; sub(/^[ \t]+/,""); for (i in patterns) { if ($0 !~ i) { count++ } } if (counter == count && !/^$/) { print } count = 0 }' patterns.txt - | qlogselect start $STARTDAY end $ENDDAY | matchup > $QMAILSTATS 5>/dev/null 
+0

谢谢Steve!在我看来很好。 –

+0

我刚刚证实,它按预期工作。非常感谢你! –

+0

@RobertFisher:没问题。很高兴我能帮上忙 :-) – Steve