Ich verfolge eine Protokolldatei mit dem Flag -f. Dann leite ich dies an grep weiter, um nur Zeilen zu finden, die "X" enthalten. Das funktioniert einwandfrei. Jetzt möchte ich das noch einmal in ein anderes grep leiten, das alle Zeilen entfernt, die "Y" enthalten. Wenn ich die zweite Pipe hinzufüge, wird die Datei nicht mehr aktualisiert und es scheinen keine Daten zu kommen.
Dies ist der Befehl, der funktioniert: tail -f my_file.log | grep "X"
Dies ist der Befehl, der nicht: tail -f my_file.log | grep "X" | grep -v "Y"
Wie soll ich das so strukturieren, dass der Befehl funktioniert?
command-line
grep
Ori Horev
quelle
quelle
tail -f file|grep -v "Y"
. Wenn die Ausgabe in Ordnung ist, fahren Sie mit dem Anhängen fortgrep "X"
.Antworten:
grep
Verwenden Sie die--line-buffered
Option ofgrep
, um die Zeilenpufferung zu aktivieren, da die Ausgabe von gepuffert wird :Wenn Sie
grep
nicht über die Option verfügen, können Siestdbuf
alternativ Folgendes verwenden:quelle
stdbuf
sagt,libstdbuf.so
welche Einstellungen zu verwenden sind.diff -u <(env) <(stdbuf env)
und keine gefunden. Aber jetzt merke ich, dass das, was ich hätte testen sollen, wardiff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
es gibt keine ausgabe. Kannst du mir bitte Helfen.Ich finde normalerweise nützlicher
awk
für diese Art von logischen Prüfungen:Getestet mit zwei Registerkarten, von denen eine ich schreibe
seq 20 >> myfile
und die andere zum Beispieltail -f myfile | awk '/3/ && !/13/'
.quelle
Ein anderer Ansatz wäre, einen einzelnen
grep
Aufruf anstelle von zwei zu verwenden und so das Pufferungsproblem zu vermeiden. Verwenden Sie einfach einen regulären Ausdruck, der mit Zeilen übereinstimmt, die aus 0 oder mehr Nicht-Y-Zeichen bestehen, dann ein X und dann 0 oder mehr Nicht-Ys bis zum Ende der Zeile. "quelle