Podświetl wyniki wyszukiwania w konsoli, wyświetlając cały wynik polecenia

19

Kiedy używam np cat file.txt | grep --color=tty "pattern"., Podświetlam wzorzec, który wyszukuję. Kiedy chcę trochę więcej kontekst wokół każdego trafienia, grep ma -A, -Bi -Cparametry.

Chcę jednak wyświetlić cały plik (lub dowolne wyjście polecenia) i podświetlić określony wzorzec. Czy istnieje takie polecenie podświetlenia lub narzędzie?

DerMike
źródło
Czym różni się to, co chcesz teraz robić od tego, co już robisz?
Benjamin Bannier

Odpowiedzi:

22

Na unix.stackexchange.com pojawiła się odpowiedź, która miała tę fajną sztuczkę:

grep -E --color 'pattern|$' file.txt

lub

grep --color 'pattern\|$' file.txt

który pasuje do twojego wzorca lub końca linii na każdej linii. Podświetlany jest tylko wzór.

Wstrzymano do odwołania.
źródło
+1 Proste i łatwe do dostosowania do zgrep, bzgrep itp. Fajnie!
Stefan Lasiewski
Czy jest jakiś sposób na uniknięcie pisania - kolor przez cały czas? Myślę, że osadzenie opcji koloru w grep jest dość proste, nie jestem pewien, dlaczego za każdym razem wyraźnie wpisujemy kolor. Próbowałem utworzyć skrypty, które mówią, że pliki grepd mają bash, mówiąc: grep - kolor 1 $ 2 $, ale to nie działa. Wszelkie wskazówki tutaj, aby to naprawić, proszę
Srujan Kumar Gulla
1
@lordlupine: Dodaj GREP_OPTIONS='--color'do swojego ~/.bashrc(lub zmodyfikuj ustawienie, aby uwzględnić --color). Musisz uruchomić nowy terminal lub wykonać to przypisanie w wierszu poleceń w bieżącym terminalu, aby zadziałało.
Wstrzymano do odwołania.
9

Lubię potwierdzenie .

ack --passthru somepattern filename

To jest jak grep, ale lepiej. Podświetla domyślnie, a z --passthruopcją pokazuje cały plik (lub standardowe wejście) zamiast tylko pasujących linii.

Adam Batkin
źródło
1
Jeśli próbujesz przesłać dane wyjściowe do potwierdzenia, np. Z tail, musisz również użyć tej --filteropcji. Na przykład:tail -f myLogFile | ack --filter --passthru pattern
sparrowt
5

Polecam również użycie less(lub takiego), ale chcę pokazać bardziej dydaktyczne rozwiązanie. Po zdefiniowaniu tej funkcji:

funkcja podświetlenia ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Możesz użyć tego w następujący sposób:

command | highlight pattern
highlight pattern file.txt

Uwaga: w tej wersji rozróżniana jest wielkość liter, aby zmienić tę, która jest dołączana ipo wyrażeniu.gsed

Cyrus
źródło
1
Przywołałbym tputzamiast zakodować wartości. W ten sposób unikniesz również używania echo -e, które może mieć inne efekty.
Ignacio Vazquez-Abrams
Masz całkowitą rację, przeszukałem go bez powodzenia. Dzięki.
cyr
Ta wersja nie potrzebuje nawiasów przechwytujących i może być uruchamiana przez prog | highlight "pattern"lub highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
Wstrzymana do odwołania.
Moje sedumiejętności w zasadzie nie istnieją. Jak musiałbym to zmienić, aby dopasować wielkość liter do wzorca. W każdym razie dodam ten do moich funkcji bash_funkcje. Dziękuję Ci bardzo.
DerMike,
@DerMike: Teraz rozróżniana jest wielkość liter.
cyr
3

Dokonanie tego będzie -Cmiało grepwystarczająco wysoką wartość.

Ignacio Vazquez-Abrams
źródło
Mógłbym przysiąc, że ostatnio dostałem coś jeszcze. (Każdy pasuje do kontekstu z separatorami „-----” pomiędzy nimi.) Teraz, gdy mi powiedziałeś, działa dobrze :-) Dziękuję.
DerMike,
Oddzieli każdy mecz, jeśli nie ma wystarczającego kontekstu.
Ignacio Vazquez-Abrams
3

less podkreśla wzór, więc

less -p 'mypattern' file.txt

lub

ridiculously | long | pipe | less

a potem w mniej, /aby wyszukać wzór, który zostanie podświetlony.

Dygresja:

Możesz poprawić swoje polecenie, na przykład
ustawić alias alias grep="grep --color=tty"i używać go w następujący sposób:

grep 'mypattern' file.txt;
Casual Coder
źródło
1
powinieneś powstrzymać się od używania GREP_OPTIONS, zamiast tego użyj aliasu. patrz: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Primum non nocere. oddalony.
Casual Coder,
GREP_OPTIONS jest używany przez wiele form grep(zgrep, bzgrep, bzfgrep itp.) Tak więc, jeśli chcesz, aby wszystkie formy grep zachowywały się spójnie, musisz ustawić alias dla każdej formy grep. Nowa odpowiedź @ Casual powyżej nie przyda się z czymś takim bzgrep pattern /var/log/messages.?.gz, co jest przykładem, w którym podświetlenie koloru BARDZO pomocne.
Stefan Lasiewski
1

Jest ładne narzędzie supercat , które służy dokładnie temu celowi. Może zarówno pokolorować dane wyjściowe konsoli, jak i wygenerować „podświetlony” HTML z wprowadzonych danych.

Iwan Tarasow
źródło
Dzięki, to wygląda obiecująco. Jednak w tej chwili nie mogę go uruchomić.
DerMike,
1
Spójrz na jego pliki konfiguracyjne (w /etc/supercat Ubuntu), które ustawiają reguły kolorowania, są to w zasadzie pary kolor / wyrażenie regularne (z kilkoma dodatkowymi regułami); strona podręcznika jest również krótka i ładna.
Ivan Tarasov
Znalazłem spcrcplik składni vima na vim.org/scripts/script.php?script_id=2676
DerMike,