使用 awk 查找字符串并打印单词边界上的匹配项

使用 awk 查找字符串并打印单词边界上的匹配项

我对 awk 有点陌生,所以可能有人问过这个问题,但我找不到问题的解决方案。

使用 awk,我想在 syslog 中搜索字符串,并且只打印该值直到下一个字边界。

规则:

  • 只能使用awk
  • Linux 中应该是一行命令

测试数据:系统日志包含防火墙在丢弃数据包时生成的条目。这些信息行包含多个值并且长度各不相同(忘记 NF)。 源IP始终以SRC=开头

到目前为止我所拥有的:

awk '/SRC=/ { print $13 }' /var/log/syslog*

但问题是字段 13 并不总是 SRC 值。

解决方案的其余部分可以在这个问题中看到:列出有限制的摘要

答案1

GNUawk解决方案:

awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' /var/log/syslog*

这会将处理记录缩小到仅与模式匹配的一个字段SRC=[^[:space:]]+


时间性能检查(testlog有22756行):

$ time(awk -v FPAT='SRC=[^[:space:]]+' 'NF{ print $1 }' testlog > /dev/null)

real    0m0.186s
user    0m0.164s
sys 0m0.000s

$ time(awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' testlog > /dev/null)

real    0m0.282s
user    0m0.256s
sys 0m0.000s

答案2

KISS 解决方案(应该适用于任何 awk 风格) - 只需循环字段并逐一测试:

awk '{for(i=1;i<=NF;i++) {if ($i ~ /^SRC=/) print $i}}' /var/log/syslog

相关内容