说我有这个文件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
,那就更好了-但也可以使用通常的数字...
答案 0 :(得分:1)
抢救Perl!
perl -ne '/blabla/ and print ++$i, ":$_" and print "$i:", scalar <>' -- file
-n
逐行读取输入$_
<>
从输入文件中读取下一行$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) }'