如何将后缀日志的一部分与正则表达式匹配?

时间:2017-08-18 02:51:13

标签: regex perl grep

我需要使用grep。

匹配后缀日志的以下部分

Aug 6 16:00:35 d1234567-002-e3 postfix/smtp[16032]: 3E60C7832

                                                    ^^^^^^^^^^

到目前为止,我能够做到的唯一方法是使用负向前瞻,但在我当前的grep实现中不允许这样做(不使用perl regex)。

我认为我可以按照......(不完全解决方案)的方式做点什么

.*:.*:.*:

3 个答案:

答案 0 :(得分:1)

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
          return UIInterfaceOrientationMask(rawValue: IInterfaceOrientationMask.portrait) // this enable all portrait orientation for all device
}

对于$ s="Aug 6 16:00:35 d1234567-002-e3 postfix/smtp[16032]: 3E60C7832" 解决方案,

sed

对于$ sed -E 's/.*]: //' <<< "$s" 解决方案,

grep

对于$ grep -oP ']: \K.*' <<< "$s" 解决方案,

awk

答案 1 :(得分:0)

您可以尝试以下模式

 my $s = "Aug 6 16:00:35 d1234567-002-e3 postfix/smtp[16032]: 3E60C7832";

 if($s=~m/.*:\s(.+)/)
 {
    print $1,"\n";
 }

或者如果您想通过冒号跟踪,可以使用以下正则表达式

 if($s=~m/^[^:]+:[^:]+:[^:]+:\s*(.+)/)
 {
    print $1,"\n";
 }

在你的正则表达式中,你提到了.*:.*:.*:以及添加另一个.*的需要,因此完整的正则表达式为.*:.*:.*:(.*)。但这不是一个好的正则表达式,因为*贪婪匹配零次或多次,因为每次搜索它都将结束,然后它将回溯以匹配:

为避免贪婪匹配,我们可以?以及*+使用[^:]。但是对于你的问题否定字符类(.*:.*:.*:(.*))是最好的解决方案。

贪婪的比赛

对于这个.*?:.*?:.*?:(.*)模式,它将在212步之后给出结果。 check here

非贪婪匹配

使用此^[^:]+:[^:]+:[^:]+:(.*)模式,它将在59步后给出结果。 check here

否定字符类

使用此Java –jar Jenkins.war 模式,它将在11个步骤后给出结果。 check here

答案 2 :(得分:0)

my ( $mail_id ) = m{postfix/smtp[\d+]: (\w+)}

我的意思是,你确实将它标记为perl,对吧?

这样:

perl -lne 'm{postfix/smtp[\d+]: (\w+)} and print $1,"\n;' postfix.log