Soc*_*tes 10 command-line grep text-processing
我经常使用 grep 来查找具有如下特定条目的文件:
grep -R 'MyClassName'
Run Code Online (Sandbox Code Playgroud)
好消息是它返回文件、它们的内容并将找到的字符串标记为红色。不好的是,我也有很大的文件,其中整个文本都写在一个大的单行中。现在,在这些大文件中查找文本时,grep 输出过多。有没有办法将输出限制为左侧和右侧的 5 个单词?或者将输出限制为左右各 30 个字母?
mur*_*uru 16
grep本身只有基于行的上下文选项。这个 SU 帖子建议了另一种选择:
一种解决方法是启用选项“仅匹配”,然后使用 RegExp 的功能来 grep 比您的文本多一点:
Run Code Online (Sandbox Code Playgroud)grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath当然,如果你使用颜色突出显示,你总是可以再次 grep 只为真正的匹配着色:
Run Code Online (Sandbox Code Playgroud)grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath | grep "WHAT_I_M_SEARCHING"
作为另一种选择,我建议fold输入文本然后对其进行 grepping,例如:
fold -sw 80 input.txt | grep ...
Run Code Online (Sandbox Code Playgroud)
该-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
Run Code Online (Sandbox Code Playgroud)
-v RS=...),并在上下文中的字符数(-v n=...)FNR > 1)之后的每条记录都是 awk 找到与模式匹配的记录。n上一行的尾随字符 ( p) 和n当前行的前导字符 ( substr($0, 0, n)),以及上一行的匹配文本(即prt)
p和打印prt 后,所以我们设置的值被下一行使用RT 是 GNU 主义,这就是为什么这是 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}' {} +
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7922 次 |
| 最近记录: |