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アドレスと発生回数(発生基準でソート)が提供されます。

おすすめ記事