昨天我在这里问了一个关于 oneliner 的问题和 mjschultz给了我一个我立即爱上的答案:) Awk 刚刚破坏了手头的任务,在几秒钟内解析了一个大的日志文件(500+ MB)。现在我正在尝试将其他 oneliners 移植到 awk。
这就是有问题的:
grep "pop3\[" maillog | grep "User logged in" |
egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sort -u
我需要使用 pop3 连接到邮件服务器的所有唯一 IP 地址的列表。
这是一个示例日志条目:
Nov 15 00:49:21 hostname pop3[19418]: login: [10.10.10.10] username plaintext
User logged in
所以我找到了所有包含“pop3”的行,并解析它们的“用户登录”部分。接下来,我使用egrep和正则表达式来匹配IP地址,并使用排序来过滤掉重复的地址。
这是我迄今为止的 awk 版本:
awk '/pop3\[.*.User logged in/ {ip[$7]=0} END {for (address in ip)
{ print address} }' maillog
这工作得很好,但一如既往,并非所有日志条目都是相同的,例如有时 IP 会移至第 8 个字段,如下所示:
Nov 15 10:42:40 hostname pop3[2232]: login: hostname.domain.com [20.20.20.20]
username plaintext User logged in
使用 awk 捕获这些条目的最佳方法是什么?
一如既往地感谢您提前做出的所有精彩回复,您已经教会了我很多东西:)
最佳答案
AWK代码
只要匹配你的ip格式...注意没有其他格式...
/pop3\[.*.User logged in/ {
where = match($0,/\[[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)
if (where)
ip[substr($0,RSTART+1,RLENGTH-1)]=0
}
END {for (address in ip)
{ print address} }
运行于ideone
关于regex - awk 解析邮件日志中的唯一 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200392/