如何使用grep提取多个组

时间:2014-10-15 12:12:02

标签: regex grep pcre

说我有这个文件data.txt

a=0,b=3,c=5
a=2,b=0,c=4
a=3,b=6,c=7

我想使用grep提取与ac的值对应的2列:

0 5
2 4
3 7

我知道如何分别提取每个列:

grep -oP 'a=\K([0-9]+)' data.txt
0
2
3

grep -oP 'c=\K([0-9]+)' data.txt
5
4
7

但我无法弄清楚如何提取这两组。我尝试了以下,但没有用:

grep -oP 'a=\K([0-9]+),.+c=\K([0-9]+)' data.txt
5
4
7

3 个答案:

答案 0 :(得分:5)

您可以尝试以下grep命令。但请注意,grep会在单独的新行中显示每个匹配项。所以你不会得到你在问题中提到的格式。

$ grep -oP 'a=\K([0-9]+)|c=\K([0-9]+)' file
0
5
2
4
3
7

要获得上述格式,您需要将grep的输出传递给paste或任何其他命令。

$ grep -oP 'a=\K([0-9]+)|c=\K([0-9]+)' file | paste -d' ' - -
0 5
2 4
3 7

答案 1 :(得分:4)

我也很好奇grep能够这样做。 \K“删除”以前存储的内容,因此您不能在同一个表达式中使用它两次:它只显示最后一个组。因此,它应该以不同的方式完成。

同时,我会使用sed

sed -r 's/^a=([0-9]+).*c=([0-9]+)$/\1 \2/' file

它会在a=c=之后捕获数字,只要在以a=开头并且在c=digits之后不包含任何其他内容的行发生这种情况。

对于您的输入,它会返回:

0 5
2 4
3 7

答案 2 :(得分:0)

使用它:

awk -F[=,] '{print $2" "$6}' data.txt 

我将分隔符用作=,,然后拆分它们