grep和sed捕获文件中的参数

时间:2012-05-28 06:26:34

标签: bash shell scripting sed

我有一条线,其中包含一些我想要抓取的参数。这样做的最佳方式是什么?

示例行是:

l1_user_instr hits=0035191479 misses=0000013657
l1_user_data hits=0009562889 misses=0001215170

我想编写一个脚本,为特定配置提供hits=xxmiss=yy

grep l1_user_instr_hits | sed ?

我不是sed的专家,因此也是问题。

4 个答案:

答案 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