如何只在一行中grep第二个数字?

时间:2015-10-27 09:26:46

标签: regex linux bash shell unix

鉴于test.txt的内容如下:

Hello 10 love 20 haha 30
Hello Hello 11 love love 21 haha 31
41 Hello Hello 42 love love 43 haha 44

我想要某种grep表达式,以便在说:

之后
$ cat test.txt | grep ???

我得到了这个输出:

20
21
42

如何实现此功能?

2 个答案:

答案 0 :(得分:3)

好像你正试图获得第二个号码..

grep -oP '^\D*\d+\D*\K\d+' file

使用sed。

sed 's/^[^[:digit:]]*[[:digit:]]\+[^[:digit:]]*\([[:digit:]]\+\).*/\1/' file

DEMO

答案 1 :(得分:1)

您可能想要考虑的替代方法,使用awk:

awk -F'[^[:digit:]]+' '{ print /^[[:digit:]]/ ? $2 : $3 }' file

这会将字段分隔符设置为一个或多个非数字字符,这意味着您感兴趣的字段是第二个或第三个字段,具体取决于该行是否以数字开头。

为简洁起见,您可能更愿意使用范围[0-9]而不是[[:digit:]]

awk -F'[^0-9]+' '{ print /^[0-9]/ ? $2 : $3 }' file

或者您可以使用perl捕获您感兴趣的行的部分:

perl -lne 'print $1 if /\d\D+(\d+)/' file

\d匹配数字,\D匹配非数字,因此这将捕获该行上找到的第二组数字。如果未找到第二组数字,则不会打印任何内容(这与awk脚本的行为不同)。