grep dentro di meno?


58

Attualmente sto vagliando molti registri sconosciuti alla ricerca di alcuni problemi. Il primo file che guardo è Events.log e ottengo almeno tre pagine in lesscui sembra mostrare lo stesso evento in momenti diversi, un evento che sembra essere abbastanza benigno. Vorrei filtrare questo evento e al momento esco lesse faccio qualcosa del genere

grep -v "event text" Events.log | less

Questo ora porta un certo numero di altri eventi comuni e poco interessanti che vorrei filtrare. C'è un modo che io possa grep -v all'interno di less? Piuttosto che doverlo fare

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

Mi sembra una caratteristica utile quando guardo qualsiasi tipo di file di registro - e se lessnon è lo strumento, ce n'è un altro con le qualità che cerco? Solo un lessvisualizzatore di stile con incorporato grep.

Risposte:


91

lessha una corrispondenza del modello molto potente. Dalla pagina man :

&pattern

    Visualizza solo le linee che corrispondono al pattern; le linee che non corrispondono al pattern non vengono visualizzate. Se patternè vuoto (se si digita &immediatamente seguito da ENTER), tutti i filtri vengono disattivati ​​e vengono visualizzate tutte le righe. Mentre il filtro è attivo, viene visualizzata una e commerciale all'inizio del prompt, per ricordare che alcune righe nel file potrebbero essere nascoste.

    Alcuni personaggi sono speciali come nel /comando :

    ^N o !

      Visualizza solo le righe che NON corrispondono a pattern.
    ^R
      Non interpretare i metacaratteri delle espressioni regolari; cioè, fai un semplice confronto testuale.

    ____________
    Alcuni caratteri sono speciali se inseriti all'inizio del pattern; modificano il tipo di ricerca piuttosto che diventare parte del pattern.

   (Ovviamente ^Ne ^Rrappresentano Ctrl+ N e Ctrl+ R, rispettivamente.) 

Quindi, ad esempio, &dnsvisualizzerà solo le linee che corrispondono al modello dnse &!dnsfiltrerà (escluderà) quelle linee, visualizzando solo le linee che non corrispondono al modello.

Si nota nella descrizione del /comando che

    È patternun'espressione regolare, come riconosciuto dalla libreria di espressioni regolari fornita dal sistema.

Così

  • &eth[01]  visualizzerà le righe contenenti eth0oeth1
  • &arp.*eth0visualizzerà le righe contenenti arpseguite daeth0
  • &arp|dns  visualizzerà le righe contenenti arpodns

E il !può invertire una qualsiasi delle precedenti. Quindi il comando che vorresti usare per l'esempio nella tua domanda è:

&!event text|something else|the other thing|foo|bar

Utilizzare anche e per cercare (e / per passare al successivo / precedente)./pattern?patternnN


1
Questo è quasi arrivato! In less, usando '&! <1stpattern>' mi permette di 'nascondere' le linee con un pattern attivo, tuttavia si applica solo a un pattern alla volta, quindi se trovo un secondo pattern e applico '&! <2ndpattern>', le linee che corrispondono al primo motivo e che erano nascoste, sono ora visibili. Così vicino!
forquare,

@forquare: c'è una cronologia dei comandi a cui puoi accedere con i tasti freccia su e giù. Quindi premere &!e quindi premere un tasto freccia.
PM 2Ring

@forquare: E ho appena scoperto che la cronologia è stata salvata, quindi i tuoi vecchi schemi saranno disponibili alla prossima esecuzione less; Tuttavia, non so se viene conservato dopo il riavvio.
PM 2Ring

1
@orion che era l'ultimo pezzo che mi mancava - come concatenare gli schemi insieme. Pensavo di aver già provato il simbolo della pipa in precedenza e non è riuscito, ma ora riprovo che funziona! Quindi: &! <pattern1> | <pattern2> | <pattern3> rimuoverà le linee con pattern1 o pattern2 o pattern3
forquare

1
L'avevo capito. Homebrew dupes ha l'ultima versione. Ho dovuto dare dei calci a bash perché non stava afferrando il file giusto (anche se mi ha detto che stava afferrando / user / local / bin / less).
Spinlock

7

Basandosi sulla risposta di Orione , la less(1)pagina man descrive

/pattern

    Cerca in avanti nel file la N -esima riga contenente il pattern.  N † il valore predefinito è 1. È patternun'espressione regolare, come riconosciuto dalla libreria di espressioni regolari fornita dal sistema. La ricerca inizia alla seconda riga visualizzata (ma vedere le opzioni -ae -j, che cambiano questa).

    Alcuni caratteri sono speciali se inseriti all'inizio del pattern; modificano il tipo di ricerca piuttosto che diventare parte del pattern:

    ^N o !

      Cerca le righe che NON corrispondono a pattern.
    ^E o *
      Cerca più file. Cioè, se la ricerca raggiunge la FINE del file corrente senza trovare una corrispondenza, la ricerca continua nel file successivo nell'elenco della riga di comando.
    ^F o @
      Inizia la ricerca nella prima riga del PRIMO file nell'elenco della riga di comando, indipendentemente da ciò che è attualmente visualizzato sullo schermo o dalle impostazioni delle opzioni -ao -j.
    ^K
      Evidenzia qualsiasi testo che corrisponda patterna nella schermata corrente, ma non passare alla prima corrispondenza (MANTENERE la posizione corrente).
    ^R
      Non interpretare i metacaratteri delle espressioni regolari; cioè, fai un semplice confronto testuale.

    ____________
    † I comandi possono essere preceduti da un numero decimale, chiamato N nelle descrizioni ...

   (Naturalmente ^Ne ^E, ecc., Rappresentano Ctrl+ Ne Ctrl+ E, ecc.) 

Si scopre che e lavorare bene insieme. Ad esempio, i comandi&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

digitato in qualsiasi ordine, nasconderà (escludere) tutte le righe che contengono arpo dns(come grep -v), e poi, nelle linee rimanenti, mettono in evidenza tutte le occorrenze di fail, fatal, fault, o qualsiasi cosa che sembra il nome di un dispositivo SCSI ( sd[a-z][0-9]). Si noti che le righe che contengono arpo dns, e anche failo una qualsiasi delle altre parole di pericolo, non verranno visualizzate.


2

Negli ultimi mesi, mi sono un po 'innamorato di fzf.

Nel tuo caso, finché non è necessario contesto (vale a dire, l'equivalente di grep di -A, -Bo -Cnon è necessario, e tra l'altro, meno sta &ha anche la stessa limitazione), poi FZF è uno strumento molto potente.

Ecco un esempio sciocco:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

Se lo esegui e giochi con input simili aa | bb dd | ee !gg !hhe così via, vedrai rapidamente cosa sta succedendo.

La documentazione di Fzf sull'operatore |è scarsa, ma la mia migliore ipotesi è che si applica solo ai termini immediatamente prima e dopo, il che significa, in effetti, che OR ha la precedenza su AND (il che è implicito ; tutti i termini sono AND-ed di default) . Ma nella maggior parte dei casi questo non dovrebbe essere un problema e le cose vanno bene nella mia esperienza.

Dagli Un colpo. L'ho trovato sorprendentemente utile quando si tratta di sfogliare le cose quando non sono davvero sicuro di cosa sto cercando e quando il contesto non ha importanza.

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.