我需要从另一个命令的输出中提取 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:]]+
表达式将匹配十六进制数字的非空字符串。