Visualizza i file senza linee con una determinata stringa


12

Alla ricerca di un programma simile tailo lessche mi consente di visualizzare i miei registri senza righe che contengono una determinata stringa. Ad esempio, visualizza il mio syslog senza le [UFW BLOCK]righe di immissione UFW ( ).


Sebbene non sia facile fornire una soluzione alla descrizione esatta del problema con questa funzione, potresti essere interessato a sapere che lessoffre la possibilità di filtrare le linee visualizzate dopo un modello regex. È possibile utilizzare questa funzione digitando &seguito dal modello e ripristinarlo digitando da &solo.
Aaron,

Risposte:


13

L'opzione di inversione del pattern match -vper grepè davvero utile per questo:

grep -v 'UFW BLOCK' /var/log/syslog

Questo ti mostrerà tutte le righe che non contengono UFW BLOCK. Poiché greputilizza le espressioni regolari di base per impostazione predefinita, l'inclusione delle parentesi consentirà di cercare uno dei singoli caratteri di "UFW BLOCK" compreso lo spazio. Probabilmente finirai senza output. Se devi assicurarti che ci siano parentesi attorno alla stringa, scappa \[UFW BLOCK\]o usa l' -Fopzione di grepincludere solo stringhe fisse (grazie a Zanna e Steeldriver per il consiglio su questo):

grep -Fv '[UFW BLOCK]' /var/log/syslog

È possibile semplificare la visualizzazione eseguendo il piping dell'output a un cercapersone come less:

grep -v 'UFW BLOCK' /var/log/syslog | less

O reindirizza l'output su un file nella tua home directory per una visualizzazione successiva:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
Puoi anche usare il fgrepcomando che è equivalente a grep -F.
Tulains Córdova,

2
@ TulainsCórdova, l'uomo di grep afferma che "L'invocazione diretta come egrep o fgrep è deprecata, ma viene fornita per consentire alle applicazioni storiche che dipendono da esse di funzionare senza modifiche". Non so se agiranno mai su questa deprecazione, ma immagino che usare questi comandi non sia la migliore pratica
Aaron,

5

Puoi anche usare sedil dcomando di per eliminare le linee con il motivo dallo stream:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

Scappiamo []perché normalmente indicano una classe di caratteri, che significa "abbina qualsiasi cosa qui dentro"


5

È possibile utilizzare qualsiasi strumento con funzionalità di modifica. Ti sono già state fornite soluzioni usando grepe sed, qui ci sono alcune altre scelte. Tutti questi possono essere facilmente reindirizzati lesso moreo qualsiasi altra cosa.

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    Dato che questo è Perl, TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    

2

Puoi awkanche usare :

awk '!/PATTERN/' log

Lo uso quando ho più di un "modello" e non voglio usarne due grepcome:

... | grep -v foo | grep -v bar

quale è la sintassi:

awk '!/PATTERN/ && !/PATTERN2/' log

"Lo uso quando ho più di un" modello "e non voglio usare due grep come" ------ grep -Ev "foo|bar"?
αғsнιη,

È inoltre possibile utilizzare -eper definire più motivi. grep -v -e 'foo' -e 'bar'
Arronical,

@AFSHIN (Non so come il mio commento viene rimosso), intendevo per un logico e non oppure;)
Ravexina,

1

Con lessl' &opzione del comando è possibile filtrare per visualizzare solo lo schema corrispondente desiderato come di seguito,

& /PATTERN/

nel tuo caso se vuoi che le linee di filtro UFW BLOCKnon vengano visualizzate nell'output, puoi semplicemente usare &!come di seguito:

&! /UFW BLOCK/
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.