我有一个文件,其中包含类似这样的条目
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
每次找到这样的一行,我想提取与 rip 部分关联的 IP,但我想提取至少显示 3 次的 IP。
我正在尝试使用 grep 来做到这一点。
这是我的 grep
more /var/log/maillog-20130217 | grep "auth failed" | grep -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4
][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
这个 grep 显示匹配行中的所有 IP
如果我至少有 3 条与该 IP 匹配的行并且只有唯一的 IP,如何限制此 grep 只显示 IP?
我的意思是这个。假设我的日志有这个
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=20.20.20.20, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<[email protected]>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
我想使用 grep 并获取 200.250.9.210,因为我有 3 行包含此 IP,但不是仅出现一次的 20.20.20.20。
当我运行 grep 时我得到的是这个
200.250.9.210
200.250.9.210
20.20.20.20
200.250.9.210
或者换句话说,它列出了匹配行中的所有 IP。
谢谢。
答案1
sed < mail.log -n 's/.*auth failed.*rip=\([^,]*\).*/\1/p' |
sort |
uniq -c |
awk '$1 >= 3' |
sort -rn
将为您提供匹配的 IP 地址及其出现次数(按出现次数排序)。
答案2
可能就这么简单:
grep "whatever" "$file" | sort | {
LAST=""
counter=0
while read -r LINE; do
if [ x"$LINE" = x"$LAST" ]; then
if [ 3 -eq "$((counter+=1))" ]; then
echo "$LINE present more that 4 times"
fi
else
counter=0
LAST="$LINE"
fi
done
}