it-swarm.it

Evidenzia testo simile a grep, ma non filtrare il testo

Quando si utilizza grep, evidenzierà qualsiasi testo in una riga con una corrispondenza alla tua espressione regolare.

Cosa succede se desidero questo comportamento, ma grep stampa anche tutte le righe? Sono venuto vuoto dopo una rapida occhiata alla pagina man di grep.

232
Martin Konecny

Usa ack. Dai un'occhiata alla sua opzione --passthru qui: ack . Ha l'ulteriore vantaggio di consentire espressioni regolari Perl complete.

$ ack --passthru 'pattern1' file_name

$ command_here | ack --passthru 'pattern1'

Puoi anche farlo usando grep in questo modo:

$ grep --color -E '^|pattern1|pattern2' file_name

$ command_here | grep --color -E '^|pattern1|pattern2'

Ciò corrisponderà a tutte le linee ed evidenzierà i motivi. ^ corrisponde a ogni inizio di riga, ma non verrà stampato/evidenziato poiché non è un carattere.

(Nota che la maggior parte delle configurazioni userà --color di default. Potrebbe non essere necessario quel flag).

232
holygeek

Puoi assicurarti che tutte le linee corrispondano ma non c'è nulla da evidenziare sulle corrispondenze irrilevanti

egrep --color 'Apple|' test.txt 

Note:

  • egrep può essere scritto anche grep -E
  • --color è in genere predefinito nella maggior parte delle distribuzioni
  • alcune varianti di grep "ottimizzeranno" la corrispondenza vuota, quindi potresti voler usare invece "Apple | $" (vedi: https://stackoverflow.com/a/13979036/939457 )
89
Sorin

EDIT:

Funziona con grep di OS X Mountain Lion:

grep --color -E 'pattern1|pattern2|$'

È meglio di '^|pattern1|pattern2' perché la parte ^ dell'alternanza corrisponde all'inizio della riga mentre $ corrisponde alla fine della riga. Alcuni motori delle espressioni regolari non evidenziano pattern1 o pattern2 perché ^ è già abbinato e il motore è desideroso .

Qualcosa di simile accade per 'pattern1|pattern2|' perché il motore regex nota che l'alternanza vuota alla fine della stringa del modello corrisponde all'inizio della stringa del soggetto.

[1]: http://www.regular-expressions.info/engine.html

PRIMA MODIFICA:

Ho finito per usare Perl:

Perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'

Ciò presuppone che tu abbia un terminale compatibile ANSI.

RISPOSTA ORIGINALE:

Se sei bloccato con uno strano grep, questo potrebbe funzionare:

grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'

Regola i numeri per ottenere tutte le linee che desideri.

Il secondo grep rimuove solo le righe -- estranee inserite da grep in stile BSD su Mac OS X Mountain Lion, anche quando il contesto delle partite consecutive si sovrappone.

Pensavo che GNU grep omettesse le righe -- quando il contesto si sovrappone, ma è passato un po 'di tempo, quindi forse ricordo male.

32
willkil

Puoi usare il mio highlight script da https://github.com/kepkin/dev-Shell-essentials

È migliore di grep perché puoi evidenziare ogni corrispondenza con il suo colore proprio .

$ command_here | highlight green "input" | highlight red "output"

enter image description here

27
kepkin

Dal momento che vuoi evidenziare le partite, questo è probabilmente per il consumo umano (al contrario di piping ad un altro programma per esempio), quindi una soluzione di Nizza sarebbe quella di usare:

less -p <your-pattern> <your-file>

E se non ti interessa la sensibilità del caso:

less -i -p <your-pattern> <your-file>

Questo ha anche il vantaggio di avere pagine, il che è bello quando si deve passare attraverso un output lungo

15
acros

Puoi farlo usando solo grep:

  1. leggendo il file riga per riga
  2. abbinando un motivo in ogni riga ed evidenziando il motivo per grep
  3. se non c'è corrispondenza, fai eco alla linea così com'è

che ti dà quanto segue:

while read line ; do (echo $line | grep PATTERN) || echo $line  ; done < inputfile
4
jackhab

Se vuoi stampare "tutte" le linee, c'è una semplice soluzione funzionante:

grep "test" -A 9999999 -B 9999999
  • A => Dopo
  • B => Prima
2
Leon X. W.

Se lo stai facendo perché desideri più contesto nella tua ricerca, puoi farlo:

cat BIG_FILE.txt | less

Effettuare una ricerca in less dovrebbe evidenziare i termini di ricerca.

O reindirizza l'output al tuo editor preferito. n esempio :

cat BIG_FILE.txt | vim -

Quindi cerca/evidenzia/sostituisci.

0
dgo.a