![我如何计算文件中的行数](https://linux22.com/image/161458/%E6%88%91%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%A1%8C%E6%95%B0.png)
我需要计算文件中有多少次不同的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" "-"
答案1
尝试这个,
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}'
答案2
我可能有点疯狂,但如果你只想计数的话,这看起来很简单。
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