匹配模式后grep但排除句点

grep after matching pattern but exclude period

我有以下示例字符串:

Program exiting with code: 0.
Program exiting with code: 1.
Program exiting with code: 10.

我希望 grep 在匹配模式 "Program exiting with code:" 之后得到 return 个值。但是我最后不需要句号。我试过:

grep "Program exiting with exit code:" dataload.log | sed 's/^.*.: //'

上面的命令returns:

0.
1.
10.

我想忽略末尾的句号。我从某处获取了上述命令。

有人可以描述每个关键字代表什么,并为我提供一个只提供没有句号的值的正则表达式吗?

sedawkperl 或任何其他方式都适合我。

sed 's/^.*.: //'

首先,这是一个替换正则表达式,如开头的 s 所示。第一个 / / 中的部分是要匹配的内容,第二个 / / 中的部分是要替换的内容。

表达式的第一(匹配)部分的字符都是特殊的正则表达式字符。

可在此处找到完整的含义列表:http://www.rexegg.com/regex-quickstart.html

匹配的意思是:

^ - 在行首

. - 匹配任何字符

* - 任意次数

. - 匹配任何字符

: - 匹配冒号

</code>-匹配一个space</p> <p>然后就什么都没有了。这就是为什么要保留末尾的句点,因为它删除了 <code>Program exiting with code: 之前的所有内容,剩下 1.

值得尝试使用交互式工具来测试字符串上的不同正则表达式,例如http://www.regexr.com/

你可能只 substitute/remove 你的情况下所有不是数字的东西:'s/[^0-9]//g'.

只需使用 grep 进行回顾并仅捕获数字:

$ grep -Po '(?<=Program exiting with code: )\d*' file
0
1
10

如果您使用 cut 命令扩展它,您的解决方案就很好:

grep "Program exiting with code:" dataload.log | sed 's/^.*.: //' | cut -d"." -f1

这是另一种方式:

grep -oE 'Program exiting with code:\s*[0-9]+' dataload.log |grep -oE '[0-9]+$'

第一个 grep 命令的输出是:

Program exiting with code: 0
Program exiting with code: 1
Program exiting with code: 10

那么你只需要 grep 最后的数字。