【问题标题】:Select lines by condition and count with one line command按条件选择行并使用一行命令计数
【发布时间】:2016-03-21 14:39:15
【问题描述】:

我在分析 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

一个命令就可以搞定吗?

【问题讨论】:

    标签: linux awk sed grep


    【解决方案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》一书。

    【讨论】:

    • 那么您的真实输入文件未显示,或者您的 awk 已损坏或至少不是 POSIX。如果您需要帮助,那么只需声明 empty result :( 而无需感谢您尝试或任何明显尝试自己调试问题,更不用说实际尝试自己解决问题,这不是获得它的方法。
    • 这对我来说很奇怪 :) 我用我的第一个示例创建了一个示例文本文件并运行该命令。一切正常。然后我从真实日志文件中添加了一行并再次运行命令 - 一切正常!但是当我用真实文件运行这个命令时 - 它什么也没显示:(
    • 再说一句 - /per_page=[0-9]{3,}/ 应该更好
    • {3,} 在识别“至少 3 位数字”方面并不比 {3} 好,除非你在捕获组中使用它,但你不是,如果你需要 --posix启用 RE 间隔,那么您应该使用 --re-interval 来避免禁用所有其他有用的 gawk 功能,但更重要的是,您应该获得更新版本的 gawk,因为您使用的是一个非常旧的版本并且缺少很多有用的功能。
    • 还有一个问题 - 是否有任何解决方案可以通过正则表达式显示捕获的匹配?输出我想要的示例 - 10.10.10.10 - per_page=100 - 2, 12.12.12.12 - per_page=500 - 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-11-13
    • 2018-09-19
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多