grep esclude più stringhe


116

Sto cercando di vedere un file di registro usando tail -fe desidero escludere tutte le righe contenenti le seguenti stringhe:

"Nopaging the limit is"`  and `"keyword to remove is"

Sono in grado di escludere una stringa come questa:

tail -f admin.log|grep -v "Nopaging the limit is"

Ma come escludo le righe che contengono string1o string2.

Risposte:


107

Due esempi di filtraggio di più righe con grep:

Metti questo in filename.txt:

abc
def
ghi
jkl

comando grep utilizzando l'opzione -E con una barra verticale tra i token in una stringa:

grep -Ev 'def|jkl' filename.txt

stampe:

abc
ghi

Comando utilizzando l'opzione -v con pipe tra i token circondati da parentesi:

egrep -v '(def|jkl)' filename.txt

stampe:

abc
ghi

15
Sono sorpreso che nessuno abbia parlato del grep -v -e def -e jklmetodo che IMHO è più chiaro ...
Frizlab

4
O ancora meglio: grep -Fv -e def -e jklche è ancora più veloce!
Frizlab

11
Con il flag -F, puoi usare i newline come delimitatori invece di pipe. Ciò consente di utilizzare più facilmente l'output del comando come filtro, ad esempio:grep -vF $(pgrep myprocess)
Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F corrisponde a stringhe letterali (invece di regex)

-v inverte la corrispondenza

-e consente più modelli di ricerca (tutti letterali e invertiti)


1
Questa è la risposta giusta: l'unica che evita sia le grep -vistanze multiple che il requisito artificiale di una regex (consente di specificare in modo pulito le stringhe multiple in argomenti separati). Immagina di costruire quella regex in modo programmatico in uno script per stringhe che potrebbero contenere qualsiasi cosa ...
user2394284

In realtà nessuna di queste è una risposta corretta perché quando non si passa nessuna parola chiave da escludere si esclude tutto invece di niente.
Győri Sándor,

37

Un'altra opzione è creare un elenco di esclusioni, particolarmente utile quando si dispone di un lungo elenco di cose da escludere.

vi /root/scripts/exclude_list.txt

Ora aggiungi ciò che desideri escludere

Nopaging the limit is
keyword to remove is

Ora usa grep per rimuovere le righe dal file di log del file e visualizzare le informazioni non escluse.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
Non sapevo che potessi usare -vcon -f(o che quest'ultimo esistesse).
Sridhar Sarnobat

molto molto utile!
samaspin

Tieni presente che non è necessario creare un file temporaneo per l'elenco di esclusione. In bash puoi usare la sostituzione del processo. Questo è utile se l'elenco di esclusione è piuttosto dinamico e dovresti generarlo prima di ogni utilizzo per essere utilizzato solo una volta:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Puoi usare grep regolare in questo modo:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Questa risposta ha funzionato per me su MacOSX. Fuggire dal tubo è la chiave
Rebecca Dessonville,

5

I greps possono essere concatenati. Per esempio:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
Il problema qui è che invece di un processo che sarebbe filtrato, dovresti eseguire N processi in sequenza, dove ognuno di essi filtra qualcosa. Potrebbe rallentare le cose in modo significativo.
Artem Oboturov
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.