grep: mostra tutto l'output ma evidenzia le corrispondenze di ricerca


40

in bash, se voglio eseguire un comando e visualizzare solo le righe di output che corrispondono a un determinato modello, posso reindirizzarlo grep, come

file testfile

hello
there
my
friends

comando

$ cat testfile | grep 'hello'
hello #this will be highlightd

questo evidenzierà la corrispondenza di ricerca e visualizzerà l'intera riga su cui cade. Posso usare -Ae -Bvisualizzare le linee prima e dopo quella linea. La mia domanda è: è possibile eseguire il comando e visualizzare tutti gli output normalmente, ma evidenziare le corrispondenze di ricerca come farebbe grep? quindi il mio risultato sarebbe

hello #highlighted
there
my
friends

Risposte:


38

Per utilizzare un GREP a colori per evidenziare solo i motivi corrispondenti ma non modificare in altro modo l'output:

grep --color=always -e "^" -e "hello" testfile

Il primo motivo corrisponderà a tutte le linee (verranno stampate tutte le linee) il secondo motivo (e tutti i seguenti motivi) fanno evidenziare a colori il testo corrispondente.

Poiché il primo motivo corrisponde a tutte le righe ma non corrisponde a un carattere stampabile, non aggiunge l'evidenziazione del colore, quindi non compete / interferisce con la leggibilità del testo evidenziato.


Funziona con kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"in zsh
Michael Cole,

Per l'uso in Bash: highlight () {grep --color = always -e "^" -e $ *; }
Jon

Funziona anche su FreeBSD, devi solo scambiare il primo e il secondo patern ( "^"deve essere il secondo).
Marián Černý,

25

Aggiungi un'opzione -zal tuo comando GNU grep:

cat testfile | grep --color=always -z 'hello'

o più corto

grep --color=always -z 'hello' testfile

3
Questo è un trucco molto rozzo. Ha l'effetto di trattare l'intero file come una singola riga. Pertanto, (1) se il file è molto grande, ci può essere la possibilità di corto di memoria, e (2) se il file non contiene il modello affatto , allora nulla sarà uscita.
G-Man dice "Ripristina Monica" il

Su quale versione di grep è supportato? Su grep 2.5.4, -z non sembra disponibile ...
Alex

@Alex: ho usato GNU grep versione 2.6.3.
Cyrus,

2
@ G-Man: più risparmio di risorse:grep --color "hello\|$" file
Cyrus

@Cyrus: Sì, questa è una risposta migliore. Sfortunatamente, è essenzialmente equivalente alla risposta di bot779 a questa domanda, e quasi identico alle risposte accettate ( 1 e 2 ) alle domande a cui ho collegato.
G-Man dice "Reinstate Monica" il

4

Analogamente alla risposta precedente, puoi prendere tutte le $estremità delle righe:

cat testfile | grep --color -E "hello|$"

-E(o --extended-regexp) significa che è necessario sfuggire ai caratteri speciali \. Quando lo si utilizza, |verrà trattato come regex "OR" condizione.

Grep |$inoltre cattura e stampa tutte le linee che hanno una fine, ma poiché $ è un carattere nascosto, non può essere evidenziato.

Aggiornare:

Se desideri stampare tutto l'output, ma anche restituire il codice di uscita , sia che la corrispondenza sia stata trovata o meno, puoi utilizzare il comando perl:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Se preferisci sed - Ecco un esempio di come evidenziare tutte le partite + restituire il codice di uscita se non viene trovata alcuna corrispondenza: https://askubuntu.com/a/1200851/670392


2

Questo funziona con GNU grep e con grep su FreeBSD:

grep --color=always 'hello\|$'

Corrisponde al testo "ciao" o ( \|) alla stringa nulla non stampabile alla fine di ogni riga ( $). Ecco perché ogni riga viene stampata ma viene evidenziato solo "ciao".

È probabile che tu abbia già --color=autoconfigurato nella tua shell. Quindi molto probabilmente non è necessario specificare --color=always:

grep 'hello\|$'

Puoi anche semplificare la versione utilizzando egrep(con espressioni regolari estese), dove |per l'espressione "o" non è necessario eseguire l'escape:

egrep 'hello|$'

Questo non risponde come visualizzare tutte le righe di input.
Chris Page

@ChrisPage Direi di sì: ecco perché ogni riga viene stampata ma viene evidenziato solo "ciao".
Marián Černý,

0

Aggiungendo alla risposta in alto sopra. La funzione highlight {} menzionata nei commenti funziona solo quando i dati vengono reindirizzati al suo interno. Il seguente alias, sebbene non perfetto, è più utile:

alias greph="grep --color=always -e^ -e"

Funziona con comandi come:

greph foo bar.txt

cat bar.txt | greph foo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.