Ogoniam plik dziennika flagą -f. Następnie przesyłam to do grep, aby znaleźć tylko linie zawierające „X”. To działa idealnie dobrze. Teraz chcę ponownie potokować to do innego grepa, który usunie wszystkie linie zawierające „Y”. Po dodaniu drugiego potoku plik przestaje się odświeżać i wygląda na to, że nie nadchodzą żadne dane.
To polecenie działa: tail -f my_file.log | grep "X"
To polecenie, które nie: tail -f my_file.log | grep "X" | grep -v "Y"
Jak powinienem to ustrukturyzować, aby polecenie działało?
command-line
grep
Ori Horev
źródło
źródło
tail -f file|grep -v "Y"
. jeśli wynik jest w porządku, przejdź do dołączeniagrep "X"
.Odpowiedzi:
Ponieważ dane wyjściowe
grep
są buforowane, użyj--line-buffered
opcji,grep
aby włączyć buforowanie linii:Jeśli
grep
nie masz takiej opcji, możesz użyćstdbuf
jako alternatywy:źródło
stdbuf
powiedzieć,libstdbuf.so
jakich ustawień użyć.diff -u <(env) <(stdbuf env)
i nie znalazłem żadnych. Ale teraz zdaję sobie sprawę, że powinienem był to przetestowaćdiff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
nie daje żadnego wyniku. Czy mógłbyś mi pomóc.Zwykle uważam, że jest bardziej przydatny
awk
do tego rodzaju kontroli logicznych:Testowany przez dwie zakładki, jedną w której ciągle piszę,
seq 20 >> myfile
a drugą na przykładtail -f myfile | awk '/3/ && !/13/'
.źródło
Innym podejściem byłoby użycie pojedynczego
grep
wywołania zamiast dwóch, aby uniknąć problemu buforowania. Wystarczy użyć wyrażeń regularnych, które pasują do wierszy zawierających 0 lub więcej znaków innych niż Y, następnie X, a następnie 0 lub więcej znaków innych niż Y do końca wiersza „źródło