我想解析邮件日志文件,它原来是这样的:
2018-10-23 23:27:51,026 INFO [ImapServer-4] [ip=10.10.11.50;oip=168.232.24.2;via=10.10.11.50(nginx/1.7.1);ua=Zimbra/8.8.7_GA_1964;cid=127325;] imap - authentication failed for [[email protected]] (invalid password)
对于关键字,可以是:“密码无效”或“验证失败”
目标是按“OIP”(原始 IP)或用户 MAIL 帐户对它们进行排序,以便在第一种情况下查看攻击 IP,在第二种情况下查看哪个用户帐户受到攻击。
这些应该是 2 个命令行(将它们合并到我的 bash 脚本中,以便更轻松地管理邮件服务器)。
我得到的结果是这样的:
cat /opt/zimbra/log/mailbox.log | grep "invalid password" | awk -F " " '{print $1 $2 $5 $11 }'
...但我被困在那里。我不知道如何从“oid=”双重解析攻击者 IP,并对结果进行一些“uniq”和“sort”。我试图得到这样的结果:
案例 1 - 显示攻击 IP,按无效登录次数排序:
37 1.2.3.4
16 3.4.5.6
8 6.7.8.9
案例 2 - 显示受到攻击的 MAIL 帐户,按无效登录次数排序:
128 [email protected]
37 [email protected]
6 [email protected]
然后,我将手动运行我的(上面)单行代码以进行更深入的分析,但为了进行概述,您能否帮助我使用 AWK 或 cut 或 sed 命令?
答案1
$ cat $$
2018-10-23 23:27:51,026 INFO [ImapServer-4] [ip=10.10.11.50;oip=168.232.24.2;via=10.10.11.50(nginx/1.7.1);ua=Zimbra/8.8.7_GA_1964;cid=127325;] imap - authentication failed for [[email protected]] (invalid password)
$ cat $$ | egrep '(authentication failed|invalid password)' | egrep -o "[[a-z]*@[a-z]*\.[a-z]*]" | sort | uniq -c
1 [[email protected]]
$ cat $$ | egrep '(authentication failed|invalid password)' | egrep -o "oip=[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | sort | uniq -c
1 oip=168.232.24.2
$
答案2
利用空间或者使用分号作为字段分隔符,你可以这样做
$ awk -F '[ ;]' '/authentication failed/ {print $7, $17}' file
oip=168.232.24.2 [[email protected]]
或者 perl
$ perl -lne '/authentication failed|invalid password/
and /oip=(.+?);.*for \[(.+?@.+?)\]/
and print "$1 $2"' file
168.232.24.2 [email protected]
使用其中任何一个,然后sort | uniq -c
输出