GNU/Linux >> Linux Esercitazione >  >> Linux

grep per termine ed escludi un altro termine

A e espressioni con grep hai bisogno di due invocazioni:

grep -Ei "search term" | grep -Eiv "exclude term"

Se i termini che stai cercando non sono espressioni regolari, utilizza la corrispondenza di stringhe fissa (-F ) che è più veloce:

grep -F "search term" | grep -Fv "exclude term"

A parte l'invocazione di grep due volte, c'è solo un modo a cui riesco a pensare per ottenere questo risultato. Coinvolge Perl Compatible Regular Expressions (PCRE) e alcune asserzioni piuttosto confuse.

Per cercare foo escludendo le corrispondenze che contengono barra , puoi utilizzare:

grep -P '(?=^((?!bar).)*$)foo'

Ecco come funziona:

  • (?!bar) corrisponde a tutto ciò che non barra senza consumare caratteri dalla stringa. Poi . consuma un solo carattere.

  • ^((?!bar).)* ripete quanto sopra dall'inizio della stringa (^ ) fino alla fine ($ ). Fallirà se bar si incontra in un dato punto, a partire da (?!bar) non corrisponderà.

  • (?=^((?!bar).)*$) assicura che la stringa corrisponda al modello precedente, senza consumare caratteri dalla stringa.

  • foo cerca foo come al solito.

Ho trovato questo trucco in Espressione regolare per abbinare la stringa che non contiene una parola?. Nella risposta di Bart Kiers, puoi trovare una spiegazione molto più dettagliata di come funziona la previsione negativa.


Se vuoi farlo in un solo passaggio, puoi usare awk invece di grep.

Formato:

echo "some text" | awk '/pattern to match/ && !/pattern to exclude/'

Esempi:

  • echo "hello there" | awk '/hello/ && !/there/'

Non restituisce nulla.

  • echo "hello thre" | awk '/hello/ && !/there/'

Restituisce:ciao tre

  • echo "hllo there" | awk '/hello/ && !/there/'

Non restituisce nulla.

Per più modelli, puoi utilizzare le parentesi per raggrupparli.

Esempi:

  • echo "hello thre" | awk '(/hello/ || /hi/) && !/there/'

Restituisce:ciao tre

  • echo "hi thre" | awk '(/hello/ || /hi/) && !/there/'

Restituisce:ciao tre

  • echo "hello there" | awk '(/hello/ || /hi/) && !/there/'

Non restituisce nulla.

  • echo "hi there" | awk '(/hello/ || /hi/) && !/there/'

Non restituisce nulla.


Linux
  1. Bash For Loop Guida ed esempi

  2. Utilizzare Command Grep e individuare?

  3. Linux:come grep per una parola specifica e afferrare il testo?

  4. 10 esempi pratici di comandi Grep per sviluppatori

  5. Linux cerca la parola e mostra l'intera riga

Come escludere in Grep

Come Grep per più stringhe e pattern

Come eliminare le righe vuote nei file utilizzando Grep, Sed e Awk

Supporto per Tmux, Term e 256 colori?

50 Comando grep produttivo e pratico per gli appassionati di Linux

Come afferrare una parola specifica e afferrare il testo