Correspondance négative de motif multiple Grep


14

J'ai donc un tas de journaux Apache en utilisant le format de journal standard. Je veux obtenir toutes les lignes de journal qui ne proviennent pas d'un robot d'exploration Web.

Disons donc que j'ai un fichier robot_patterns avec des entrées comme

Googlebot
msnbot-media
YandexBot
bingbot

Si j'exécute la commande grep -f robot_patterns *.log, j'obtiendrai toutes les entrées par des bots correspondant aux modèles ci-dessus. Ma liste actuelle contient environ 30 entrées de robots et d'agents que je souhaite ignorer.

Mais je veux trouver toutes les entrées qui ne proviennent PAS de bots . Donc j'essaye grep -v -f robot_patterns *.loget aucun résultat n'est retourné par grep. Ce n'est pas ce que j'attends ou ce que je désire, et je ne trouve pas un moyen évident d'obtenir ce que je veux. Lorsque vous utilisez l' -voption combinée avec plusieurs modèles dans un fichier, grep ne retournera une ligne correspondante que si elle correspond à CHAQUE modèle.


Lorsque j'ai essayé cela sur mon système, grep -v -f avait le comportement souhaité, ne renvoyant que des lignes qui ne correspondaient à aucun des modèles. C'était avec (GNU grep) 2.14.56-1e3d. Quel grep utilisez-vous?
wingedsubmariner

Je cours GNU grep 2.6.3.
Zoredache

4
J'ai fait quelques tests supplémentaires et j'ai constaté que s'il y avait une ligne vide dans le fichier de motifs, elle correspondrait à chaque ligne, ce qui ne retournerait aucune ligne avec -v. Cependant, ce n'est pas un problème avec -F, et -F pourrait accélérer la grep pour votre tâche - cela pourrait valoir la peine d'essayer pour vous.
wingedsubmariner

Une ligne vide de fin! Argh ... Cela semble être le problème. Si vous le souhaitez, vous devez ajouter cela comme réponse.
Zoredache

Réponses:


8

S'il y a une ligne vide dans le fichier de motifs, elle correspondra à chaque ligne, ne renvoyant aucune ligne avec -v. En effet, les lignes sont interprétées comme des expressions régulières et une expression régulière vide correspondra toujours.

Ce n'est pas un problème -Fcependant, car grepignore les lignes vides avec -F.
-Ffait grepinterpréter les lignes comme de simples chaînes à rechercher et peut accélérer grepsi les expressions régulières ne sont pas nécessaires.


1
GNU fgrepignorant cette chaîne vide de fin était un bogue qui a été corrigé en 2.19 ( commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , donc vous ne devriez pas vous y fier.
Stéphane Chazelas

13

Tu peux essayer:

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

2
Bienvenue sur Unix et Linux. L'OP a une liste d'environ 30 chaînes qu'il veut ignorer, et les quatre qu'il a présentées comme exemples ont une longueur moyenne de dix caractères chacune, donc votre commande est susceptible de dépasser 300 caractères. Cela sera probablement difficile à maintenir (et même à lire). Pouvez-vous modifier votre réponse en fonction de la liste de chaînes du PO? ……………………………………………………… PS Avez-vous remarqué que la réponse a été trouvée? - Le PO a appris à appliquer son approche originale au travail.
G-Man dit `` Réintègre Monica ''

2
Pourquoi évaluer négativement ma réponse? : /
Orsius

3
Très bonne réponse. A regex OR et l'option -vE a été utile.
Kirt Carson

3
C'est la réponse à la question que la plupart des gens essaient probablement de résoudre.
Perfi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.