Linux
我如何計算文件中的行數
我需要計算文件中有多少次不同的IP。
我正在使用它來打開文件,因為我無權
grep
僅使用grep
我的權利
User lotarc may run the following commands on herbert: (root) /bin/su - censored (root) /bin/su - censored (root) /bin/cat /var/log/nginx/access.log, /bin/cat /var/log/nginx/access.log.1, /bin/zcat /var/log/nginx/access.log.[0-9]*.gz, /bin/cat /var/log/nginx/error.log, /bin/cat /var/log/nginx/error.log.1, /bin/zcat /var/log/nginx/error.log.[0-9]*.gz
sudo cat /var/log/nginx/access.log.1 | grep -E '1ip|2ip|3ip'
我的問題是如何計算這個 ip 並獲得輸出。我需要從多個文件中計數,例如 access.log.2.gz
文件內容
some ip - - [30/Sep/2019:07:26:03 +0300] "POST /clientapp/request/signUp HTTP/1.1" 200 0 "-" "python-requests/2.22.0" "-"
試試這個,
cat access_log | awk '{a[$1]++} END {for(i in a) print a[i],i}' | sort -n | tail -n1
對於特定 IP:
cat access_log | awk '$1 == "192.168.1.37" || $1 == "192.168.1.110" {a[$1]++} END {for(i in a) print a[i],i}'
我可能不喜歡我的搖桿,但如果你只想要計數,這看起來很簡單。
awk '{print $1}' access.log |uniq |wc -l
這將從一個文件中輸出計數。如果你想要所有這些,你可以 zgrep 所有它們並使用可怕的 IP 地址正則表達式:
zgrep '\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)\.\(25[0-5]\|2[0-4][0-9]\|[01][0-9][0-9]\|[0-9][0-9]\)' access.log.*.gz | awk '{print $1}' | uniq |wc -l
當然,我敢打賭一些聰明的人可以給你一個更簡單的方法,但對我來說有點早,我只是把這個解決方案扔在那裡。在我執行 nginx 的網路伺服器上測試,它適用於我的 50 多個日誌文件。
根據 OP,如果您沒有 zgrep,則可以先通過 gzip 執行日誌文件…
OP 在另一條消息中指出,這對他有用。這也取自 msp9011 解決方案,因此請給予信任。
cat access.log | awk '{a[$1]++} END {for(i in a) print a[i],i}' |sort -nr
OP 想要列印超過 100 個請求的行的解決方案。我認為它可以在一個 awk 語句中完成,但我會以蠻力方式完成:
cat access.log | awk '{a[$1]++} END {for(i in a) print a[i],i}' |awk '$1>100' | sort -nr