前缀匹配号以输出grep的匹配行?

时间:2019-07-11 08:55:09

标签: grep

说我有这个文件test.log

blabla test test
20 30 40
hello world
100 100
34 506 795
blabla test2
50 60 70
hello
10 10
200 200
blabla test BB
30 40 50
100 100
20 20 20 20

我想在其中打印所有带有blabla的行,在此之后的行-前面有匹配号。

没有匹配号码,这很容易:

$ grep -A1 "blabla" test.log
blabla test test
20 30 40
--
blabla test2
50 60 70
--
blabla test BB
30 40 50

使用匹配的数字作为前缀,

1: blabla test test
1: 20 30 40
--
2: blabla test2
2: 50 60 70
--
3: blabla test BB
3: 30 40 50

棘手的部分是,无论我是单行匹配还是上下文匹配(匹配之后或匹配之前的X行),我都希望保留匹配号。

有没有简单的方法可以做到这一点?如果我可以为数字做一个格式说明符,例如%03d,那就更好了-但也可以使用通常的数字...

2 个答案:

答案 0 :(得分:1)

抢救Perl!

perl -ne '/blabla/ and print ++$i, ":$_" and print "$i:", scalar <>' -- file
  • -n逐行读取输入
  • 将每一行读入特殊变量$_
  • 钻石运算符<>从输入文件中读取下一行
  • here使其仅读取一行,而不是其余所有行
  • 每次遇到$i时,变量blabla都会增加,并位于每条输出行的前面。

当相邻行上有两个blabla时,您的规范无法处理。

要设置数字格式,请使用scalar

perl -ne 'if (/blabla/) { $f = sprintf "%03d", ++$i; print $f, ":$_"; print "$f:", scalar <>}'

答案 1 :(得分:1)

类似

 grep -A1 blahblah test.log | awk -v n=1 '$0 == "--" { n += 1; print; next }
                                          { printf("%03d: %s\n", n, $0) }'