1行のコマンドで問題のあるIPリストを一覧表示しようとしていますが、最後の部分を実行する方法がわかりません。誰かが正しい方向を伝えることができます。
cat /var/log/syslog* | grep "SRC=" | cut -d " " -f 14 | sort | uniq -c | sort -n -r
英語で...これはすべてのsyslogファイル(また、回転したsyslogファイル)を印刷し、ファイアウォールエントリを検索し、SRC値(IP)を取得して計算し、最も高いものから低いものまでリストする必要があります。今私が望むのは最初の5つに制限することです。このタスクを実行できるコマンドを知っている人はいますか?
システムログのエントリの例:
1月11日 12:01:52 xxxx カーネル: [47261.722647] 無効な入力パケット: IN=eth0 OUT= MAC=44:8a:5b:a0:24:eb:00:31:46:0d:21:e8: 08 : 00 SRC=xx.xx.xx.xx DST=xx.xx.xx.xx LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=33840 PROTO=TCP SPT=1024 DPT=22151 WINDOW=1024 0x00 SYNURGP =0
このエントリは私のカスタムファイアウォールによって作成され、この質問の一部ではありません。
コマンド出力例:
47 SRC=13.82.59.79 2 SRC=77.72.82.145 2 SRC=213.157.51.11 2 SRC=159.203.72.216 1 SRC=77.72.85.15 1 SRC=77.72.85.10 1 SRC=77.72.83.238 1 SRC=77.221.1.237 1 SRC=222.186.172.43 1 SRC=216.170.126.109 1 SRC=191.101.167.253 1 SRC=190.198.183.234 1 SRC=173.254.247.206 1 SRC=164.52.13.58 1 SRC=141.212.122.145 1 SRC=125.78.165.42 1 SRC=118.139.177.119 1 SRC=111.75.222.141 1 SRC=103.30.40.9
答え1
awk '/SRC=/ { print $13 }' /var/log/syslog* | sort | uniq -c | sort -n -r | head -n 5
これにより、元のパイプラインからcatcat、grelpping、およびcutが削除され、最終的に上位5つの結果が得られますawk
。head -n 5
答え2
単一のGNUを使用するawk
「魔法」:
awk 'BEGIN{
PROCINFO["sorted_in"]="@val_num_desc"
}
/SRC=/{ src[$13]++ }
END{
for (k in src) {
print src[k], k;
if (++c > 4) break
}
}' /var/log/syslog*
答え3
以下のみを使用してください(またはperl
必要ありません)。grep
cut
sort
uniq
perl -lane '
$IPs{$F[12]}++ if (m/SRC=/); # perl arrays start from zero, not 1.
END {
foreach $ip (sort { $IPs{$b} <=> $IPs{$a} } keys %IPs) {
last if ($count++ > 4);
$seen=$IPs{$ip}; # $seen is only really needed in case you uncomment
# the next line, to use the key before we change it.
#$ip =~ s/^SRC=//; # uncomment if you want IPs without the SRC=
printf "%s\t%s\n", $seen, $ip;
};
}' < <(zcat /var/log/syslog*)
ハッシュ配列(%IPs
)を構築し、特定のIPアドレスを見るたびに数を数えます。すべての入力を読み取ったら、ハッシュを数で並べ替え、上位5つを印刷します。
ただし、これは通常、システムログと他のログファイルが定期的に循環して圧縮されるためではzcat
ありません。/var/log/syslog*