突出显示而不是过滤的“Grep”

软件推荐 linux 日志 命令行
2021-10-25 22:10:33

我想知道常见的 unix 工具集中是否有一个程序,例如 grep,它不是过滤包含字符串的行,而是简单地输出相同的输入,但突出显示或着色选定的字符串。

我正在考虑自己做(应该很简单),但也许它已经作为 unix 命令存在。

我打算用它来监控日志,所以我会做这样的事情:

tail -f logfile.log | highlight "error"

通常当我监控日志时,我需要找到一个特定的字符串,但我还需要知道字符串前后写了什么,所以过滤有时是不够的。

存在这样的东西吗?

谢谢

4个回答

grep使用基本命令,这是一个有趣的技巧。它包括使用两个过滤器:一个您要应用的过滤器和一个匹配所有行但不产生高亮的虚拟过滤器。此虚拟匹配可以是^(行首)或$(行尾)。

grep "^\|text" --color='always' file

或者

grep -E "^|text" --color='always' file

看一个例子:

$ cat a
hello this is 
some text i wanted
to share with you
$ grep "^\|text" --color='always' a
hello this is 
some text i wanted     # "text" is highlighted
to share with you

有一个工具叫ack. 你可以在http://beyondgrep.com找到它,它确实是一个超越 grep 的工具。它最常见的用途是填充那个角色find . -name "*.java" --print | xargs grep clazz之类的。因为我们一直都在这样做。

只要ack clazz你得到输出。搜索正确的文件(不费心尝试 grep 二进制文件)并提供漂亮的颜色输出。

如果您将它与--passthru选项一起使用,它将打印整个输入流,以颜色突出显示匹配的区域。

--passthru 打印所有行,无论是否匹配

如文档所述,如果-用于文件,它将采用 STDIN:

如果指定了任何文件或目录,则仅检查这些文件和目录。ack 也可以搜索 STDIN,但前提是没有指定文件或目录参数,或者其中之一是“-”。

因此,请原谅cat滥用(以及双关语,见下文),您可以拥有它:

$ cat file | ack --passthru pattern
$ cat file | ack --passthru pattern -

这将获取管道的输出,并将其发送到管道中,ack将打印所有行(带有--passthru)并突出显示模式。

这正是您所追求的工具(还有更多)。它是许多包管理器的标准包。请参阅http://beyondgrep.com/install/了解您的最爱。

_ /|
\'哦'
=(___)=
   你确认--thpppt!

(如果您不认识它,那就是Bill the Cat ,尽管图像搜索也可能有帮助 - 不要点击 Miley Cyrus 套装)

您可以使用grep -C提供 n 行上下文的标志,例如grep -C 3将打印比赛前后的 3 行。也有-Band -Afor before 和 after。

如果您希望定期突出显示给定的字符串,例如特定的日志格式,则可能值得将 python pygmentize自定义词法分析器一起使用,因为它是基于正则表达式的,您会惊讶于它的简单程度后者还具有跨平台的优势,尽管某些终端的颜色表现不佳。

我是 Paolo Antinori 的 hhighlighter 的粉丝。https://github.com/paoloantinori/hhighlighter

这个命令的一个优点是它可以用独特的颜色突出显示多达 10 个单词。只需通过管道将命令的输出h与要突出显示的单词一起传递。

例如tail -f /var/log/somelog.log | h "ERROR" 将产生:

演示-1


他网站上的一些例子:

演示-2 演示3