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>

これらの行を見つけるたびに、リップ部分に関連する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を表示します。

そのIPに一致する行が3つ以上あり、一意のIPのみがある場合は、IPのみを表示するようにこのgrepをどのように制限しますか?

私の言葉はこれです。私のログにこのような内容があるとしましょう。

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>

このIPを含む行は3つありますが、一度だけ表示される20.20.20.20ではないので、grepを実行して200.250.9.210を取得したいと思います。

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
}

関連情報