将grep输出限制为短行

苏格拉底

我经常使用grep查找具有特定条目的文件,如下所示:

grep -R 'MyClassName'

好消息是它返回文件及其内容,并将找到的字符串标记为红色。不好的是,我还有很大的文件,整个文本都写在一个大的单行中。现在,在这些大文件中查找文本时,grep输出过多。有没有一种方法可以将输出限制为例如左侧和右侧的5个单词?还是将输出限制为左右30个字母?

muru

grep本身只有基于行的上下文选项。SU这个职位提出了一个替代方案

一种解决方法是启用选项“仅匹配”,然后使用RegExp的功能使grep比您的文本多一点:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

当然,如果您使用颜色突出显示,则始终可以再次grep以仅对真正的匹配项进行着色:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

作为另一种选择,我建议先fold输入文本,然后再将其grepping起来,例如:

fold -sw 80 input.txt | grep ...

-s选项将使fold推词移至下一行,而不会在其间打断。

或使用其他方式根据输入的结构将输入分成几行。(例如,SU帖子处理的是JSON,因此使用jqetc.进行漂亮的打印和grep...或仅使用jq自身进行过滤...会比上面给出的两种选择都要好。)


这个GNU awk方法可能更快:

gawk -v n=50 -v RS='MyClassName' '
  FNR > 1 { printf "%s: %s\n",FILENAME, p prt substr($0, 0, n)}
  {p = substr($0, length - n); prt = RT}
' input.txt
  • 告诉awk来对我们感兴趣的(图案分割记录-v RS=...),并在上下文中的字符数(-v n=...
  • 第一个记录(FNR > 1之后的每个记录都是awk在其中找到与该模式匹配的记录。
  • 因此,我们会打印n前一行(p)的尾随字符n当前行(substr($0, 0, n))的前导字符,以及前一行的匹配文本(即prt
    • 我们设置pprt 打印,所以我们设置的值将在下一行使用
    • RT 是GNUism,这就是为什么它是GNU awk特定的。

对于递归搜索,也许:

find . -type f -exec gawk -v n=50 -v RS='MyClassName' 'FNR>1{printf "%s: %s\n",FILENAME, p prt substr($0, 0, n)} {p = substr($0, length-n); prt = RT}' {} +

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档