首页 > 解决方案 > linux grep -oP 如何仅打印模式

问题描述

# cat a.file
123123abc file2
274efcc4d8a0e8f61397be46bd4bfa37  file1
321  file1

# file="file1"
# grep -m 1 -oP "\K([\w]+) +$file" a.file
274efcc4d8a0e8f61397be46bd4bfa37  file1

如何274efcc4d8a0e8f61397be46bd4bfa37使用参数file1行获取输出,并且只使用grep没有|或其他命令的命令awk

是否有grep -P一些其他参数仅用于打印匹配模式\K([\w]+),例如结果是274efcc4d8a0e8f61397be46bd4bfa37?或者是否有任何实现来获得结果grep

标签: regexlinuxgreppcre

解决方案


$ file='file1'
$ grep -m1 -oP '\w+(?= +'"$file"'$)' a.file
274efcc4d8a0e8f61397be46bd4bfa37

(?=regexp)是一个积极的前瞻结构,它可以帮助您定义一个断言,而不会将它作为匹配部分的一部分。请参阅参考资料 - 这个正则表达式是什么意思?有关环视的更多信息。

我还把 and 和 and 放在'\w+(?= +'一起"$file"'$)'这样只有 shell 变量在双引号下。此处使用$锚点来避免部分匹配,例如file1vsfile1afile11. 如果您的文件名可以包含正则表达式元字符(例如:).,那么您需要使用'\w+(?= +\Q'"$file"'\E$)'来匹配文件名的字面意思。


不知道你为什么不想在awk这里使用,它非常适合这个任务。字符串比较很方便,可以避免处理正则表达式转义。

awk -v f="$file" '$2==f{print $1; exit}'

推荐阅读