grep: jak pokolorować 2 słowa kluczowe?

12

Wiem, jak grepować 2 słowa kluczowe za pomocą 1 polecenia, ale mogę tylko pokolorować jedno z nich w wyniku. Oto moje polecenie:

grep 'keyword1' file.log | grep 'keyword2'

Tylko keyword2jest podświetlone. Jak mogę keyword1wyróżnić w tym samym czasie?

Raptor
źródło

Odpowiedzi:

15

grepPolecenie akceptuje --color=alwaysopcję, dzięki czemu można używać

grep 'keyword1' file.log --color=always | grep 'keyword2'

Jak wskazuje gertvdijk , to polecenie może być nieefektywne, ale będzie szukało wszystkich wierszy zawierających zarówno słowo kluczowe1, jak i słowo kluczowe2. Jeśli chcesz je wyróżnić w różnych kolorach, możesz użyć

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

który podświetli słowo kluczowe2 na niebiesko. Ta mtczęść oznacza, że greppodświetli pasujący tekst za pomocą tego kodu CSI , i 01;34oznacza „pogrubiony niebieski pierwszy plan na normalnym tle”.

Daniel H.
źródło
1
+1 za szczegółowe wyjaśnienia i opcje dostosowywania dla przypadku użycia!
gertvdijk
Zabawne, gdy próbuję tego z: grep -R --color = zawsze słowo kluczowe1. | grep keyword2 // wyróżnione jest tylko pierwsze słowo kluczowe. Jak mogę dostosować twoją odpowiedź do pracy z wyszukiwaniem rekurencyjnym?
TenLeftFingers
1
To dziwne, grep -R --color=always keyword1 . | grep keyword2powinno działać. Czy ponownie przekierowujesz dane wyjściowe (na przykład poprzez wpakowanie drugiego grepdo less -R)? Jeśli tak, musisz również dodać --color=alwaysdo drugiego.
Daniel H
Świetna odpowiedź! Aby podkreślić oba, --color=autopotrzebny byłby drugi grep, zaraz po nim 'keyword2'.
Luis
@Luis Tak, masz rację, że Grep przynajmniej domyślnie nie ma koloru (chociaż może to być opcja konfiguracji czasu? Nie sądzę, że zostałem zastąpiony w 2013 roku, kiedy działał na moim komputerze bez tego ...). Dodałem --color=alwaysdo odpowiedzi, ponieważ możesz chcieć ją potokować lesslub coś w tym stylu.
Daniel H
3

Wypróbuj rzeczywiste wyrażenia regularne zamiast potokować do innej instancji grep, np .:

grep -E "\<foo\>.*\<bar\>" file

Niestety ogranicza to pasujące linie, w których słowa kluczowe są dopasowane tylko w tej kolejności. W każdym razie użycie greptwojego pytania jest raczej nieefektywne i powinieneś tego unikać. Prawdopodobnie odpowiedź na @DanielH jest dla twojej sprawy o wiele prostsza .

Do dopasowania słów kluczowych „lub” używam tego regularnie:

grep -E "(foo|bar)" file
gertvdijk
źródło
1
Myślę, że OP chce tylko wierszy zawierających oba słowa kluczowe (wydane polecenie podaje wszystkie wiersze zawierające jedno z nich).
Daniel H
@DanielH Dzięki za zwrócenie na to uwagi. Zaktualizowałem swoją odpowiedź.
gertvdijk
Czy to nadal nie działa tylko wtedy, gdy foo pojawi się przed barem? Nie wiem, czy jest lepszy sposób foo.*bar|bar.*foo, czy jest to nawet konieczne w tym przypadku (który wydaje się być plikiem dziennika, który prawdopodobnie miałby standardowe zamówienie na słowa kluczowe). Dodałem moją odpowiedź, zanim zaktualizowałeś swoją, ale zachowam ją na wypadek, gdyby istniała sytuacja, w której łańcuchy grepsą naprawdę konieczne (lub w innym przypadku kolorowe wyjście nie powinno być wysyłane do terminala, na przykład grep | less -R).
Daniel H