2009-06-09 17 views
26

Używam "tail-f", aby śledzić plik dziennika w jego aktualizacji; następnie wypakowuję wynik tego polecenia do grep, aby wyświetlić tylko wiersze zawierające wyszukiwane hasło ("org.springframework" w tym przypadku); Wreszcie chciałbym zrobić jest potokiem wyjście z grep trzecim poleceniu „cut”:W jaki sposób potoku wejściowego przez grep do innego narzędzia?

tail -f logfile | grep org.springframework | cut -c 25- 

Polecenie cut by usunąć pierwsze 25 znaków każdej linii dla mnie gdyby mógł dostać wejście z grep! (Działa zgodnie z oczekiwaniami, jeśli wyeliminuję "grep" z łańcucha.)

Używam cygwin z bash.

Rzeczywiste wyniki: Kiedy dodaję drugą rurę, aby połączyć się z poleceniem "Wytnij", wynikiem jest, że zawiesza się, jakby oczekiwał na dane wejściowe (w przypadku, gdy się zastanawiasz).

+0

Jeśli przestanę po grep (bez rury do 'cut') działa (bez usuwania pierwszych 24 lub 25 znaków). – les2

+0

Prawdziwy problem polega na tym, że 'tail -f' nigdy się nie kończy, więc reszta rurociągu czeka na więcej danych wejściowych – Hasturkun

Odpowiedz

10

W moim systemie około 8K zostało zbuforowane przed uzyskaniem jakiegokolwiek wyniku. Sekwencja ta pracowała śledzić plik natychmiast:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done 
+0

Właśnie wróciłem do tego i ten działał – les2

-1

Co powinieneś zrobić dobrze - to jest cała idea rurociągów. Jedyny problem jaki widzę to to, że w wersji cut mam (GNU coreutiles 6.10), powinieneś użyć składni cut -c 25- (tj. Użyć znaku minus zamiast znaku plus), aby usunąć pierwsze 24 znaki.

Poszukujesz również różnych wzorów na dwóch przykładach, jeśli jest to istotne.

+0

oops! Używam znaku "minus" - to był literówka w moim wpisie tutaj – les2

29

Zakładając GNU grep, dodać --line-buffered do linii poleceń, np.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25- 

Edit: buforowanie

widzę grep nie jest jedynym problemem, jak cięcie nie pozwala linewise buforowanie.

może chcesz spróbować zastąpić go czymś można kontrolować, takich jak sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p' 

lub awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}' 
+1

- buforowanie linii nie działało dla mnie - to buforuje * wyjście * grep. Jeśli wykonasz tail -f logfile | cut -c 25- to po prostu tam siedzi. Buforowanie odbywa się na wyjściu ogona. –

+0

Zmienione, wydaje się, że jesteś ugryziony przez standardowe buforowanie w cut, te powinny działać dla ciebie – Hasturkun

+0

Dziękuję! jest to bardzo przydatne, gdy łączymy łańcuchy z wielokrotnymi skrótami. na przykład someprogwithoutput | grep - filtr liniowo buforowany | grep --color highlightmarktern – Superole

Powiązane problemy