【问题标题】:Matching date timestamp using Awk使用 awk 匹配日期时间戳
【发布时间】:2017-01-26 15:49:14
【问题描述】:

我在第二列的日志文件中有时间戳条目,格式为 HH:MM:SS:mmm

例如sn-p

15-01-2017 21:15:10:266
15-01-2017 21:15:10:389
15-01-2017 21:15:15:266
15-01-2017 21:15:12:124
15-01-2017 21:15:12:266
15-01-2017 21:15:15:266
15-01-2017 21:15:20:266

我在努力

awk '$2 == "21:15:[0-9]{2}:[0-9]{3}"' 

在 21:15 匹配所有条目,但这似乎不起作用。为什么它不起作用?我怎样才能让它发挥作用?

【问题讨论】:

    标签: regex awk


    【解决方案1】:

    您正在使用$2 == regexp。但是要检查awk 中的正则表达式,您需要使用~,否则== 会逐字检查字符串:

    awk '$2 ~ /^21:15:[0-9]{2}:[0-9]{3}/' file
    

    这会返回:

    15-01-2017 21:15:10:266
    15-01-2017 21:15:10:389
    15-01-2017 21:15:15:266
    15-01-2017 21:15:12:124
    15-01-2017 21:15:12:266
    15-01-2017 21:15:15:266
    15-01-2017 21:15:20:266
    

    来自GNU awk user's guide on 3.1 How to Use Regular Expressions

    正则表达式也可以用于匹配表达式。这些表达式允许您指定要匹配的字符串;它不必是整个当前输入记录。两个运算符“~”和“!~”执行正则表达式比较。使用这些运算符的表达式可用作模式,或用于 if、while、for 和 do 语句。 (请参阅语句。)例如,如果表达式 exp(作为字符串)匹配 regexp,则以下情况为真:

    exp ~ /regexp/
    

    同样来自6.3.2.2 Comparison Operators

    字符串比较和正则表达式比较是非常不同的。例如:

    x == "foo"
    

    的值为 1,或者如果变量 x 恰好是“foo”则为真。相比之下:

    x ~ /foo/
    

    如果 x 包含“foo”,则值为 1,例如“哦,我真是个傻瓜!”。

    【讨论】:

    • 好吧,你的意思是 $n == (其中 n 是一列)只能用于匹配确切的字符串/值?
    • @user3369871 完全正确。请参阅我的编辑并提供更多参考。
    • 我明白了,据说不应该有类似 exp == / regex/ 的东西,它必须始终是 exp ~ /regex/ 的语法?
    • @user3369871 是的。我认为这是有道理的,所以当您使用 == 时,awk 不必加载正则表达式解释器并坚持文字,因此更加敏捷。
    • :ok 那么这是否也意味着动态正则表达式不能用于 awk 列搜索?
    猜你喜欢
    • 2014-02-13
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多