将两个 grep 合并为一个

将两个 grep 合并为一个

我需要从另一个命令的输出中提取 ID。目前我的提取命令如下所示:

someID=$(command | grep -oP '(?:^Successfully\sbuilt\s)([\da-z]{12}$)' | grep -oP '([a-z\d]{12})')

命令输出示例:

 ---> Using cache
 ---> 9b4624927fa6
Successfully built 9b4624927fa6

预期结果:

9b4624927fa6

从行中提取的 ID

Successfully built 9b4624927fa6

如何将这两个 grep 语句合并为一个?

答案1

对我的第一个作品稍作修改grep

$ grep -oP '^Successfully\sbuilt\s\K[\da-z]{12}$' example-output
9b4624927fa6

\K在PCRE中重置比赛开始:

转义序列\K导致任何先前匹配的字符不包含在最终匹配序列中。

它类似于零宽度正后向断言 (?<=Successfully...)。

答案2

要获取以 开头的行末尾的十六进制数字Successfully built,我可能会使用sed

sed -n -E 's/^Successfully built ([[:xdigit:]]+)$/\1/p'

这将用散列替换匹配的行并打印它(而不是其他行)。

或者awk

awk '/^Successfully built [[:xdigit:]]+$/ { print $NF }'

这将打印与正则表达式匹配的每行的最后一个空格分隔的字段。

在这两个正则表达式中,[[:xdigit:]]+表达式将匹配十六进制数字的非空字符串。

相关内容