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

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

如果我想要这样的行为,但是也可以用grep打印出所有行呢? 通过grep man页面快速查看后,我空了。

使用ack。 在这里检查它的--passthru选项: ack 。 它具有允许完整的perl正则expression式的附加好处。

 $ 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在大多数发行版中, --color通常是默认的

编辑:

这适用于OS X Mountain Lion的grep:

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

这比'^|pattern1|pattern2'更好,因为^部分交替匹配在行的开始,而$匹配在行的末尾。 一些正则expression式引擎不会突出显示pattern1pattern2因为^已经匹配并且引擎很渴望

类似的事情发生了'pattern1|pattern2|' 因为正则expression式引擎注意到模式string末尾的空交替符合主题string的开头。

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

第一次编辑:

我结束了使用Perl:

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

这假设你有一个兼容ANSI的terminal。

原文答案:

如果你被困在一个奇怪的grep ,这可能工作:

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

调整数字以获得所有你想要的行数。

第二个grep只是在Mac OS X Mountain Lion中删除由BSD风格的grep插入的无关行,即使连续匹配的上下文重叠。

我认为当上下文重叠时,GNU grep忽略了这些行,但是这已经有一段时间了,所以我可能记错了。

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

这比grep 更好 ,因为你可以使用自己的颜色来突出每个匹配。

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

在这里输入图像说明

既然你想匹配突出显示,这可能是人类消费(而不是pipe道到另一个程序),所以一个很好的解决scheme将是使用:

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

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

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

这也有页面的好处,这是很好的,当不得不经过一个长期的输出

你可以使用grep来做:

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

这给你以下内容:

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

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

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

如果你这样做,因为你想在search中更多的上下文,你可以这样做:

 cat BIG_FILE.txt | less 

lesssearch应突出search条件。

或者将输出传送给你最喜欢的编辑器。 一个例子 :

 cat BIG_FILE.txt | vim - 

然后search/突出显示/replace。

如果您正在recursion查找目录中的模式,则可以先将其保存到文件中。

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

然后grep,或pipe它到grepsearch

 ls -1R | grep --color -rE '[AZ]|' 

这将列出所有的文件,但用大写字母的颜色。 如果你删除最后一个| 你只会看到比赛。

我使用这个来查找以大写字母命名的图像,但是正常的grep并没有为每个目录显示每个文件的path,所以这样我可以看到上下文。

也许这是一个XY问题 ,你真正想做的是突出显示出现在你的shell中的单词的出现。 如果是这样,你可能能够使用你的terminal模拟器。 例如,在Konsole中,启动Find(ctrl + shift + F)并键入您的单词。 无论何时出现在新的或现有的输出中,该单词将被突出显示,直到您取消该function。