Evidenzia l'output di ricerca della console, visualizzando l'intero output del comando


19

Quando uso ad es cat file.txt | grep --color=tty "pattern". Ottengo lo schema che cerco evidenziato. Quando voglio un po 'di contesto attorno ad ogni colpo, grep ha le -A, -Be -Cparametri.

Tuttavia, voglio visualizzare l'intero file (o qualunque output del comando) ed evidenziare un certo schema. Esiste un comando o uno strumento di questo tipo?


In che modo ciò che vuoi fare ora è diverso da quello che già fai?
Benjamin Bannier,

Risposte:


22

C'era una risposta su unix.stackexchange.com che aveva questo trucco pulito:

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

o

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

che corrisponde al modello o alla fine della riga su ciascuna riga. Viene evidenziato solo il motivo.


+1 Semplice e facilmente adattabile a zgrep, bzgrep, ecc. Bello!
Stefan Lasiewski,

Esiste un modo per evitare di digitare --color sempre? Penso che sia abbastanza semplice incorporare l'opzione di colore in grep, non sono sicuro del motivo per cui abbiamo esplicitamente inserito il colore ogni volta. Ho provato a creare script dicendo che i file grepd hanno un bash che dice grep --color $ 1 $ 2 ma non funziona. Qualsiasi indizio qui per risolvere questo problema, per favore
Srujan Kumar Gulla,

1
@lordlupine: aggiungi GREP_OPTIONS='--color'al tuo ~/.bashrc(o modifica l'impostazione da includere --color). Sarà necessario avviare un nuovo terminale o eseguire tale assegnazione dalla riga di comando nel terminale corrente per renderlo effettivo.
In pausa fino a nuovo avviso.

9

Mi piace ack .

ack --passthru somepattern filename

È come grep, ma meglio. Evidenzia per impostazione predefinita e con l' --passthruopzione mostra l'intero file (o input standard) anziché solo le righe corrispondenti.


1
Se stai provando a reindirizzare l'output in ack, ad esempio da tail, allora devi usare anche l' --filteropzione. Ad esempio:tail -f myLogFile | ack --filter --passthru pattern
sparrowt,

5

Raccomando anche l'uso di less(o simili), ma voglio mostrarti una soluzione più didattica. Dopo aver definito questa funzione:

evidenziazione della funzione ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Puoi usarlo in questo modo:

command | highlight pattern
highlight pattern file.txt

Nota: Questa versione è case sensitive, per cambiare che basta aggiungere idopo gnella sedespressione.


1
Invocerei tputinvece di codificare i valori. In questo modo si evita anche l'uso echo -e, che può avere altri effetti.
Ignacio Vazquez-Abrams,

Hai perfettamente ragione, l'ho cercato senza fortuna. Grazie.
cYrus,

Questa versione non necessita delle parentesi di acquisizione e può essere eseguita da prog | highlight "pattern"o highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
In pausa fino a ulteriore avviso.

Le mie sedabilità in pratica non esistono. Come dovrei cambiarlo per abbinare la distinzione tra maiuscole e minuscole. Ad ogni modo, aggiungerò quello al mio include bash_functions. Grazie mille.
DerMike,

@DerMike: ora fa distinzione tra maiuscole e minuscole.
cYrus,

3

Passare -Ca grepun valore sufficientemente alto farà questo.


Avrei potuto giurare di aver avuto qualcos'altro l'ultima volta che l'ho provato. (Ciascuno corrisponde al contesto con i separatori '-----' nel mezzo.) Ora che me l'hai detto, funziona bene :-) Grazie.
DerMike,

Separerà ogni corrispondenza, se non c'è abbastanza contesto.
Ignacio Vazquez-Abrams,

3

less sta evidenziando lo schema, quindi

less -p 'mypattern' file.txt

o

ridiculously | long | pipe | less

e quindi in meno /per cercare un modello che verrà evidenziato.

Nota a margine:

Puoi migliorare il tuo comando, ad esempio
impostare alias alias grep="grep --color=tty"e usarlo in questo modo:

grep 'mypattern' file.txt;

1
dovresti astenersi dall'utilizzare GREP_OPTIONS, usa invece l'alias. vedi: bugs.launchpad.net/ubuntu/+bug/67141
lesmana,

Primum non nocere. rimosso.
Casual Coder,

GREP_OPTIONS è utilizzato da molte forme di grep(zgrep, bzgrep, bzfgrep, ecc.) Quindi, se vuoi che tutte le forme di grep si comportino in modo coerente, dovresti impostare un alias per ogni forma di grep. La nuova risposta di @ Casual sopra non lo farà con qualcosa di simile bzgrep pattern /var/log/messages.?.gz, che è un esempio in cui l'evidenziazione dei colori è MOLTO utile.
Stefan Lasiewski,

1

C'è un simpatico strumento supercat , che serve esattamente a quello scopo. Può sia colorare l'output della console sia produrre un html "evidenziato" dal tuo input.


Grazie, sembra promettente. Tuttavia, al momento non riesco a farlo funzionare.
DerMike,

1
Dai un'occhiata ai suoi file di configurazione ( /etc/supercatsu Ubuntu), che impostano le regole di colorazione, sono sostanzialmente coppie color / regexp (con alcune regole extra); anche la pagina man è breve e carina.
Ivan Tarasov,

Ho trovato un spcrcfile di sintassi vim su vim.org/scripts/script.php?script_id=2676
DerMike
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.