[英]how awk print the regex it maps?
这是文件内容:
# cat text
16:10:29 DEBUG MY_Output:90 1 5de0d275c2f55: send response
当我用awk
做正则表达式映射时:
# cat text | awk '{if($0~/[0-9]{2}:[0-9]{2}:[0-9]{2}.*/) print $0}'
(print nothing)
# cat text | awk '/[0-9]{2}:[0-9]{2}:[0-9]{2}.*/ {print $0}'
(print nothing)
# cat text | awk '/[0-9]{2}:[0-9]{2}:[0-9]{2}.*/1'
16:10:29 DEBUG MY_Output:90 1 5de0d275c2f55: send response
我的问题是:为什么{if($0~/[0-9]{2}:[0-9]{2}:[0-9]{2}.*/) print $0}
, /[0-9]{2}:[0-9]{2}:[0-9]{2}.*/ {print $0}
什么都不打印,但是/[0-9]{2}:[0-9]{2}:[0-9]{2}.*/1
打印结果。
正如我所料,这三个表达式具有相同的含义,正如[1]所描述的那样, 1
、 {print}
、 {print $0}
执行相同的操作。
还有另一个可能检查的实验:
# awk '{if(/[0-9]{2}:[0-9]{2}:[0-9]{2}/) print $0}' <<< "16:10:29"
(print nothing)
# awk '/[0-9]{2}:[0-9]{2}:[0-9]{2}/{print $0}' <<< "16:10:29"
(print nothing)
# awk '/[0-9]{2}:[0-9]{2}:[0-9]{2}/1' <<< "16:10:29"
16:10:29
非常感谢。
在知道 OP 的awk
版本(在评论部分)之后,它看起来像是旧版本,所以它不支持[0-9]{2}
(我相信是这样),所以你可以尝试一次以下命令。
awk '/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/' Input_file
这应该适用于您提供的awk
版本。
此外,对于旧版本的awk
您可以使用--re-interval
使其工作,我没有那个版本,因此无法对其进行测试。
awk --re-interval '/[0-9]{2}:[0-9]{2}:[0-9]{2}/' Input_file
在旧版本的awk
,我们需要在awk
代码中包含--re-interval
来调用 ERE,因此它--re-interval
用于普通的awk
代码。
注意:在新版本的gawk
--re-interval
已贬值,因为 OP 具有旧版本的awk
因此在解决方案中提到了它。 根据 OP 的评论,添加跨站点参考链接https://unix.stackexchange.com/questions/354553/awk-repetition-n-is-not-working 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.