我如何计算文件中的行数

我如何计算文件中的行数

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

相关内容