首页 > 解决方案 > 预先匹配号码以输出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

棘手的部分是,我想保留匹配号,无论我只是 grep 进行单行匹配,还是使用上下文(匹配之后或之前的 X 行)。

是否有捷径可寻?如果我可以为数字做一个格式说明符,比如%03d,那就更好了 - 但只是一个通常的数字也可以......

标签: grep

解决方案


Perl 来救援!

perl -ne '/blabla/ and print ++$i, ":$_" and print "$i:", scalar <>' -- file
  • -n逐行读取输入
  • 每一行都被读入特殊变量$_
  • 菱形运算符<>从输入文件中读取下一行
  • 标量使它只读取一行,而不是所有剩余的
  • $i每次遇到该变量时都会递增blabla,并附加到每个输出行。

blabla当相邻行上存在两个 s 时,您的规范不处理这种情况。

要格式化数字,请使用sprintf

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

推荐阅读