使用 grep 显示匹配模式且至少出现 X 次的条目

Duc*_*uck 4 grep text-processing

我有一个文件,在其他行中包含这样的条目

Feb 16 17:30:18 ns1 dovecot: pop3-login: Disconnected (auth failed, 1 attempts in 17 secs): user=<accountin@myserver.com>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Run Code Online (Sandbox Code Playgroud)

每次找到这样的一行时,我都想提取与 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]?)' 
Run Code Online (Sandbox Code Playgroud)

此 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=<accountin@myserver.com>, 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=<accountin@myserver.com>, 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=<accountin@myserver.com>, 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=<accountin@myserver.com>, method=PLAIN, rip=200.250.9.210, lip=10.10.10.10, session=<Sed519rVnADI+gnS>
Run Code Online (Sandbox Code Playgroud)

我想使用 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
Run Code Online (Sandbox Code Playgroud)

或者换句话说,它列出了匹配行中的所有 IP。

谢谢。

Sté*_*las 5

sed < mail.log -n 's/.*auth failed.*rip=\([^,]*\).*/\1/p' |
  sort |
  uniq -c |
  awk '$1 >= 3' |
  sort -rn
Run Code Online (Sandbox Code Playgroud)

会给你匹配的 IP 地址,它们的出现次数按出现次数排序。