我有一个包含文本和数字的文本文件,我想使用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
因为我需要以后的情节数据。
用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的超级主人。