我正在尝试匹配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
我错过了什么?
答案 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