Command-Line
列出帶有限制的摘要
我正在嘗試使用一行命令列出一些有問題的 IP,但不知道如何做最後一點,也許有人可以指出我正確的方向。
cat /var/log/syslog* | grep "SRC=" | cut -d " " -f 14 | sort | uniq -c | sort -n -r
在英語中……這應該列印所有系統日誌文件(也包括那些旋轉的),搜尋防火牆條目並獲取 SRC 值(IP),對它們進行計數並從高到低列出它們。我現在想要的只是將它限制在前 5 名……有人知道可以做到這一點的命令嗎?
syslog 中的範例條目:
1 月 11 日 12:01:52 xxxx 核心:
$$ 47261.722647 $$INPUT 數據包死亡: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 RES=0x00 SYN URGP=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
awk '/SRC=/ { print $13 }' /var/log/syslog* | sort | uniq -c | sort -n -r | head -n 5
這消除了原始管道中的 catting、grepping 和切割,並用
awk
. 最後head -n 5
的 將為您提供前五名的結果。
使用單個 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*