如何获得每个作业的最后匹配行(awk)

时间:2017-05-24 13:37:58

标签: awk

我正在尝试提取每个作业的最后一行(例如,行中的2或6 /第一个数字),该行应包含文本' LOADER_PROCESSED_COUNT'。 使用下面的代码,我可以得到总字符串的最后一行,如下所示。但是,我需要打印每个作业的最后一行。

你能就此事向我提出建议吗?

@ code

awk  '/LOADER_PROCESSED_COUNT/ {a=$0} END{print a}'  tempResult 

@ Result

6/Loader.log/LOADER_PROCESSED_COUNT/99999

@输入文件(tempResult)

2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/100000
2/Loader.log/LOADER_COMPLETED
6/Loader.log/LOADER_START
6/Loader.log/LOADER_PROCESSED_COUNT/0
6/Loader.log/LOADER_PROCESSED_COUNT/0
6/Loader.log/LOADER_PROCESSED_COUNT/0
6/Loader.log/LOADER_PROCESSED_COUNT/95882
6/Loader.log/LOADER_PROCESSED_COUNT/99999
6/Loader.log/LOADER_PROCESSED_COUNT/99999

@预期结果

2/Loader.log/LOADER_PROCESSED_COUNT/100000
6/Loader.log/LOADER_PROCESSED_COUNT/99999

4 个答案:

答案 0 :(得分:1)

怎么样:

awk 'BEGIN{ FS = "/" } $0 ~ /LOADER_PROCESSED_COUNT/{ a[$1] = $0 }END{ for (i in a) print a[i] } file

输出:

6/Loader.log/LOADER_PROCESSED_COUNT/99999
2/Loader.log/LOADER_PROCESSED_COUNT/100000

答案 1 :(得分:1)

如果Loader.log部分也可以变量,则此行可能会有所帮助:

 awk '/LOADER_PROCESSED_COUNT/{t=$0;sub(/\/[^/]*$/,"",t);a[t]=$0} 
      END{for(x in a)print a[x]}' file

请注意,输出中的行顺序可能不会保留。

答案 2 :(得分:1)

使用tac/tac帮助您可以找到第一个实例并保留订单

tac file | 
awk -F'/' '/LOADER_PROCESSED_COUNT/ && !a[$1]++' | 
tac

2/Loader.log/LOADER_PROCESSED_COUNT/100000
6/Loader.log/LOADER_PROCESSED_COUNT/99999

答案 3 :(得分:1)

尝试:如果您的Input_file与显示的样本相同,并且ids(第一个字段)按顺序排列,那么以下内容也可以帮助您。

awk -F"/" '/LOADER_PROCESSED_COUNT/{VAL=$0;} VAR != $1 && VAR{print VAL} {VAR=$1} END{print VAL}'  Input_file

将字段分隔符设置为/然后查找字符串LOADER_PROCESSED_COUNT,如果是,则创建名为VAL的变量并在其中保存行的值。然后检查VAR不等于$ 1且VAR为NOT NULL的条件,然后打印名为VAL的变量。在每行读取结束时将变量VAL分配给$ 1,以便我们下次比较它。然后在END部分块中打印VAL的值。

相关问题