区分具有相似单词的查询

时间:2015-06-02 17:30:47

标签: regex bash awk

我正在尝试使用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并且没有找到任何具体的关于如何处理包含多个单词的表达式,考虑到它在空白区域分离。

1 个答案:

答案 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