Sed 匹配模式后的grep,但不包括期间

Sed 匹配模式后的grep,但不包括期间,sed,grep,matching,Sed,Grep,Matching,我有以下示例字符串: Program exiting with code: 0. Program exiting with code: 1. Program exiting with code: 10. 我希望grep在匹配模式“程序带代码退出:”后返回值。然而,我不需要最后的句号。我试过: grep "Program exiting with exit code:" dataload.log | sed 's/^.*.: //' 上述命令返回: 0. 1. 10. 我想忽略结尾的句号。我

我有以下示例字符串:

Program exiting with code: 0.
Program exiting with code: 1.
Program exiting with code: 10.
我希望grep在匹配模式“程序带代码退出:”后返回值。然而,我不需要最后的句号。我试过:

grep "Program exiting with exit code:" dataload.log | sed 's/^.*.: //'
上述命令返回:

0.
1.
10.
我想忽略结尾的句号。我从某处收到了上面的命令

有人能描述一下每个关键字代表什么,并给我提供一个正则表达式,它只给我提供不带句号的值吗

sed
awk
perl
或任何其他方式对我都合适

sed 's/^.*.: //'
首先,这是一个替换正则表达式,如开头的
s
所示。第一个
/
中的部分是要匹配的部分,第二个
/
中的部分是要替换的部分

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

可在此处找到其含义的完整列表:

比赛的意思是:

^
-在行首

-匹配任何字符

*
-任意次数

-匹配任何字符

-匹配冒号

-匹配空格

然后这些都被什么都没有取代了。这就是为什么保留结尾处的句点,因为它删除了所有直到
程序以代码退出时的内容:
,剩下
1。

使用交互式工具测试字符串上的不同正则表达式是值得的,例如


您可能只需替换/删除本例中不是数字的所有内容:
's/[^0-9]//g'

只需使用grep并向后查看,只捕获数字:

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

$grep-Po'(?如果您使用
cut
命令扩展它,您的解决方案就很好了:

grep”程序正在退出,代码为:“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
最后的数字。

很好,你可以解释为什么它不起作用。但是,建议的方法有点脆弱,因为它不检查数字是否应该在
程序退出后的代码:
。有很多方法可以做到。而且,如果所有输出与给定的示例不匹配。下面是另一个匹配组的解决方案:
sed的/程序退出时使用代码:\([0-9]*\)\。/\1/“
还有另一个问题:不以
程序退出…
开头的行将保持不变。@AdamTaylor,感谢您的详细解释。regex的/[^0-9]//g'对我来说很好,并且按照我当前的要求很好,因为这就是字符串在我的文件中始终存在的方式。谢谢投票否决它的目的是什么?我刚刚指出了OP自己的解决方案并对其进行了扩展。这就是我的工作片段在使用@AdamTaylor@Ki提供的解决方案后的样子ranSavadatti它与GNU grep和您提供的输入一起工作。用您使用的grep版本的描述更新您的问题。