Partita negativa del modello multiplo di Grep


14

Quindi ho un sacco di registri Apache con l'utilizzo del formato di registro standard. Voglio ottenere tutte le linee di registro che non provengono da un crawler web.

Quindi diciamo che ho un file robot_patterns con voci come

Googlebot
msnbot-media
YandexBot
bingbot

Se eseguo il comando grep -f robot_patterns *.logotterrò tutte le voci dai robot che corrispondono ai modelli sopra. La mia lista attuale ha ~ 30 voci di robot e agenti che desidero ignorare.

Ma voglio trovare tutte le voci che NON provengono dai robot . Quindi provo grep -v -f robot_patterns *.loge grep non restituisce risultati. Questo non è ciò che mi aspetto o desidero, e non trovo un modo ovvio per ottenere ciò che voglio. Quando si utilizza l' -vopzione combinata con più pattern in un file, grep restituirà una riga corrispondente solo se corrisponde a OGNI pattern.


Quando l'ho provato sul mio sistema, grep -v -f ha avuto il comportamento desiderato, restituendo solo linee che non corrispondevano a nessuno degli schemi. Questo era con (GNU grep) 2.14.56-1e3d. Quale grep stai usando?
Wingedsubmariner,

Sto correndo GNU grep 2.6.3.
Zoredache,

4
Ho fatto qualche altro test e ho scoperto che se nel file dei pattern è presente una riga vuota, essa corrisponderà a tutte le righe, senza che alcuna riga venga restituita con -v. Tuttavia, questo non è un problema con -F e -F potrebbe velocizzare grep per il tuo compito - potrebbe valere la pena provarlo.
Wingedsubmariner,

Una riga vuota finale! Argh ... Questo sembra essere il problema. Se vuoi, dovresti aggiungerlo come risposta.
Zoredache,

Risposte:


8

Se nel file dei motivi è presente una riga vuota, essa corrisponderà a tutte le righe, senza che venga restituita alcuna riga -v. Questo perché le linee vengono interpretate come espressioni regolari e un'espressione regolare vuota corrisponderà sempre.

-FTuttavia, questo non è un problema , perché grepignora le righe vuote con -F.
-Fcausa grepl'interpretazione delle righe come semplici stringhe da cercare e può accelerare grepse non sono necessarie espressioni regolari.


1
GNU fgrepignorando che la stringa vuota finale era un bug risolto in 2.19 ( commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , quindi non dovresti fare affidamento su di essa
Stéphane Chazelas,

13

Puoi provare:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
Benvenuti in Unix e Linux. L'OP ha un elenco di circa 30 stringhe che vuole ignorare, e le quattro che ha presentato come esempi hanno una lunghezza media di dieci caratteri ciascuna, quindi è probabile che il tuo comando sia lungo più di 300 caratteri. È probabile che ciò sia difficile da mantenere (e persino da leggere). Puoi modificare la tua risposta in modo che sia guidata dall'elenco di stringhe del PO? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... PS Hai notato che la risposta è stata trovata? - L'OP ha imparato a far funzionare il suo approccio originale.
G-Man dice 'Reinstate Monica' il

2
Perché valutare negativamente la mia risposta? : /
Orsius

3
Bella risposta. Ha regex OR e l'opzione -vE è stata utile.
Kirt Carson,

3
Questa è la risposta alla domanda che molte persone stanno probabilmente cercando di risolvere.
Perfi,
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.