我有一个包含文本和数字的文本文件,我想使用grep只提取我需要的数字,例如,给定一个文件如下:
miss rate 0.21
ipc 222
stalls n shdmem 112
所以说我只想提取miss rate
0.21
的数据。我如何用grep或sed做到这一点?另外,我需要多个号码,而不仅仅是miss rate
之后的号码。也就是说,我可能希望同时获得0.21
和112
。示例输出可能如下所示:
0.21 222 112
因为我需要数据以供以后绘图。
答案 0 :(得分:4)
使用带有\K的pcre引擎的特殊环顾正则表达式技巧grep:
grep -oP 'miss rate \K.*' file.txt
或perl:
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的超级大师。