如何在awk中使用正则表达式校验文件日期列并排查代码问题
awk日期列校验代码问题修正
原代码存在的问题
- 语法结构错误:
BEGIN代码块未被正确包裹在awk执行语句的引号内,且块定义缺少外层大括号,awk无法正常解析初始化逻辑。 - 正则语法不兼容:原代码使用的
\d(匹配数字)、\z(匹配字符串结尾)属于PCRE正则语法,awk默认使用POSIX扩展正则,不识别上述写法。 - 分隔符匹配错误:正则中未转义的
.是通配符,可匹配任意字符,无法精准匹配时间部分的冒号分隔符,容易出现误匹配。 - 结尾锚定符错误:awk正则中匹配字段/行结尾需要用
$,而非PCRE语法的\z。
修正后可直接运行的代码
awk -F '|' 'BEGIN{OFS=FS} $1 ~ /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} [AP]M$/ {print $0}' file > file.out
匹配逻辑说明
正则严格匹配第一列的格式要求:
- 起始段为
月/日/年格式:月、日为1-2位数字,年为4位数字,段间用斜杠分隔- 日期后接空格,后跟
时:分:秒格式的时间:时、分、秒均为1-2位数字,段间用冒号分隔- 时间后接空格,以
AM或PM结尾,第一列无多余字符
运行上述代码处理提供的测试文件,会得到期望的输出结果:
04/21/2014 02:04:55 AM|34536 12/31/2021 03:29:15 AM|87612
内容的提问来源于stack exchange,提问作者Nadia Alice
相关产品推荐
相关产品推荐

