我有一个我要解析的ps ax
列表中的表达式:
183838 ? myprocess -uuid 0f6309e3-bee2-4747-b76d-7aaf4d0f074e serial=802e7fd9-a2ab-e411-8000-001e67ca95b2
我想匹配进程ID(183838
)和uuid表达式(0f6309e3-bee2-4747-b76d-7aaf4d0f074e
)。
我有两个匹配它们的正则表达式:
# PID
([0-9]*)
# UUID
(?<=uuid).([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})
但我无法找到如何将它们组合在一起,以便将结果与sed
:
183838 0f6309e3-bee2-4747-b76d-7aaf4d0f074e
awk
不是一个选项,因为它必须与列号无关。
答案 0 :(得分:2)
您可以在两个正则表达式之间的正则表达式中使用|
或运算符来组合它们。
答案 1 :(得分:0)
Bash使用POSIX ERE,你有一个带有lookbehind的PCRE。如果您需要PCRE,grep -P
是一个选项,与-o
结合使用,可以选择只匹配匹配行的匹配部分:
$ ps ax | grep -oP '(^[0-9]+)|(?<=uuid )([-0-9a-f]{36})' | paste -sd' '
183838 0f6309e3-bee2-4747-b76d-7aaf4d0f074e
(我们在这里将多行与paste
组合在一起。)
答案 2 :(得分:0)
您可以与捕获群组进行此类匹配。它们由sed中的\(
和\)
括起来。在替换中,\1
被替换为与第一个捕获组的内容匹配的任何内容,依此类推。
所以翻译你的输入字符串:
$ ps ax | grep -- '-uuid' | sed 's/\([0-9]*\).* -uuid \([0-9a-f-]*\).*/\1 \2/'
183838 0f6309e3-bee2-4747-b76d-7aaf4d0f074
我已经使用了&#34; -uuid&#34;作为定位弦的正确部分的锚点,为uuid本身提供更短更松弛的图案。但是你可以根据自己的要求进行调整。