我正在嘗試從日志檔案中收集資訊。目前我想找到最流行的 ip 來源,特別是前 10 個包裹發件人。我的日志檔案如下所示:
Feb 24 21:32:17 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=67.24.151.60 DST=11.11.11.69 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=28482 DF PROTO=TCP SPT=3252 DPT=445 WINDOW=8760 RES=0x00 SYN URGP=0
Feb 24 21:32:17 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=67.24.151.60 DST=11.11.11.69 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=28534 DF PROTO=TCP SPT=3252 DPT=445 WINDOW=8760 RES=0x00 SYN URGP=0
Feb 24 21:32:18 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=67.24.151.60 DST=11.11.11.69 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=28575 DF PROTO=TCP SPT=3252 DPT=445 WINDOW=8760 RES=0x00 SYN URGP=0
Feb 24 21:33:19 bridge kernel: INBOUND UDP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=202.108.249.51 DST=11.11.11.100 LEN=404 TOS=0x00 PREC=0x00 TTL=114 ID=49546 PROTO=UDP SPT=1282 DPT=1434 LEN=384
Feb 24 21:33:54 bridge kernel: Legal Broadcast: IN=br0 PHYSIN=eth1 OUT=br0 PHYSOUT=eth0 SRC=11.11.11.67 DST=11.11.11.255 LEN=241 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=138 DPT=138 LEN=221
Feb 24 21:33:55 bridge kernel: Legal Broadcast: IN=br0 PHYSIN=eth1 OUT=br0 PHYSOUT=eth0 SRC=11.11.11.67 DST=11.11.11.255 LEN=232 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=138 DPT=138 LEN=212
Feb 24 21:35:11 bridge kernel: INBOUND UDP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=163.21.152.7 DST=11.11.11.67 LEN=69 TOS=0x00 PREC=0x00 TTL=45 ID=0 DF PROTO=UDP SPT=1812 DPT=1812 LEN=49
Feb 24 21:36:12 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=4.34.188.37 DST=11.11.11.125 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=16941 DF PROTO=TCP SPT=1649 DPT=445 WINDOW=16384 RES=0x00 SYN URGP=0
Feb 24 21:36:13 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=4.34.188.37 DST=11.11.11.125 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=17045 DF PROTO=TCP SPT=1649 DPT=445 WINDOW=16384 RES=0x00 SYN URGP=0
Feb 24 21:36:14 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=4.34.188.37 DST=11.11.11.125 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=17164 DF PROTO=TCP SPT=1649 DPT=445 WINDOW=16384 RES=0x00 SYN URGP=0
Feb 24 21:36:16 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 PHYSOUT=eth1 SRC=61.41.216.94 DST=11.11.11.80 LEN=48 TOS=0x00 PREC=0x00 TTL=109 ID=1309 DF PROTO=TCP SPT=3179 DPT=445 WINDOW=16384 RES=0x00 SYN URGP=0
我構建了這個腳本:
x=`grep "SRC=" $1 | cut -d " " -f13 | sed 's/\.[0-9]\ $//g' | sort -n | uniq -c | sort -n -r | head -n 10 `
echo "${x}"
但是,在我的日志檔案中,我有這個Legal Broadcast列搞砸了,因為我在剪輯時使用了“”分隔符。有沒有辦法使用字串作為剪切分隔符來過濾我的 ip srcs 而不是我目前使用的“”?
目前我的輸出是這樣的:
100398 PHYSOUT=eth1
12311 PHYSOUT=eth0
9454 SRC=11.11.11
8121 SRC=63.13.135
6394 SRC=127.0.0
它應該是,與 SRC 和它的 IP 一樣多的包。然而,Legal Broadcast 行似乎弄亂了頂部結果,顯示了之前列中的資訊。
uj5u.com熱心網友回復:
根據您提供的資訊,很難猜測究竟什么才是可接受的解決方案。對于您所描述的內容,一個簡單的解決方法是跳過包含“合法廣播”的任何行。
然而,無論如何,這些長序列幾乎總是更好地重構為單個 Awk 腳本。
awk '/SRC=/ && !/Legal Broadcast/ { ip=$13; sub(/\.[0-9]*$/, "", ip); sum[ip] }
END { for(net in sum) print sum[net], net }' "$1" |
sort -rn | head -n 10
如果您無法預測 SRC 欄位的位置,您可以替換其他所有內容:
awk '/SRC=/ && !/Legal Broadcast/ { ip=$0; sub(/.* SRC=/, "", ip); sub(/\.[0-9]( .*)?$/, "", ip); sum[ip] }
END { for(net in sum) print sum[net], net }' "$1" |
sort -rn | head -n 10
(!/Legal Broadcast/如果你也想包括這些行,顯然去掉條件。)
捕獲一個變數只是為了echo它是對記憶體的無用使用echo和(微小的)浪費。另請注意/g,sed僅當您希望一行包含多個匹配項時,標志 for才有意義(這對于您使用的正則運算式是不可能的)。
uj5u.com熱心網友回復:
您只需使用 GNU awk 即可完成所有操作:
gawk -F= -v RS=' ' 'BEGIN { PROCINFO["sorted_in"] = "@val_num_desc" }
$1 ~ /^(SRC|PHYSOUT)$/ { a[$1 FS $2] }
END { for (i in a) print a[i] "\t" i }' "$1"
uj5u.com熱心網友回復:
這可能是您要找的:
sed -n 's/.* SRC=\([^ ]*\)\..*/\1/p' "$1" | sort | uniq -c | sort -rn | head -n10
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395575.html
