如何使用grep / sed提取子字符串和数字

时间:2013-03-12 20:27:47

标签: regex linux bash sed

我有一个包含文本和数字的文本文件,我想使用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

因为我需要数据以供以后绘图。

6 个答案:

答案 0 :(得分:4)

使用带有\K引擎的特殊环顾正则表达式技巧

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

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

答案 1 :(得分:4)

grep - 和 - cut解决方案如下:

获取每个成功使用grep的第3个字段:

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

或获得第3个字段,其余字段使用:

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

或者如果您使用bash并且“miss miss”仅在您的文件中出现一次,您也可以这样做:

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

其中${a[2]}是您的结果。

如果“未命中率”发生得更多,那么一旦你可以遍历grep输出只读取你需要的东西。 (在bash中)

答案 2 :(得分:3)

改为使用awk

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

要使用grep执行此操作,您需要非标准扩展,例如此处使用GNRE grep,使用PCRE(-P),具有正向lookbehind(?< = ..)并且仅匹配(-o):

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

答案 3 :(得分:3)

如果您确实想要仅使用grep,那么您可以尝试:

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

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

Sed可能更具可读性:

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

答案 4 :(得分:0)

您可以使用:

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

答案 5 :(得分:0)

我相信

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

会做到这一点。但是,如果可以的话,每个条目都将在它自己的行上。我确信sed有一种生成逗号或空格分隔列表的方法,但我不是所有sed的超级大师。