bash - 复杂的 grep 显示文件名和最后一个匹配下面的行
问题描述
我有一个 shell 命令来向后 grep 的匹配"___"
,我需要一种方法来查看此匹配下方的 + 两行,并将文件名附加到 grep 输出的开头。
for f in $(find . -name "*.log"); do tac $f | grep "___" | head -n 1; done
我已经尝试添加-A 2
,但它不会在返回的内容下方返回行,我尝试file /dev/null
在 grep 之后添加以使其打印文件名,但出现错误
for f in $(find . -name "*.log"); do tac $f | grep "___" file /dev/null | head
-n 1; done
grep: file: No such file or directory
解决方案
将 -A 2 添加到 grep 是行不通的,因为您将它输送到head -n 1
.
由于您只想要一个匹配,您可以添加-m 1
以告诉 grep 在 1 个匹配后停止,而不是通过管道进入head -n 1
由于您已反转文件,您可能希望使用 -B 2 (-B 表示之前而不是 -A 表示之后)。
匹配后,您可能希望再次反转,tac
以便匹配类似于实际文件内容。
至于添加文件名:你已经有它$f
,只是echo
它。
所有这些都像:
for f in $(find . -name "*.log"); do echo "${f}:"; tac ${f} | grep -m 1 -A 2 "___" | tac; done
当您添加file /dev/null
到 grep 时,您将为其提供更多参数以进行搜索,这就是为什么您收到未找到的错误,因为您的路径中file
没有命名文件。file
我相信当您将输入管道输入到 grep 时,这个技巧将不起作用,因为向 grep 提供文件会导致 grep 忽略管道输入。
推荐阅读
- php - 在 Laravel 视图中呈现的父占位符
- html - 仅对 x 轴应用滚动捕捉
- c++ - 通过引用 lambda 传递weak_ptr
- c# - 外观对象如何通知其内容在 WPF 中已更改
- asp.net-mvc - asp.net mvc:多个视图模型默认值
- json - AWS 创建策略 MalformedPolicyDocument
- react-native - React Native 中的内向曲线
- c++ - 使用 snmpSET 和 netsnmp lib 无法设置请求
- flutter - 如何解决“操作系统错误:文件存在,errno = 17”?
- mysql - 将 SQL Server 的触发器转换为 MySQL