Awk

Apache 日誌:每天使用 sed 或 awk 有多少個不同的 IP?

  • April 28, 2021

給定這樣的文件/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

引用自:https://unix.stackexchange.com/questions/647125