Сохранение вывода grep в файл с цветами

36

Мне нужно сохранить результат команды grep в файл, но я также хочу, чтобы выходной файл был отформатирован и сохранял цвета, как в терминале.

Есть ли способ сделать это? Может быть, заставить grep сохранить какой-нибудь язык разметки? Если это невозможно, есть ли другой инструмент, который может выполнить эту задачу?

Я пытаюсь выделить ключевое слово поиска в выходном файле, точно так же, как в терминале.

Моха всемогущий верблюд
источник

Ответы:

43

Чтобы сохранить разметку, вам нужно больше, чем просто текстовый файл. Я бы использовал вывод HTML, чтобы сохранить цвета.

  • Установите aha, т. Е. Чтобы "преобразовать escape-последовательности ANSI терминала unix в код 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
АГА!! , Ах это действительно замечательный инструмент, именно то , что я искал, спасибо !!
Моха всемогущий верблюд
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.

Так что, если вы хотите использовать редактор, это, вероятно, не то, что вы хотите.

MasterOfBinary
источник
Правильно !!, я получал эти странные символы между ними и не понимал, что это такое.
Моха всемогущий верблюд
Мне действительно нравится, насколько простой / эффективный ваш ответ. просто кат на выходе :). это здорово на короткий срок (просто достаточно для меня сейчас).
Тревор Бойд Смит
Подробно: это терминал (эмулятор), а не 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 и т. Д.), Вы увидите выделенные слова.

Для этого допустим, что это ваш grep, экспортированный в html:

ls | grep keytext > output.html

И теперь вы хотите выделить ключевой текст в вашем выводе. Вы можете использовать sed, чтобы сделать это, например:

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

И вот, теперь ваш ключевой текст выделен красным.

ро
источник
1
хорошая идея !!, но я не ищу подсветку синтаксиса. Вы знаете, как grep окрашивает поисковое ключевое слово другим цветом, обычно красным. Я хочу сохранить это так, чтобы ключевое слово выделялось в выходном файле.
Моха всемогущий верблюд
ок, значит, ты что-то с цветом? как HTML-код? Если вы видите цвет на входе, то он должен быть отформатирован и, следовательно, где-то закодирован, как "fontcolor: red", верно? Если это так, вам может понадобиться включить форматирующий код в ваш grep. :)
Ро
хорошо, с правкой в ​​вопросе я понимаю. :) Какое выходное расширение вы используете?
Ро
Я использую perl-код, когда я использовал расширение perl, я получил полную раскраску синтаксиса и я подбираю имя переменной, чтобы оно даже не окрашивалось.
Моха всемогущий верблюд