如何使用正则表达式模式格式化grep的输出以匹配字符串和字符

时间:2016-11-18 06:13:18

标签: regex bash grep

我一直在研究一个bash脚本,它将一个字符串的出现从logFile转移到outputFile来监视它的频率。我想进一步过滤这个并使用该grep的结果然后格式化字符串的一部分作为我的最终结果。

目前我的grep如下所示,以获取我需要的logFile输出部分:

grep -n -A 1 "No entry for this particular code type" logFile.txt >> outputfile.txt

这将获得以该字符串开头的整行,并且看起来如下所示,代码类型的值不断变化: "此特定代码类型没有条目,代码类型:001123。"等

我想解析从grep输出的结果行,并且只检索字符串"代码类型:"之间的值。和角色"。"。 这将给我像001123

这样的值

我一直在寻找一个解决方案,我尝试过的任何事情都没有解决。任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用sed使用其他正则表达式拉出数字:

cat outputfile.txt | sed 's/.*code type: \(.*\)\./\1/'

\1引用表达式\(.*\)部分的内容(第一个match group)。

答案 1 :(得分:1)

您可以使用bash内置regEx支持来实现这一目标。 假设您在bash变量

中捕获了输出
$ myString="No entry for this particular code type, code type: 001123."
$ [[ $myString =~ code\ type:(.*). ]] && subString="${BASH_REMATCH[1]}"
$
$ printf "%s\n" "$subString"
001123

(或)如果您可以再次使用grep管道进行regEx捕获,请执行

$ <first_grep_command> | grep -Po "code type: \K.*(?=.)"
001123

其中-P标志仅支持perl样式正则表达式匹配,-o仅返回匹配字符串。

答案 2 :(得分:0)

这个直接在我的shell中工作:

echo "No entry for this particular code type, code type: 001123." |grep -Po '[0-9]*'

意味着这个可以在没有太多管道的情况下工作:

grep -Po '[0-9]*' logfile.txt >>outputfile.txt