Awk
Apache 日誌:每天使用 sed 或 awk 有多少個不同的 IP?
給定這樣的文件
/var/log/apache2/other_vhosts_access.log
:example.com:443 1.1.1.1 - - [25/Jan/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm12 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel... example.com:443 1.1.1.1 - - [25/Jan/2021:12:10:00 +0000] "GET /abc/def/ghi?token=jklm12 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel... example.com:443 2.2.2.2 - - [25/Jan/2021:12:20:00 +0000] "GET /abc/def/ghi?token=jklm13 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel... ... example.com:443 33.33.33.33 - - [12/Apr/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm14 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel... example.com:443 4.4.4.4 - - [13/Apr/2021:12:00:00 +0000] "GET /abc/def/ghi?token=jklm12 HTTP/1.1" 200 1000 "-" "Mozilla/5.0 (Macintosh; Intel...
如何每天獲取(或計算)不同的IP?
例子:
25/Jan/2021 1.1.1.1 2.2.2.2 12/Apr/2021 33.33.33.33 13/Apr/2021 4.4.4.4
或者
25/Jan/2021 2 12/Apr/2021 1 13/Apr/2021 1
“按天分組”怎麼辦?
<infile awk -F'[[ :]' '{ dt[$7]=(dt[$7]==""?"":dt[$7]) (!seen[$7,$3]++?"\t" $3:ORS) } END{ for(d in dt)print d ORS dt[d] }'
(dt[$7]==""?"":dt[$7])
如果不為空,則列印數組dt的先前內容。如果之前沒有看到該DTAE
(!seen[$7,$3]++?"\t" $3:ORS)
($7),則列印IP ($3)(帶有 Tab 前綴),否則列印換行符(預設 ORS)。即
dt[$7]= ...
使用上述結果的值更新每個 DATE($7) 的內容。25/Jan/2021 1.1.1.1 2.2.2.2 13/Apr/2021 4.4.4.4 12/Apr/2021 33.33.33.33
對輸出進行排序(輸入數據必須按日期排序,最有可能的日誌更經常根據日期排序):
<infile awk -F'[[ :]' '{ dt[$7]=(dt[$7]==""?"\0"NR"-" $7 ORS:dt[$7]) (!seen[$7,$3]++?"\t" $3:ORS) } END{ for(d in dt) print dt[d] }' |sort -z |cut -z -d'-' -f2-
或使用 GNU awk 對數組進行排序選項:
<infile awk -F'[[ :]' '!date[$7]++{ ind++ } { dt[ind]=(dt[ind]==""?$7 ORS:dt[ind]) (!seen[$7,$3]++?"\t" $3:ORS) } END{ PROCINFO["sorted_in"]="@ind_num_asc"; for(d in dt) print dt[d] }'
25/Jan/2021 1.1.1.1 2.2.2.2 12/Apr/2021 33.33.33.33 13/Apr/2021 4.4.4.4