Збереження виводу grep-файлу у файл із кольорами


36

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

Чи є спосіб це зробити? Може, зробити греп зберегти на якійсь мові розмітки? Якщо це неможливо, чи є інший інструмент, який може виконати це завдання?

Я намагаюся, щоб ключове слово пошуку виділялося у вихідному файлі, точно так, як це робиться в терміналі.

Відповіді:


43

Щоб зберегти розмітку, вам потрібно більше, ніж просто текстовий файл. Я б використовував вихід HTML, щоб зберегти кольори.

  • Встановіть aha, тобто "перетворює 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працює з багатьма іншими.
Sylvain Pineau

10

Залежно від того, що ви хочете зробити з вихідним файлом, можна додати кольори до звичайного текстового файлу, оскільки кольори просто походять від деяких спеціальних символів. Здається, Греп не хоче надрукувати їх, коли ви перенаправляєте їх у файл, тому вам потрібно змусити його:

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.

Отже, якщо ви хочете використовувати редактор, це, мабуть, не те, що ви хочете.


Правильно !!, я отримував ті дивні символи між собою і не розумів, що це.
Моха всемогутній верблюд

мені дуже подобається, наскільки проста / ефективна ваша відповідь. просто кішка вихід :). це чудово підходить на короткий термін (мені достатньо просто зараз).
Тревор Бойд Сміт

Детальніше: Термінал (емулятор), а не bash, інтерпретує послідовності кольорових значень (так само дивні символи).
masterxilo

2

Якщо я правильно зрозумів, ви хочете зберегти висновок терміналу в текстовому файлі, правда? Але ви хочете, щоб він був відформатований кольорами. Якщо це так, ось мої ідеї:

Виділення виводу автоматично

Як ви, напевно, знаєте, якщо ви захоплюєте вихід греп у текстовий файл, саме тому, що це текстовий файл, його неможливо форматувати. Отже, наскільки я знаю, ви не можете зробити це просто.

Незважаючи на це, існує просте вирішення, яке полягає в тому, щоб зрозуміти своєму текстовому редактору, який саме файл відкривається. Наприклад, скажімо, що ваш греп-вихід має деякі компоненти bash, тому bash highlights працює для вас (до речі, це часто кольори, які ви бачите на кольоровому виході в терміналі). Тож хитрість полягає в збереженні виводу тексту у файл із належним розширенням. Замість того, щоб робити щось на кшталт:

ls | grep something > output

ви можете піти

ls | grep something > output.sh

Що змусить gedit (або будь-якого пристойного редактора тексту) автоматично визнати, що ви говорите про баш-код, і підкреслить його відповідно. Не потрібно забарвлювати вихід, програма зробить це за вас, якщо він розпізнає тип коду, який він відкриває. Якщо ви працюєте з іншими типами форматів, просто адаптуйте розширення до того, що краще налаштовується на те, на що ви вдягаєте (наприклад,> 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
приємна ідея !!, але я не шукаю виділення синтаксису. ви знаєте, як греп пофарбувати ключове слово для пошуку за допомогою іншого кольору, зазвичай червоного. Я хочу зберегти це, щоб ключове слово стояло у вихідному файлі.
Моха всемогутній верблюд

ок, значить, ти щось приколюєш кольором? як код HTML? Якщо ви бачите колір у вводі, то його треба десь форматувати, а значить, і закодувати десь, як-от "fontcolor: red", правда? У такому випадку вам може знадобитися включити формулюючий код у свій греп. :)
Rho

ок, з редагуванням у питанні я розумію. :) Яке вихідне розширення ви використовуєте?
Ро

Я схвалюю код perl, коли я використовував розширення perl, я отримав повне забарвлення синтаксису, і я назбираю ім'я змінної, щоб воно навіть не було кольоровим.
Моха всемогутній верблюд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.