linux - 按条件选择行并用一行命令计数

标签 linux awk sed grep

我需要帮助分析 nginx 日志。日志样本:

10.10.10.10 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=100&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1"
10.10.10.10 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=500&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1"
11.11.11.11 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=10&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1"
12.12.12.12 - - [21/Mar/2016:00:00:00 +0000] "GET /example?page=&per_page=500&scopes= HTTP/1.1" 200 769 "-" "" "1.1.1.1"
13.13.13.13 - - [21/Mar/2016:00:00:00 +0000] "GET /example HTTP/1.1" 200 769 "-" "" "1.1.1.1"

是否可以通过 count 选择所有包含 per_page 参数且此参数等于或大于 100 的 uniq ip 地址?

因此,输出可以是任何格式:

10.10.10.10 - 2 # ip 10.10.10.10 was found twice
12.12.12.12 - 1

是否可以通过一个命令获取?

最佳答案

$ awk '/per_page=[0-9]{3}/{cnt[$1]++} END{for (ip in cnt) print ip, cnt[ip]}' file
12.12.12.12 1
10.10.10.10 2

这绝对是基本的 awk - 如果您打算在 UNIX 中处理任何其他文本文件,请阅读 Arnold Robbins 的 Effective Awk Programming, 4th Edition 一书。

关于linux - 按条件选择行并用一行命令计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134001/

相关文章:

linux - 我的内核模块如何在不使用 pci_get_device() 的情况下访问 PCI 设备?

linux - 如何在 Solaris 中使用 shell 脚本将时间设置为当前时间后 2 天?

java - 在 Linux 服务器 Java 上找不到 json 文件路径

linux - 将列表转换为双引号逗号分隔的字符串

perl - 删除行: after pattern1 and between pattern2 and pattern3 using awk/sed/perl

linux - tail -F 无中断

c - 没有任何非法访问的随机段错误

awk 用先前的非空列值 : 填充空列值

regex - sed one-liner 删除所有单个换行符?

linux - 从文本文件第一行的开头删除匹配的模式