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

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

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

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

1
задан 22 May 2018 в 13:56

2 ответа

В зависимости от того, что вы хотите сделать с выходным файлом, можно добавить цвета в обычный текстовый файл, потому что цвета просто исходят от некоторых специальных символов. Греп, похоже, не хочет печатать их при перенаправлении его в файл, поэтому вам нужно заставить его:

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.
[d4 ] Поэтому, если вы хотите использовать редактор, это, вероятно, не то, что вы хотите.

9
ответ дан 24 May 2018 в 05:17
  • 1
    Правильно !!, я получал эти странные символы между ними и не понимал, что это такое. – Mhd.Tahawi 26 July 2014 в 12:55
  • 2
    Мне очень нравится, насколько просто / эффективно ваш ответ. просто кот выход :). это отлично подходит для краткосрочных (просто для меня достаточно сейчас). – Trevor Boyd Smith 23 February 2017 в 01:12
  • 3
    Подробно: это терминал (эмулятор), а не bash, который интерпретирует цветовые escape-последовательности (также странные символы). – masterxilo 3 May 2018 в 18:46

Если я правильно понял, вы хотите сохранить вывод терминала в текстовом файле, не так ли? Но вы хотите, чтобы он был отформатирован с цветами. Если это так, вот мои идеи:

Выделение вывода автоматически

Как вы, вероятно, знаете, если вы записываете вывод 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

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

2
ответ дан 24 May 2018 в 05:17
  • 1
    хорошая идея !!, но я не ищу подсветку синтаксиса. вы знаете, как grep окрасит ключевое слово поиска другим цветом, обычно красным. Я хочу сохранить это так, чтобы ключевое слово standout в выходном файле. – Mhd.Tahawi 25 July 2014 в 14:27
  • 2
    хорошо, значит, вы что-то раскрашиваете цветом? как html-код? Если вы видите цвет на входе, его нужно сформировать и, следовательно, закодировать где-нибудь, например «fontcolor: red», правильно? Если это так, вам может потребоваться включить код формирования в ваш grep. :) – Rho 25 July 2014 в 14:33
  • 3
    хорошо, с редактированием в вопросе, который я получаю. :) Какое расширение вы используете? – Rho 25 July 2014 в 14:35
  • 4
    Я приветствую Perl-код, когда я использовал расширение perl, я получил полную синтаксическую раскраску, и я сглаживаю имя переменной, чтобы оно даже не было окрашено. – Mhd.Tahawi 25 July 2014 в 14:37

Другие вопросы по тегам:

Похожие вопросы: