Oznacz występowanie słowa kluczowego innym kolorem

13

Mam program, który wyrzuca dane wyjściowe do stdout:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Aby łatwiej dostrzec niepowodzenia na wyjściu, chciałbym zaznaczyć wystąpienia słowa kluczowego na FAILczerwono bez odrzucania innych wiadomości. Byłoby miło, gdybym mógł również podświetlić OKsłowa kluczowe kolorem zielonym :).

Wykonanie potoku egrep --color FAILspowoduje wyświetlenie tylko linii, w których występuje FAILsłowo kluczowe.

Teodor
źródło
1
Aby znaleźć greprozwiązanie, zobacz unix.stackexchange.com/a/34322
manatwork
masz dostęp do zmiany kodu źródłowego? czy to skrypt bashowy?
h3rrmiller
@manatwork Z linku podanego kliknąłem moją drogę do stackoverflow.com/questions/972370 a niektóre tail -fi awkmagii, jestem dobry, aby przejść =)
Theodor

Odpowiedzi:

10

W oparciu o manatworkgenialny mały hack „albo nic” z drugiego pytania, oferuję to, co dodaje możliwość uzyskania dwóch kolorów podświetlenia:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Oznacza to, że grepdwukrotnie przeglądasz dane wyjściowe, za GREP_COLORSkażdym razem z inną zmienną środowiskową.

Wartość „01; 32” oznacza „pogrubiony zielony”, a druga oznacza „pogrubiony czerwony”. Zobacz artykuł z Wikipedii na temat kodów ANSI, aby uzyskać więcej pomysłów.

Niestety, wymaga to GNU grep w wersji 2.5.3 lub nowszej. Starsze wersje GNU grep obsługiwały inny mechanizm kolorowania, ale w tych wersjach występuje błąd, który uniemożliwia korzystanie z tej funkcji w potoku więcej niż jeden raz. BSD grep emuluje starszy mechanizm barwienia GNU grep i będzie działał dwa razy w potoku, ale krzyczy o „pustym podwyrażeniu” z powodu manatworkwłamania.

Możesz usunąć odwrotne ukośniki na końcu pierwszych dwóch linii, aby wszystko było jedną linią. Właśnie podzieliłem go tutaj dla jasności i dobrej zabawy z formatem strony SE.

Warren Young
źródło
To naprawdę wspaniałe! Ale z jakiegoś powodu skrypt wydaje się nie wyróżniać drugiej instrukcji na moim komputerze. Korzystam z CentOS 5.
Theodor
2
To, co się tutaj dzieje, polega na tym, że CentOS 5 jest wyposażony w grep GNU na tyle stary, że nie obsługuje GREP_COLORSliczby mnogiej. Używa tylko starszej GREP_COLORmetody, a ta metoda zawiera błąd, który uniemożliwia prawidłowe działanie. Jeśli zmienisz polecenie, którego chcesz użyć GREP_COLOR=32, zmieni ono kolor podświetlenia tylko pierwszego dopasowania. Jeśli przejdziesz przez wynik hexdump -c, zobaczysz, że dodanie drugiego egreppolecenia coś robi, ale nie jest to zgodne z prawem ANSI. Podsumowując: musisz uaktualnić, grepaby wszystko działało poprawnie.
Warren Young,
Haha, to taki wnikliwy komentarz. Tak, CentOS5 robi się stary, podobnie jak w przypadku wielu systemów operacyjnych działających na starej maszynie, wyrzucających stare, zapomniane wiadomości dziennika :) Postaram się sprawdzić, czy aktualizacja do centos6 nie jest możliwa.
Theodor
Właśnie sprawdziłem swoje rozwiązanie na pudełku CentOS 6 i działa ono tam, potwierdzając moją diagnozę. (Wcześniejsze testy odbywały się na serwerach Ubuntu.) EL6 jest dostarczany z GNU grep 2.6.3. Co ciekawe, naprawili także GREP_COLOR(pojedynczy) błąd, mimo że funkcja została wycofana, gdy tylko została zastąpiona.
Warren Young,
Nie rozumiem, jak to rozwiązuje problem, ponieważ 1. grep odfiltruje wszystkie „FAIL”, więc nie będzie już nic do dopasowania drugiego grep ..
laertis
1

Możesz do tego użyć wielowątkowego lub ccze, oba pozwalają konfiguracjom opisywać wyrażenia regularne w celu dopasowania i kolorów.

Netch
źródło
1

W oparciu o odpowiedź Warrena Younga napisałem ten skrypt w języku Python, który robi to samo bardziej elegancko i przy znacznie mniejszym pisaniu. Oto jak użyjesz tego skryptu:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
Kirubakaran
źródło