使用Awk匹配日期时间戳

时间:2017-01-26 15:49:15

标签: regex awk

我在第二栏的日志文件中输入时间戳,格式为HH:MM:SS:mmm

例如摘录

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匹配所有条目,但这似乎不起作用。为什么它不起作用?我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:1)

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

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,例如"哦,我真是个傻瓜!"。