将grep的输出保存到带有颜色的文件中


36

我需要将grep命令的结果保存到文件中,但我也希望对输出文件进行格式化,并像在终端中一样保留颜色。

有没有办法做到这一点?也许使grep保存为某种标记语言?如果不可能,是否有其他工具可以完成此任务?

我试图使搜索关键字在输出文件中脱颖而出,就像在终端中一样。

Answers:


42

要保留标记,您不仅需要一个文本文件。我会使用HTML输出来保留颜色。

  • 安装aha即“将unix终端的 ANSI转义序列转换为HTML代码

    sudo apt-get install aha
  • 然后像这样保存您的grep(或ls)输出:

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    选项:

    --black param to set background as black color
    --title param to set the title for HTML page

通过文件扩展名的语法突出显示 pygmentize

  • 安装pygmentize

    sudo apt-get install python-pygments
  • 然后运行这种命令:

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

在此处输入图片说明


1
啊!aha是一个非常出色的工具,正是我想要的,谢谢!
全能骆驼Moha 2014年

2
@ Mhd.Tahawi:我已经更新了答案,以便您可以保留代码颜色(在您的情况下为perl),但pygmentize可以与其他代码一起使用。
西尔文·皮瑙

10

根据您要对输出文件执行的操作,可以将颜色添加到普通文本文件中,因为颜色仅来自某些特殊字符。当您将其重定向到文件时,Grep似乎不想打印它们,因此您需要强制执行以下操作:

grep --color=always "stuff" input.txt > output.txt

现在,当您将文件打印到控制台时,它将以颜色打印,因为Bash会将这些字符解释为“使用此颜色”。

cat output.txt

但是,如果在像这样的编辑器中将其打开vim,则会得到一些奇怪的字符。例如,当我使用命令时

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

当我使用打印时输出看起来正确,cat但是当我打开它时vim得到

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

因此,如果您想使用编辑器,则可能不是您想要的。


正确!,我在中间发现了那些奇怪的符号,但不知道那是什么。
全能的骆驼Moha 2014年

我非常喜欢您的答案多么简单/有效。只是猫的输出:)。这对短期来说是很棒的(现在对我来说已经足够了)。
Trevor Boyd Smith,

详细信息:解释色彩转义序列(又称奇怪字符)的是终端(模拟器),而不是bash 。
masterxilo

2

如果我理解正确,您想将终端输出保存在文本文件中,对吗?但您希望将其格式化为彩色。如果是这样,这是我的想法:

自动突出显示输出

您可能知道,如果将grep输出捕获到文本文件中,正是因为它是文本文件,所以无法格式化。因此,据我所知,您无法轻松实现。

尽管有一个简单的解决方法,包括使您的文本编辑器可以打开哪种文件。例如,假设您的grep输出具有一些bash组件,那么bash高亮显示将为您工作(顺便说一下,这些通常是您在终端的彩色输出中看到的颜色)。因此,诀窍是将文本输出保存在具有适当扩展名的文件中。而不是做类似的事情:

ls | grep something > output

你可能会去

ls | grep something > output.sh

这将使gedit(或任何不错的文本编辑器)自动识别您正在谈论的bash代码,并相应地突出显示它。您不需要为输出着色,如果程序识别出正在打开的代码类型,它将为您完成输出。如果您正在使用其他类型的格式,则只需对扩展名进行调整即可更好地适应您所要查看的内容(例如> output.xml,> output.html,> output.py ...等)。祝好运!:)

突出显示输出文件中的一些单词

因此,如果我明白了,您想突出显示您搜索的单词。同样,仅由于是纯文本,所以不能在纯文本文件中完成此操作。但是,您可以通过一种非常简单的方式(例如使用一些html编码)向其中添加某种格式。这将以html代码转换您的输出,并且使用能够解释html的程序(libreoffice writer,firefox和10000 etceteras)打开它时,您会看到一些突出显示的单词。

为此,假设这是您的grep,已导出到html:

ls | grep keytext > output.html

现在,您要突出显示输出中的关键文本。您可以使用sed来执行此操作,例如:

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

而且,现在您的关键文本以红色突出显示。


1
好主意!!,但是我不是要寻找语法高亮。您知道grep如何用另一种颜色(通常是红色)为搜索关键字着色。我想保留该关键字,以便使关键字在输出文件中脱颖而出。
全能的骆驼Moha 2014年

好吧,那么,您正在尝试一些带有颜色的东西吗?像html代码?如果您在输入中看到颜色,则必须对其进行格式化并对其进行编码,例如“ fontcolor:red”,对吗?在这种情况下,您可能需要在grep中包含格式代码。:)
Rho

好的,我在问题中进行了编辑。:)您使用什么输出扩展名?

我使用的是perl代码,当我使用perl扩展名时,我得到了完整的语法着色,并且我对一个变量名进行了搜索,因此它甚至没有被着色。
全能骆驼Moha 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.