awk匹配时间戳

时间:2018-03-30 19:19:31

标签: regex awk

我正在尝试匹配awk中的时间戳。我有的正则表达式似乎在grep中工作,但不在awk中工作

示例数据:

12/21/17 20:11:57 data data data   #should match
12/21/17 20:12:18 data data data   #should match
12/21/17 20:12:20 data data data   #should match
12/21/2017 data data               #should not match

我的grep似乎有效:

grep -P "^(([0-9]{1,2}\/){2}[0-9]{2}\s([0-9]{1,2}:){2}[0- 9]{2})" file.txt   

但是,当我将同一个正则表达式复制到awk时,我的awk失败了。它基本上不会识别和超越。我试着用[[:blank:]]和[[:space:]]替换\ s而没有运气。

awk '$1 ~ /^(([0-9]{1,2}\/){2}[0-9]{2}\s([0-9]{1,2}:){2}[0-9]{2})/{if (p) print p; p=$0; next} p{p=p FS $0} END{print p}' file.txt

如果我删除\ s及其后面的代码(即只检测日期),它似乎可以正常工作

awk '$1 ~ /^(([0-9]{1,2}\/){2}[0-9]{2}\s)/{if (p) print p ; p=$0; next} p{p=p FS $0} END{print p}' file.txt

我错过了什么?

1 个答案:

答案 0 :(得分:2)

问题是这个条件:

$1 ~ /^(([0-9]{1,2}\/){2}[0-9]{2}\s([0-9]{1,2}:){2}[0-9]{2})/

当你在各个字段中匹配时,$1只是第一个字段。

您可以使用:

awk '/^(([0-9]{1,2}\/){2}[0-9]{2}\s([0-9]{1,2}:){2}[0-9]{2})/' file

但请注意,\s仅支持gnu-awk

要使其在非gnu awk上运行,请使用[[:blank:]]代替\s

awk '/^(([0-9]{1,2}\/){2}[0-9]{2}[[:blank:]]+([0-9]{1,2}:){2}[0-9]{2})/' file