Zapisywanie danych wyjściowych grep do pliku z kolorami

36

Muszę zapisać wynik polecenia grep w pliku, ale chcę również sformatować plik wyjściowy i zachować kolory tak jak w terminalu.

Czy jest na to sposób? Może zapisz grep w jakimś języku znaczników? Jeśli nie jest to możliwe, czy istnieje inne narzędzie, które może wykonać to zadanie?

Próbuję wyróżnić słowo kluczowe wyszukiwania w pliku wyjściowym, dokładnie tak jak w terminalu.

Wszechmocny wielbłąd Moha
źródło

Odpowiedzi:

42

Aby zachować znaczniki, potrzebujesz czegoś więcej niż tylko pliku tekstowego. Użyłbym danych wyjściowych HTML, aby zachować kolory.

  • Zainstaluj aha, tj. „Konwertuje sekwencje specjalne ANSI terminala unixowego na kod HTML

    sudo apt-get install aha
  • następnie zapisz grep(lub ls) dane wyjściowe w następujący sposób:

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

    opcje:

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

Podświetlanie składni dla rozszerzenia pliku przez pygmentize

  • zainstaluj pygmentize:

    sudo apt-get install python-pygments
  • następnie uruchom następujące polecenie:

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

wprowadź opis zdjęcia tutaj

Sylvain Pineau
źródło
1
AHA!! , aha to naprawdę wspaniałe narzędzie, dokładnie to, czego szukałem, dzięki !!
Moha Wszechmogący wielbłąd
2
@ Mhd.Tahawi: Zaktualizowałem moją odpowiedź, abyś mógł zachować kolory kodu (perl w twoim przypadku), ale pygmentizedziała z wieloma innymi.
Sylvain Pineau,
10

W zależności od tego, co chcesz zrobić z plikiem wyjściowym, możliwe jest dodanie kolorów do normalnego pliku tekstowego, ponieważ kolory po prostu pochodzą od niektórych znaków specjalnych. Wygląda na to, że Grep nie chce ich drukować po przekierowaniu do pliku, więc musisz wymusić:

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

Teraz, kiedy wydrukujesz plik na konsoli, zostanie on wydrukowany w kolorach, ponieważ Bash interpretuje te znaki jako „użyj tego koloru”.

cat output.txt

Jeśli jednak otworzysz go w edytorze vim, otrzymasz dziwne postacie. Na przykład kiedy używam poleceń

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

Dane wyjściowe wyglądają poprawnie, gdy drukuję je za pomocą, catale kiedy je otwieram, vimotrzymuję

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

Więc jeśli chcesz użyć edytora, prawdopodobnie nie jest to, czego chcesz.

MasterOfBinary
źródło
Zgadza się !!, dostawałem te dziwne symbole pomiędzy i nie rozumiałem, co to są.
Moha Wszechmogący wielbłąd
bardzo podoba mi się, jak prosta / skuteczna jest twoja odpowiedź. po prostu cat wyjście :). jest to świetne na krótki okres (teraz jest dla mnie wystarczająco dobre).
Trevor Boyd Smith
Szczegół: To terminal (emulator), a nie bash, interpretuje sekwencje specjalne koloru (inaczej dziwne znaki).
masterxilo
2

Jeśli dobrze zrozumiałem, chcesz zapisać plik końcowy w pliku tekstowym, prawda? Ale chcesz go sformatować za pomocą kolorów. Jeśli tak jest, oto moje pomysły:

Automatyczne wyróżnianie wyjścia

Jak zapewne wiesz, jeśli przechwycisz wyjście grep do pliku tekstowego, dokładnie dlatego, że jest to plik tekstowy, którego nie można sformatować. O ile mi wiadomo, nie można tego zrobić w łatwy sposób.

Mimo to istnieje proste obejście polegające na uświadomieniu edytorowi tekstu, jaki plik jest otwierany. Na przykład, powiedzmy, że twoje wyjście grep ma jakieś składniki bash, więc podświetlenia bash działają dla ciebie (nawiasem mówiąc, często są to kolory, które widzisz na kolorowym wyjściu w terminalu). Zatem sztuczka polega na zapisaniu tekstu w pliku z odpowiednim rozszerzeniem. Zamiast robić coś takiego:

ls | grep something > output

możesz iść

ls | grep something > output.sh

Co sprawi, że gedit (lub dowolny porządny edytor tekstu) automatycznie rozpozna, że ​​mówisz o kodzie bash, i odpowiednio go podświetli. Nie musisz pokolorować wyjścia, program zrobi to za Ciebie, jeśli rozpozna typ otwieranego kodu. Jeśli pracujesz z innymi typami formatów, po prostu dostosuj rozszerzenie do tego, by lepiej dostosować się do tego, czego szukasz (np.> Output.xml,> output.html,> output.py ... itd.). Powodzenia! :)

Podświetlanie niektórych słów w pliku wyjściowym

Więc jeśli mam, chcesz podświetlić wyszukiwane słowa. Ponownie, nie można tego zrobić w zwykłym pliku tekstowym tylko dlatego, że jest to zwykły tekst. Możesz jednak dodać do niego jakiś format w bardzo łatwy sposób, na przykład używając kodu HTML. Spowoduje to przekształcenie danych wyjściowych w kod HTML, a kiedy otworzysz je za pomocą programu zdolnego do interpretacji HTML (pisarz libreoffice, Firefox i 10000 itp.), Zobaczysz kilka słów wyróżnionych.

Aby to zrobić, powiedzmy, że to twój grep, eksportowany do HTML:

ls | grep keytext > output.html

A teraz chcesz podświetlić tekst klucza w wynikach . Możesz użyć sed, aby to zrobić, na przykład:

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

I viola, teraz Twój tekst klucza jest wyróżniony na czerwono.

Rho
źródło
1
fajny pomysł !!, ale nie szukam podświetlania składni. wiesz, jak grep pokoloruje słowo kluczowe wyszukiwania innym kolorem, zwykle czerwonym. Chcę to zachować, aby słowo kluczowe wyróżniało się w pliku wyjściowym.
Moha Wszechmogący wielbłąd
ok, więc greping coś z kolorem? jak kod HTML? Jeśli widzisz kolor na wejściu, to musisz go sformatować, a więc gdzieś zakodować, np. „Fontcolor: red”, prawda? W takim przypadku może być konieczne dołączenie kodu formatującego do grep. :)
Rho,
ok, z edycją w pytaniu, rozumiem. :) Z jakiego rozszerzenia wyjściowego korzystasz?
Rho,
Grepuję kod perla, kiedy użyłem rozszerzenia perla, otrzymałem pełną kolorystykę składni i grepuję nazwę zmiennej, więc nie była nawet kolorowa.
Moha Wszechmogący wielbłąd