我经常使用 grep 来查找具有特定条目的文件,如下所示:
grep -R 'MyClassName'
好消息是它返回文件及其内容并将找到的字符串标记为红色。坏事是我也有巨大的文件,其中整个文本都写在一个大的单行中。现在 grep 在那些大文件中查找文本时输出太多。有没有办法将输出限制为例如左右 5 个单词?或者可能将输出限制为左右 30 个字母?
我经常使用 grep 来查找具有特定条目的文件,如下所示:
grep -R 'MyClassName'
好消息是它返回文件及其内容并将找到的字符串标记为红色。坏事是我也有巨大的文件,其中整个文本都写在一个大的单行中。现在 grep 在那些大文件中查找文本时输出太多。有没有办法将输出限制为例如左右 5 个单词?或者可能将输出限制为左右 30 个字母?
grep
本身只有基于线条的上下文选项。这个 SU 帖子提出了一个替代方案:作为另一种选择,我建议
fold
ing 文本然后 grepping 它,例如:该
-s
选项会将fold
单词推送到下一行,而不是介于两者之间。或者使用其他方式根据输入的结构将输入分成几行。(例如,SU 帖子处理 JSON,因此使用
jq
etc. 来漂亮打印和grep
......或者只是使用jq
自己进行过滤......会比上面给出的两种选择中的任何一种都要好。)这种 GNU awk 方法可能更快:
-v RS=...
),以及上下文中的字符数 (-v n=...
)FNR > 1
) 之后的每条记录都是 awk 找到与该模式匹配的记录。n
上一行的尾随字符 (p
) 和n
当前行的前导字符 (substr($0, 0, n)
),以及前一行的匹配文本 (即prt
)p
和打印prt
后,所以我们设置的值被下一行使用RT
是 GNU 主义,这就是为什么这是 GNU awk 特定的。对于递归搜索,也许:
将仅匹配与其他一些选项结合使用(见下文),可能非常接近您正在寻找的内容,而没有其他答案中提到的正则表达式的处理开销