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

时间:2011-09-12 20:52:52

标签: linux grep command-line-interface

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

如果我想要这种行为怎么办,但grep打印出所有行?通过grep手册页快速浏览后,我空了。

10 个答案:

答案 0 :(得分:230)

使用确认。在此处查看其--passthru选项:ack。它具有允许完整的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。您可能不需要该标志。)

答案 1 :(得分:86)

您可以确保所有行都匹配,但无关紧要的匹配

时无需突出显示
egrep --color 'apple|' test.txt 

备注:

  • egrep也可以拼写为grep -E
  • --color通常在大多数发行版中都是默认的
  • grep的某些变体将“优化”空匹配,因此您可能需要使用“apple | $”(请参阅​​:https://stackoverflow.com/a/13979036/939457

答案 2 :(得分:32)

修改

这适用于OS X Mountain Lion的grep:

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

这比'^|pattern1|pattern2'更好,因为交替的^部分在行的开头匹配,而$在行的末尾匹配。有些regular expression engines不会突出显示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在上下文重叠时省略了--行,但它已经有一段时间了,所以也许我记错了。

答案 3 :(得分:28)

您可以使用https://github.com/kepkin/dev-shell-essentials

中的突出显示脚本

更好比grep更好因为你可以用自己的颜色突出显示每个匹配。

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

enter image description here

答案 4 :(得分:15)

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

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

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

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

这也具有页面的优点,这在不得不通过长输出

时很好

答案 5 :(得分:4)

你只能使用grep:

  1. 逐行阅读文件
  2. 匹配每行中的模式并通过grep
  3. 突出显示模式
  4. 如果没有匹配,则按原样回显该行
  5. 给出了以下内容:

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

答案 6 :(得分:2)

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

grep "test" -A 9999999 -B 9999999
  • A =&gt;之后
  • B =&gt;前

答案 7 :(得分:0)

如果您这样做是因为您希望在搜索中使用更多上下文,则可以执行以下操作:

cat BIG_FILE.txt | less

less中进行搜索会突出显示您的搜索字词。

或者将输出传递给您喜欢的编辑器。 One example

cat BIG_FILE.txt | vim -

然后搜索/突出显示/替换。

答案 8 :(得分:-1)

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

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

然后grep,或将其传递给grep搜索

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

这将显示列出所有文件,但使用大写字母对其进行着色。如果删除最后一个|你只会看到比赛。

我用这个来查找大写的图片,例如,但是正常的grep不会为每个目录显示每个文件的路径,这样我就可以看到上下文了。

答案 9 :(得分:-2)

也许这是一个XY problem,你真正想做的是突出显示在shell中出现的单词。如果是这样,您可以使用终端仿真器。例如,在Konsole中,启动查找(ctrl + shift + F)并键入您的单词。在新的或现有输出中出现之前,该单词将被突出显示,直到您取消该功能。