我試圖創建一個命令,以允許我通過 Linux 命令列查看前 10 個主機/IP(在 access.log 中),2019-07-10 00:00:00從2019-07-19 23:59:59. 我使用以下方法獲得了前 10 個 IP 的第一個作業 IE
awk '{ print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
只是想弄清楚如何應用上述持續時間。任何幫助都會很棒。
uj5u.com熱心網友回復:
可以告訴 GNU 版本的 awk,gawk,以特定順序回圈通過關聯的陣列。下面,使用 val_num_desc,我要求 awk 使用該值作為排序鍵,將其解釋為數字,并按降序排序。
gawk -F' ' 'BEGIN {PROCINFO["sorted_in"] = "@val_num_desc"} \
/2019-07-10 00:00:00/,/2019-07-19 23:59:59/ {hosts[$1] } \
END {for (host in hosts) {if (count == 10){exit 1} \
printf("%s %s\n", host,hosts[host])}}' \
access.log
/FROM/,/TO/ 模式依賴于檔案中存在的 00:00:00 和 23:59:59。
給定一個虛構的檔案,例如 /tmp/access.log:
$ cat /tmp/access.log
192.168.1.2 2019-07-09 23:00:00
192.168.1.2 2019-07-09 23:41:00
192.168.1.2 2019-07-09 23:58:00
192.168.1.5 2019-07-10 00:00:00
192.168.1.1 2019-07-10 00:34:00
192.168.1.1 2019-07-10 00:42:00
192.168.1.2 2019-07-10 00:59:00
192.168.1.2 2019-07-10 01:02:00
192.168.1.2 2019-07-10 01:12:00
192.168.1.2 2019-07-10 01:00:00
192.168.1.3 2019-07-10 02:00:00
192.168.1.3 2019-07-10 03:00:00
192.168.1.3 2019-07-10 04:00:00
192.168.1.3 2019-07-10 05:00:00
192.168.1.1 2019-07-10 06:00:00
192.168.1.1 2019-07-19 01:00:00
192.168.1.6 2019-07-19 23:59:59
192.168.1.6 2019-07-20 02:00:00
192.168.1.6 2019-07-20 04:00:00
$ gawk -F' ' 'BEGIN {PROCINFO["sorted_in"] = "@val_num_desc"} \
/2019-07-10 00:00:00/,/2019-07-19 23:59:59/ {hosts[$1] } \
END {for (host in hosts) {if (count == 10){exit 1} \
printf("%s %s\n", host,hosts[host])}}' \
/tmp/access.log
192.168.1.3 4
192.168.1.2 4
192.168.1.1 4
192.168.1.6 1
192.168.1.5 1
$
或者使用@Coopsre 的初始命令作為起點,將行保持在包含范圍/from-pattern/,/to-pattern/ 內:
$ awk '/2019-07-10 00:00:00/,/2019-07-19 23:59:59/ { print $1}' /tmp/access.log | sort | uniq -c | sort -nr | head -n 10
4 192.168.1.3
4 192.168.1.2
4 192.168.1.1
1 192.168.1.6
1 192.168.1.5
$
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437129.html
