需求类似于regex匹配时可以指定匹配里某局部匹配为一个组(group),并得到该匹配组的输出。举例,文件里存在如下行:
for asnId: 14807053913 and asnUniqueContainerId: 53b659349265a4554246a6b94ad00752-1@2 but container not found
我要以”but container not found“得到所有匹配行,并且得到这些匹配行中的”asnId: "后面的ID值,并且保证输出唯一。
那么如果你的grep是GNU2.5以上,可以使用如下命令做到这件事:
grep "but container not found" application* | grep -oP 'asnId: \K\d+(?= )' | sort --unique
第一个grep过滤出所有符合要求的行,第二个grep用regex格式得到匹配组,sort可以保证输出的匹配值是唯一的。至于\K还有( ?=)的意思可以参考这里:https://unix.stackexchange.com/questions/13466/can-grep-output-only-specified-groupings-that-match