我正在尝试使用awk来提取查询:已完成,已分配,已取消,已审核 , REVIEW ASSIGNED ,以及错误来自日志文件中的每一行。最终结果看起来接近:
COMPLETED
COMPLETED
UNASSIGNED
REVIEWED
ERROR
...
但是,我对彼此混淆的单词/短语有一些问题,特别是 REVIEW ASSIGNED 。我的任何陈述应该是 REVIEW ASSIGNED ,只是让他们分配。我的awk声明是:
awk '{for(i=1;i<=NF;i++){if($i~/^(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)$/){print $i}}}' myFile
我试图查找它,但我不熟悉awk并且没有找到任何具体的关于如何处理包含多个单词的表达式,考虑到它在空白区域分离。
答案 0 :(得分:2)
你是逐字段循环和匹配,但是空格分割了awk中的字段(默认情况下),因此该行中的任何字段都不会是REVIEW ASSIGNED
。
因此,不要匹配REVIEW ASSIGNED
,而是希望该行与ASSIGNED
测试相匹配。
停止循环字段,只需使用以下内容:
awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)/, a) {print a[0]}' myFile
Ed Morton指出match
的这种用法是特定的(因为它增加了对match
的第三个数组参数的支持)。不使用该功能的版本将如下所示
awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)/) {print substr($0, RSTART, RLENGTH)}' myFile
除了:
我认为Ed Morton指出这个正则表达式永远不会正确匹配UNASSIGNED
,因为ASSIGNED
将始终匹配,但是看起来awk的regexp引擎没有这个问题。但是,对于一个可以反转订单的引擎,可能会解决这个问题。
awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|UNASSIGNED|ASSIGNED|ERROR)/, a) {print a[0]}' myFile