6

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

miss rate 0.21  
ipc 222  
stalls n shdmem 112

所以说我只想提取miss rateis的数据0.21。我如何使用 grep 或 sed 执行此操作?另外,我需要多个数字,而不仅仅是miss rate. 也就是说,我可能想要同时获得0.21112。示例输出可能如下所示:

0.21 222 112

因为我需要稍后绘制的数据。

4

6 回答 6

7

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

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

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

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

sed -n 's#miss rate ##p' file
于 2013-03-12T20:43:21.073 回答
5

改用awk

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

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

grep -Po '(?<=miss rate ).*' yourfile
于 2013-03-12T20:35:50.230 回答
4

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

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

或使用

perl -lne 'print $& if /miss rate \K.*/' file.txt
于 2013-03-12T21:03:59.547 回答
4

-and-grep解决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 中)

于 2013-03-12T22:05:17.483 回答
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
于 2013-03-12T20:36:11.653 回答
0

我相信

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

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

于 2013-03-13T00:01:12.803 回答