如何仅使用grep / sed提取子string和数字

我有一个包含文本和数字的文本文件,我想使用grep来提取我需要的数字,例如给定一个文件如下:

miss rate 0.21 ipc 222 stalls n shdmem 112 

所以说我只想提取miss rate 0.21的数据。 我怎么用grep或sed来做? 另外,我需要不止一个号码,不仅是miss rate 。 也就是说,我可能想要同时得到0.21112 。 示例输出可能如下所示:

 0.21 222 112 

因为我需要以后的情节数据。

awk代替:

 awk '/^miss rate/ { print $3 }' yourfile 

要用grep来完成,你需要像GNU grep那样的非标准扩展,使用PCRE(-P),正向lookbehind(?<= ..)并且只匹配(-o):

 grep -Po '(?<=miss rate ).*' yourfile 

用grep的 pcre引擎使用特殊的正则表达式trick \ K :

 grep -oP 'miss rate \K.*' file.txt 

或者用perl :

 perl -lne 'print $& if /miss rate \K.*/' file.txt 

grep and- cut解决方案如下所示:

获得每个成功的grep使用的第三个字段:

 grep "^miss rate " yourfile | cut -d ' ' -f 3 

或得到第三场,其余的使用:

 grep "^miss rate " yourfile | cut -d ' ' -f 3- 

或者,如果您使用bash并且“错过率”只在您的文件中出现一次,您也可以执行:

 a=( $(grep -m 1 "miss rate" yourfile) ) echo ${a[2]} 

${a[2]}是你的结果。

如果出现“错过率”,那么只有当您只需要读取grep输出时,就可以循环读取。 (在bash中)

如果你真的只想使用grep,那么你可以尝试:

 grep "miss rate" file | grep -oe '\([0-9.]*\)' 

它将首先找到匹配的行,然后只输出数字。

不过,Sed可能会更具可读性:

 sed -n 's#miss rate ##p' file 

您可以使用:

 grep -P "miss rate \d+(\.\d+)?" file.txt 

要么:

 grep -E "miss rate [0-9]+(\.[0-9]+)?" 

这两个命令都会打印miss rate 0.21 。 如果只想提取数字,为什么不使用Perl,Sed或Awk?

如果你真的想避免这些,也许这会工作?

 grep -E "miss rate [0-9]+(\.[0-9]+)?" g | xargs basename | tail -n 1 

我相信

sed 's|[^0-9]*\([0-9\.]*\)|\1 |g' fiilename

会做的伎俩。 但是,如果没有问题的话,每个条目都会在自己的行上。 我确信有一种方法可以让sed生成一个逗号或空格分隔的列表,但我不是所有sed的超级主人。