regex - awk 解析邮件日志中的唯一 IP 地址

标签 regex bash awk

昨天我在这里问了一个关于 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/

相关文章:

Python:如何在使用正则表达式时跳过有多余字符的行?

java - 空格分隔字符串java所需的正则表达式

linux - 从 Linux 命令行处理复杂的 CSV

javascript - 如何使用 JavaScript 匹配网页上不在 <a> 及其 href 中的关键字?

regex - Bash 引用行为和 sed

linux - 批量解压到文件夹路径

linux - bash脚本测试字符串上多个参数的条件

java - 在 groovy 运行过程中,命令在文件 arg 中包含空格而失败

regex - 如何删除ubuntu双引号中的“字符?

AWK - 更改第二个日期