grep - 预先匹配号码以输出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
,那就更好了 - 但只是一个通常的数字也可以......
解决方案
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 <>}'
推荐阅读
- facebook - 在 Spark AR Studio 中使用本机 UI 选择器在双语过滤器中切换语言
- xslt - XSLT 1.0 - 在 sum 之前格式化数字
- c# - 如何在 Identity 3.1 中自定义用户?
- arangodb - arango shell 不包含在 ArangoDB 3.6.3 for macos 中
- ruby-on-rails - 在不触摸/保存标记记录的情况下修改作为可标记的标记
- neo4j - 如何使用 Neo4j 变量,不使用变量/标识符的查询行为不同
- javascript - 如何在 JS 中访问另一个文件中的函数对象
- sql - SQL 查询执行了多次而不是一次
- javascript - 仅授权订阅的 Web 推送唯一设备 ID
- multithreading - JavaFX 线程和并发