AWK 打印正则表达式模式

AWK 打印正则表达式模式

我正在尝试打印以下邮件日志的正则表达式模式。特别是我试图获取方括号之间的 ID(请参阅第二行以供参考)。

Mar 29 03:48:13 mx-150 clamsmtpd: 14114F: accepted connection from: 127.0.0.1
Mar 29 03:48:13 mx-150 postfix/smtpd[7445]: connect from unknown[127.0.0.1]
Mar 29 03:48:13 mx-150 spamd[15674]: prefork: child states: II

并使用以下命令:

awk '/\[\d+\]/ { print }' maillog

根据https://regex101.com/r/pL7kN2/1我得到 1 场比赛,但是 awk 没有返回任何内容。这是为什么?

答案1

尝试标准正则表达式(而不是perl正则表达式)。这将打印匹配的行:

awk '/\[[[:digit:]]+\]/ { print }' maillog

要提取并打印括号内的匹配值:

awk 'match($0,/\[[[:digit:]]+\]/) { print substr($0,RSTART+1,RLENGTH-2)}' maillog

答案2

另一种方法:

awk -F'[][]' 'NR>1{print $2}' maillog
7445
15674

答案3

如果您喜欢awk下一个脚本,如果字符串除以[](这意味着它的内部),则每隔一个字段打印一次

awk -F [][] '{for(i=2;i<=NF;i+=2)print $i}' maillog

grep但通过更简单的方式做同样的事情

grep -o '\[[^]]*\]' maillog

答案4

看你想搭配什么

awk -F"[][]" '/postfix|spamd/{print $2}' maillog

相关内容