linux - 使用格式化输出按条件选择行

标签 linux awk sed grep

In additional for my question

日志示例:

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"
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"
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"

使用以下命令

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

我可以得到每个 IP 的计数和分组结果,每个 IP 的参数 cosist per_page >= 100:

12.12.12.12 1
10.10.10.10 3

我如何修改它以使用 per_page 参数值输出?例如(任何格式):

12.12.12.12 - per_page-500 - 1
10.10.10.10 - per_page-100 - 2
10.10.10.10 - per_page-500 - 1

最佳答案

awk 助您一臂之力!

$ awk --re-interval -v OFS=' - ' '
     match($0,/per_page=[0-9]{3}/){cnt[$1 OFS substr($0, RSTART,RLENGTH)]++}
                               END{for (ip in cnt) print ip, cnt[ip]}' file

12.12.12.12 - per_page=500 - 1
10.10.10.10 - per_page=500 - 1
10.10.10.10 - per_page=100 - 2

关于linux - 使用格式化输出按条件选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36157629/

相关文章:

mysql - 无法查询总和并将该总和与 mysql 查询中的另一个总计进行比较

Java 版本给我一个 "no such file or directory"

python - 每天下午 5 点(东部标准时间)运行 cron 脚本

string - 使用映射文件替换文件中的多个字符串

unix - 在 UNIX 中的 sed 命令中使用否定

regex - sed regex 到非贪婪替换?

python - 将 Netcat 流写入带有附加文本的文件

linux - 在 bash 中按日期字段对日志进行排序

linux - 无法使用 awk 提取 fastboot 命令

sed - 将新行视为另一个字符的 grep/sed 的替代方案