Powiedz, że mam następujący plik:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Domyślnie grep
zwraca każdy wiersz zawierający wyszukiwane hasło:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Przekazanie --color
parametru grep
spowoduje, że podświetli on część wiersza pasującą do wyrażenia wyszukiwania, ale nadal zwraca tylko wiersze zawierające wyrażenie. Czy istnieje sposób, aby uzyskać grep
wyjście każdej linii w pliku źródłowym, ale wyróżnić dopasowania?
Mój obecny straszny hack, aby to osiągnąć (przynajmniej w plikach, które nie mają ponad 10000 kolejnych wierszy bez dopasowań) to:
$ grep -B 9999 -A 9999 test test
Jeśli grep
nie można tego osiągnąć, czy istnieje inne narzędzie wiersza polecenia, które oferuje tę samą funkcjonalność? Bawiłem się ack
, ale wydaje się, że nie ma na to również opcji.
grep
highlighting
Michał Mrożek
źródło
źródło
-C 9999
zamiast.-A 9999 -B 9999
Zawsze robię:grep -C 9999 pattern file
Odpowiedzi:
To, co tu robimy, jest dopasowane do
$
wzoru i wzoru testowego, oczywiście$
nie ma nic do pokolorowania, więc tylko wzór testowy zyskuje kolor.-E
Prostu włącza rozszerzonego dopasowania regex.Możesz z niego łatwo utworzyć funkcję:
źródło
highlight () { grep --color -E "$1|$" $2 ; }
. Zastosowanie:highlight test yourfile
"$2"
należy również zacytować.highlight () { grep --color -E "$1|$" "$@" }
co pozwala na pliki z białymi znakami w nazwach i wiele plików."$1"
w plikach. Użyjhighlight () { grep --color -E "$1|$" "${@:1}" }
w przypadku Ubuntu i Debiana używaj ack-grep zamiast ack
źródło
--regexp string
; odpowiednikiem ack / ack-grep jest--match string
ack --passthru
z perlem:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
działa również na strumieniach! Na przykładifconfig | ack --passthru inet
Innym sposobem, aby to zrobić poprawnie i przenośnie za pomocą
grep
(oprócz używania dwóch wyrażeń regularnych z naprzemiennie jak w zaakceptowanej odpowiedzi) jest użycie wzorca zerowego (i odpowiednio łańcucha zerowego).Powinno działać równie dobrze z obydwoma
-E
i-F
przełącznikami, ponieważ zgodnie ze standardem :i
To po prostu kwestia biegania
i odpowiednio
źródło
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
wypisuje tylko 2 w 2.27 (i 2.26, ale nie 2.25 i nie w git head). Tylko z-F
(nie bez lub z -E). IOW, tylko 2.26 i 2.27 wydają się mieć błąd i tylko z -F.seq 3 | grep -F -e '' -e '' -e 2
wydaje się to również działać z 2.27-F
, zmniejszając potrzebę martwienia się o to, w jakich postaciach się pojawiąstring
. Możesz wspomnieć--color
; ponieważ ta odpowiedź unosi się na stronie (wyświetlana podczas głosowania), więcej osób może przeczytać ją przed innymi odpowiedziami.Mam następującą funkcję, której używam do takich rzeczy:
Wewnętrznie wygląda trochę brzydko, jest przyjemny i łatwy w użyciu, tak jak:
lub, dla nieco bardziej realistycznego przykładu:
Możesz zmienić kolory na dowolne (co może być trudne z grep - nie jestem pewien), zmieniając
1
i31
oraz43
(po\e[
) na inne wartości. Te kody do wykorzystania są wszystkie na miejscu , ale tutaj to szybki wstęp: na 1 pogrubienia tekstu,31
sprawia, że czerwone i43
daje żółtym tle.32
lub33
byłyby w różnych kolorach i44
lub45
byłyby w różnych środowiskach: masz pomysł. Możesz nawet sprawić, by mrugał (za pomocą a5
), jeśli masz na to ochotę.To nie używa żadnych specjalnych modułów Perla, a Perl jest prawie wszechobecny, więc spodziewałbym się, że będzie działać prawie wszędzie. Rozwiązanie grep jest bardzo sprytne, ale przełącznik --color na grep nie jest dostępny wszędzie. Na przykład, właśnie wypróbowałem to rozwiązanie na boksie Solaris z uruchomionym bashem, innym uruchomionym ksh i moją lokalną maszyną Mac OS X z systemem zsh. Wszystko działało dobrze.
grep --color
Jednak Solaris dusił się w tym rozwiązaniu.Ponadto potwierdzenie jest niesamowite i polecam go każdemu, kto go jeszcze nie odkrył, ale miałem problemy z instalacją go na kilku serwerach, na których pracuję. (Zapominam dlaczego: Myślę, że wymagało to modułów Perla).
Ponieważ nie sądzę, żebym kiedykolwiek pracował nad urządzeniem Unix, w którym nie zainstalowano Perla (z wyjątkiem systemów osadzonych, routerów Linksys itp.), Powiedziałbym, że jest to rozwiązanie uniwersalne .
źródło
Zamiast używać Grep, możesz użyć Less:
Szukaj w ten sposób:
/pattern
EnterSpowoduje to:
Aby przewinąć do następnej pasującej linii:
n
Aby przewinąć do poprzedniej pasującej linii:
N
Aby przełączyć podświetlanie: Esc
u
Możesz także zmienić kolor podświetlenia, jeśli chcesz.
źródło
Możesz spróbować:
Jednak niezbyt przenośny i nawet jeśli Perl jest zainstalowany, może być konieczne pobranie innego modułu. Ponadto pokoloruje całą linię, a nie tylko szukane słowo.
źródło
ripgrep
Użyj
ripgrep
z jego--passthru
parametrem:Jest to jedno z najszybszych narzędzi greppingowych , ponieważ zostało zbudowane na silniku regularnym Rust, który wykorzystuje skończone automaty, SIMD i agresywne optymalizacje dosłowne, aby wyszukiwanie było bardzo szybkie.
źródło
Jest o wiele łatwiejszy sposób na zrobienie tego dla GNU grep, ale nie sądzę, aby był przenośny (tj. BSD grep):
W rurze:
cat <file> | grep --color=always -z <query>
W pliku:
grep --color=always -z <query> <file>
Zasługa odpowiedź Cyrusa tutaj .
źródło
--color
nie jest standardem .)Żadna z podanych dotychczas odpowiedzi nie stanowi przenośnego rozwiązania.
Tutaj jest przenośnym 1 funkcja powłoki ja już pisał w zamkniętym jako powtórzenie pytania, które nie wymaga narzędzi innych niż standardowe lub rozszerzenia niestandardowe zaopatrzone
perl
,ack
,ggrep
,gsed
,bash
i lubi ale tylko potrzebuje powłoki POSIX i POSIX obowiązkowych narzędzised
orazprintf
:Możesz użyć tego w ten sposób:
Kolor podświetlenia można dostosować za pomocą jednego z tych kodów w argumencie polecenia sed (tutaj 32m jest zielony):
1 Tak długo, jak twój terminal obsługuje sekwencje specjalne kolorów ANSI.
źródło
sed
Wersja, działa na obubash
iash
.źródło
OP poprosił o to
grep
i JA POLECAM ; ale po trudach rozwiązania problemused
, dla przypomnienia, oto proste rozwiązanie:lub
Pomaluje
main
na czerwono.\E[31m
: sekwencja początkowa koloru czerwonego\E[0m
: gotowy znak koloru&
: dopasowany wzór/g
: wszystkie słowa w linii, nie tylko pierwsze$'string'
to ciągi bash z interpretowanymi znakami ucieczkiJeśli chodzi o grep , działa również przy użyciu
^
(początek linii) zamiast$
(koniec linii). Przykład:I żeby pokazać ten zwariowany alias, którego NIE POLECAM , możesz nawet pozwolić na otwarte cytaty:
cała praca! :) Nie martw się, jeśli zapomnisz zamknąć cytat, bash zapamięta cię „ciągłym znakiem linii”.
źródło