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

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

我有一个文件,其中包含类似这样的条目

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
}

相关内容