linuxgrep-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仅获得结果。
回答
$ file='file1'
$ grep -m1 -oP 'w+(?= +'"$file"'$)' a.file
274efcc4d8a0e8f61397be46bd4bfa37
(?=regexp)是一个积极的前瞻结构,可帮助您定义断言,而无需将其作为匹配部分的一部分。请参阅参考资料 - 这个正则表达式是什么意思?有关环视的更多信息。
我还将'w+(?= +'and 和"$file"and放在'$)'一起,以便只有 shell 变量在双引号下。该$锚在这里用来避免部分匹配,例如file1VSfile1a或file11。如果您的文件名可以包含正则表达式元字符(例如:).,那么您需要使用'w+(?= +Q'"$file"'E$)'来逐字匹配文件名。
不知道你为什么不想在awk这里使用,它非常适合这个任务。字符串比较可以派上用场,以避免必须处理正则表达式转义。
awk -v f="$file" '$2==f{print $1; exit}'