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

6
我是一名有用的助手,可以为您翻译文本。
我有一个包含文本和数字的文本文件,我想使用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

因为我需要这些数据以便之后绘图。

如果适用的话,我建议使用sed而不是grep。 - Daniel Williams
如果在这种情况下更优雅地工作,sed也是可以接受的。 - Hooloovoo
6个回答

7
如果你真的想只使用grep来完成这个任务,那么你可以尝试以下命令:
grep "miss rate" file | grep -oe '\([0-9.]*\)'

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

尽管如此,Sed可能更易读:

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

5

使用 awk 替代:

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

如果想要仅使用grep命令完成,可以通过一些非标准扩展实现,例如使用支持PCRE正则表达式的GNU grep中的正向环视(?<=..)和只匹配(-o)。

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

4

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

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

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

添加了 Perl 的可移植解决方案 =) - Gilles Quénot
\K技巧非常有用。是的,我更喜欢使用grep来完成这项任务,因为我不是awk方面的专家,而且awk存在一个问题,即单个字段中的文本可能具有多个和不同数量的空格,例如'miss rate XX'和'stalls total number XXX'。 - Hooloovoo

4

grepcut的解决方案如下:

要获取每个成功的grep的第三个字段,请使用:

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

如果要获取第三个字段及其后面的内容,请使用以下命令:

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

如果您使用bash,且在文件中仅出现一次"miss rate",则可以执行以下操作:

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

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

如果“miss rate”出现多次,您可以在grep输出上循环,仅读取您所需的内容。(在bash中)


0

我相信

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

可以解决问题。但是如果每个条目都在自己的行上,那么这样做就没问题了。我相信sed有一种方法可以生成逗号或空格分隔的列表,但我不是所有sed相关事物的超级大师。


我稍微修改了一下,通过正则表达式中的([0-9][0-9][0-9][0-9][0-9])捕获组,提取5位数字(始终是行中的前5个数字)作为票号。 - englebart

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接