突出显示类似于grep的文本,但不要过滤掉文本

当使用grep时,它将突出显示一行中与正则表达式匹配的任何文本。

如果我想要这种行为,但有grep打印出所有行以及?在快速浏览了grep手册页后,我一无所获。

149542 次浏览

使用ack。在这里检出它的--passthru选项:。它还有一个额外的好处,就是允许使用完整的perl正则表达式。

$ ack --passthru 'pattern1' file_name


$ command_here | ack --passthru 'pattern1'

你也可以像这样使用grep:

$ grep --color -E '^|pattern1|pattern2' file_name


$ command_here | grep --color -E '^|pattern1|pattern2'

这将匹配所有的线条并突出显示图案。^匹配每一行的开始,但不会被打印/突出显示,因为它不是一个字符。

(注意,大多数设置将默认使用——color。你可能不需要那个标志)。

您可以确保所有行都匹配,但在不相关的匹配上没有需要突出显示的内容

egrep --color 'apple|' test.txt

注:

  • egrep也可以拼写为grep -E
  • --color通常是大多数发行版的默认值
  • grep的一些变体会“优化”空匹配,所以你可能想使用“apple|$”来代替(参见:https://stackoverflow.com/a/13979036/939457)

如果你这样做是因为你想在搜索中获得更多的上下文,你可以这样做:

cat BIG_FILE.txt | less

less中进行搜索应该突出显示搜索词。

或者将输出输送到您喜欢的编辑器。一个例子:

cat BIG_FILE.txt | vim -

然后搜索/替换/亮点。

你可以只使用grep by:

  1. 逐行读取文件
  2. 通过grep匹配每行中的模式并突出显示模式
  3. 如果没有匹配,则按原样回显该行

这就得到了以下结果:

while read line ; do (echo $line | grep PATTERN) || echo $line  ; done < inputfile

编辑:

这适用于OS X Mountain Lion的grep:

grep --color -E 'pattern1|pattern2|$'

这比'^|pattern1|pattern2'更好,因为交替语句的^部分匹配行首,而$部分匹配行尾。一些正则表达式引擎不会突出显示pattern1pattern2,因为^已经匹配,并且引擎是急切的

'pattern1|pattern2|'也发生了类似的情况,因为正则表达式引擎注意到模式字符串末尾的空交替与主题字符串的开头相匹配。

[1]: http://www.regular-expressions.info/engine.html

第一个编辑:

我最终使用perl:

perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'

这里假设您有一个兼容ansi的终端。

最初的回答:

如果你遇到了一个奇怪的grep,这可能会起作用:

grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'

调整数字,得到所有你想要的行。

第二个grep只是删除Mac OS X Mountain Lion上bsd风格的grep插入的多余的--行,即使连续匹配的上下文重叠。

我以为GNU grep省略了--行当上下文重叠,但它已经有一段时间了,所以可能我记错了。

如果你想打印“所有”行,有一个简单的工作解决方案:

grep "test" -A 9999999 -B 9999999
  • A =>之后
  • B =>以前

如果要递归地在目录中查找模式,可以先将其保存到文件中。

ls -1R ./ | list-of-files.txt

然后grep它,或者管道它到grep搜索

ls -1R | grep --color -rE '[A-Z]|'

这将列出所有文件,但颜色与大写字母。如果你删除最后一个|,你将只看到匹配。

例如,我用这个来查找命名不好的大写图像,但正常的grep不显示每个文件的路径,只有一次每个目录,这样我就可以看到上下文。

也许这是一个XY问题,而你真正要做的是突出显示出现在shell中的单词。如果是这样,您可以使用您的终端模拟器进行此操作。例如,在Konsole中,启动Find (ctrl+shift+F)并输入单词。然后,每当单词在新的或现有输出中出现时,它将被高亮显示,直到您取消该函数。

你可以从https://github.com/kepkin/dev-shell-essentials使用我的突出脚本

它是更好的而不是grep,因为你可以用它的自己的颜色突出显示每个匹配。

$ command_here | highlight green "input" | highlight red "output"

enter image description here

因为你想要突出显示匹配,这可能是人为消费(而不是管道到另一个程序),所以一个很好的解决方案将使用:

less -p <your-pattern> <your-file>

如果你不关心区分大小写:

less -i -p <your-pattern> <your-file>

这还有一个优点,就是拥有页面,这在必须经过很长的输出时是很好的