Linux

我如何計算文件中的行數

  • September 30, 2019

我需要計算文件中有多少次不同的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

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