2013-01-16 13 views
13

Próbuję zbudować skrypt powłoki, aby monitorować niektóre pliki dziennika. Używam polecenie tak:ogon -f do grep do cięcia nie działa prawidłowo

tail -f /var/somelog | grep --line-buffered " some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " " 

plik dziennika jest tak:

some test and p l a c e h o l d e r 3 
some test and p l a c e h o l d e r 4 
some test and p l a c e h o l d e r 5 
some test and p l a c e h o l d e r 6 

i tak dalej .. Mój problem jest, że wyjście polecenia nie wyświetla ostatni linia

some test and p l a c e h o l d e r 6 

aż linii

some test and p l a c e h o l d e r 7 

zostanie dodane do dziennika.

Mam nadzieję, że wyjaśniłem mój problem. Czy ktoś może mi pomóc rozwiązać ten problem? Dziękuję :)

+4

Może linie dziennika nie kończą się linią, ale zaczynają się od jednego? W takim przypadku linia 6 nie byłaby kompletna, dopóki linia 7 nie uruchomi się i nie będzie podawana linia. Jeśli spojrzysz na plik dziennika, pokazujący wszystkie znaki, czy widzisz wiersz na końcu ostatniej linii? –

+0

Wyszukaj końcową nową linię ("\ n"), używając 'od -c/var/somelog'. – cdarke

+0

Czy widzisz to samo wyjście z 'tail -f'? Jeśli tak jest, to @David wskazał to poprawnie. – mtk

Odpowiedz

19

problem jest prawie na pewno związany z tym, jak grep i cut buforują ich wyjście. oto hack, które powinny cię sobie z tym problemem, choć jestem pewien, że są ładniejsze sposobów, aby to zrobić:

tail -f /var/somelog | while read line; do echo "$line" | grep "some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "; done 

(nie zapomnij ; done na końcu polecenia)

alternatywnie , ponieważ gawk nie bufor to wyjście, można używać go zamiast cut aby uniknąć kłopotliwe podczas pętli:

tail -f log | grep --line-buffered "some test and p l a c e h o l d e r" | gawk '{print $3,$4,$14}' 

Wyjazd http://www.pixelbeat.org/programming/stdio_buffering/ uzyskać więcej informacji na temat problemów buforujące.

+1

Jest również całkiem prawdopodobne, że cokolwiek pisze do '/ var/somelog' ma buforowanie, więc' tail' może nawet nie widzieć zmian dopóki nie przepełni bufora lub nie opróżni jego wyjścia w jakiś inny sposób ... – twalberg

+0

Próbowałem pierwszego rozwiązania i działa. Dziękuję za pomoc! –

+0

cieszymy się z pomocy. nie zapominaj, że najlepszym sposobem, aby podziękować tutaj, jest zaakceptowanie/przejęcie przydatnych odpowiedzi! :) – nullrevolution