我有一条线,其中包含一些我想要抓取的参数。这样做的最佳方式是什么?
示例行是:
l1_user_instr hits=0035191479 misses=0000013657
l1_user_data hits=0009562889 misses=0001215170
我想编写一个脚本,为特定配置提供hits=xx
和miss=yy
。
grep l1_user_instr_hits | sed ?
我不是sed的专家,因此也是问题。
答案 0 :(得分:2)
目前还不完全清楚你在寻找什么,但从其他答案中的评论判断,我认为你希望能够获得命中数或失误次数,而不是别的。例如,在配置'l1_user_data'上查找匹配时,您希望输出完全正确:
0009562889
一件简单的事情(你可以添加一个更好的界面)就像是:
awk -v f=3 -v c=l1_user_instr -F ' *|=' '$0 ~ c {print $f}' input
通过设置FS以分割=
上的线以及空格,我们将命中数字段3设置为,而未命中数字段为字段5.将变量c设置为字符串想要匹配,并将f设置为您想要显示的字段(3或5)。请注意,您可能希望处理标签以及FS中的空格(可以/应该做很多事情来改进此界面,但对于一次性,这很好)。
答案 1 :(得分:1)
或许awk
可能符合您的需求。试试这个:
awk '/l1_user_instr/ { print $2,$3 }' file.txt
结果:
hits=0035191479 misses=0000013657
HTH
答案 2 :(得分:1)
使用sed
(如果我得到了您想要的内容):
sed '/l1_user_instr/ s/.*\(hits=\d\+\) \(misses=\d\+\)[^0-9]*$/\1\n\2/;q' INPUTFILE
基本上它会搜索匹配的l1_user_instr
行,并在该行上创建两个用于匹配所需数据的组,然后将它们打印成新的行分隔,然后退出。 awk
解决方案是类似的:
awk '/l1_user_instr/ {printf("%s\n%s\n",$2,$3) ; exit}' INPUTFILE
答案 3 :(得分:1)
while IFS=" =" read -r type _ hits _ misses
do
echo "Type: $type, Hits: $hits, Misses: $misses"
done < inputfile
示例输出:
Type: l1_user_instr, Hits: 0035191479, Misses: 0000013657
Type: l1_user_data, Hits: 0009562889, Misses: 0001215170