次の項目を含むファイルがあります。
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
}