【问题标题】:Retrieve log pattern via awk通过 awk 检索日志模式
【发布时间】:2020-10-28 00:35:31
【问题描述】:

我想从以下日志中检索日期、5 URI 长度、ab 和 cde:

10.10.10.10 - - [26/Oct/2020:19:50:13 +0000] "GET /five/six/seven/eight/nine/en?from=1603738800&to=1603785600ncludedInRange=false HTTP/1.1" 200 255441 "-" "Opera com.test.super/1.10.4;11072 (Linux;Neon KNWWWfj;0,02.2)" "10.10.10.10""f799b6b9-747f-4f22-a1bf-4b7de885fc60""-" "-" "-" "-"ab=0.110 cde=0.102
11.1.1.1 - - [26/Oct/2020:19:50:14 +0000] "GET /one/two/three/four/five/en HTTP/1.1" 200 2832 "-" "Opera com.test.super/1.10.4;11072 (Linux;Neon KNWWWfj;0,02.2)" "11.1.1.1""19a8ee3c-9cb3-4ba6-9732-eb4923601e92""-" "-" "-" "-"ab=0.111 cde=0.112

例如

26/Oct/2020:19:50:13 /five/six/seven/eight/nine ab=0.110 cde=0.102

我已经尝试了以下命令,但我只得到了它的一部分。你能帮忙吗?

awk '{print $4 "\t" $7 "\t" $(NF-1),"\t",$NF}' |sed 's/"-"//g'

【问题讨论】:

标签: regex awk


【解决方案1】:
$ awk -F'[][[:space:]"]+' -v OFS='\t' '{match($7,"(/[^/]*){5}"); print $4, substr($7,1,RLENGTH), $(NF-1), $NF}' file
26/Oct/2020:19:50:13    /five/six/seven/eight/nine      ab=0.110        cde=0.102
26/Oct/2020:19:50:14    /one/two/three/four/five        ab=0.111        cde=0.112

【讨论】:

    【解决方案2】:

    基于@Ed Morton,但将 FS 设置为 5 个部分:

    $ awk -v FS='[[]|\\+[[:digit:]]+[]]|GET |/en|"+-"' '{print $2,$4,$NF}' file
    26/Oct/2020:19:50:13  /five/six/seven/eight/nine ab=0.110 cde=0.102
    26/Oct/2020:19:50:14  /one/two/three/four/five ab=0.111 cde=0.112
    
    

    已更新。 感谢@Ed Morton。

    【讨论】:

    • 在 shell 中,您应该始终在字符串和脚本周围使用单引号,除非您需要双引号来使 shell 解释它,例如用于通配符、文件名扩展、变量扩展等。如果您遵循该规则,它将使您的所有代码更加简洁和健壮。在这种情况下,您在 FS 声明中不需要那么多反斜杠 - 现在您要求 shell 解释 -v FS"..." 中的字符串,方法是用双引号括起来,然后转义其中的所有内容以停止shell 从解释它没有意义,只需执行 -v FS='...'-F'...'
    • 也没有理由将-" 放在括号表达式中或在动态正则表达式中转义/ - 它们都已经是文字字符了。所以如果代码是对还是错,我认为你只需要指定FS是-F '[[]|\+[[:digit:]]+[]]|GET |/en|"+-"'
    • @Ed Morton。是的,我明白了,但是是否有包含正确使用 awk 中正则表达式的语法特性的特定文档或指南?这会有所帮助。
    • awk 只是实现了 POSIX ERE,所以请参阅 POSIX 标准 pubs.opengroup.org/onlinepubs/9699919799/basedefs/…。 awk 确实允许计算正则表达式(由字符串和/或变量组成)以及文字正则表达式 - 这在 awk 标准和所有手册页中都有记录,这意味着您需要知道它被解析了两次,因此需要额外的转义。某些版本的 awk 对 POSIX 有较小的扩展,例如 \<\> 字边界或 \s/\S 速记,例如GNU awk,因此有关详细信息,请参阅该 awk 版本的手册页。否则没有特殊性。
    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 2014-07-22
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多