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?

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”.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.