Daher habe ich eine Reihe von Apache-Protokollen mit dem Standardprotokollformat. Ich möchte alle Protokollzeilen abrufen, die nicht von einem Webcrawler stammen.
Nehmen wir also an, ich habe eine Datei robot_patterns mit Einträgen wie
Googlebot
msnbot-media
YandexBot
bingbot
Wenn ich den Befehl ausführe grep -f robot_patterns *.log
, erhalte ich alle Einträge von Bots, die den obigen Mustern entsprechen. Meine aktuelle Liste enthält ca. 30 Einträge von Bots und Agenten, die ich ignorieren möchte.
Aber ich möchte alle Einträge finden, die NICHT von Bots stammen . Also versuche ich grep -v -f robot_patterns *.log
und es werden keine Ergebnisse von grep zurückgegeben. Dies ist nicht das, was ich erwarte oder wünsche, und ich finde keinen offensichtlichen Weg, um das zu bekommen, was ich will. Wenn Sie die -v
Option mit mehreren Mustern in einer Datei kombinieren, gibt grep nur dann eine übereinstimmende Zeile zurück, wenn sie mit JEDEM Muster übereinstimmt.
GNU grep 2.6.3
.Antworten:
Befindet sich eine leere Zeile in der Musterdatei, stimmt diese mit jeder Zeile überein, sodass keine Zeilen mit zurückgegeben werden
-v
. Dies liegt daran, dass die Zeilen als reguläre Ausdrücke interpretiert werden und ein leerer regulärer Ausdruck immer übereinstimmt.Dies ist jedoch kein Problem
-F
, dagrep
Leerzeilen mit ignoriert werden-F
.-F
Verursachtgrep
, dass die Zeilen als einfache Zeichenfolgen interpretiert werden, nach denen gesucht werden muss, und beschleunigt sich möglicherweise,grep
wenn reguläre Ausdrücke nicht benötigt werden.quelle
fgrep
ignorierte diese leere Zeichenkette als Fehler, der in 2.19 behoben wurde ( commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b , also sollten Sie sich nicht darauf verlassen.Du kannst es versuchen:
quelle