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

时间:2016-03-21 14:39:16

标签: 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"

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

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

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

是否可以使用一个命令?

1 个答案:

答案 0 :(得分: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一书。