Chciałbym ogonić plik, ale tylko linie wyjściowe zawierające określony ciąg znaków. czy to możliwe?
Chciałbym ogonić plik, ale tylko linie wyjściowe zawierające określony ciąg znaków. czy to możliwe?
Odpowiedzi:
użyj grep. Jest zbudowany tylko do tego celu.
Aby znaleźć linie z ogona / var / log / syslog, które zawierają „cron”, po prostu uruchom:
tail -f /var/log/syslog | grep cron
A ponieważ akceptuje wszystko ponad standardowe wejście, możesz użyć go również na wyjściu dowolnego innego polecenia, przesyłając potoki w taki sam sposób jak powyżej (używając symbolu |).
Oto kilka innych pomysłów, które choć nie są tak proste, mogą oferować ciekawą dodatkową elastyczność:
Po pierwsze, możesz filtrować za pomocą awk zamiast grep:
tail -f /var/log/messages | awk '/myfilterword/'
to działa dokładnie tak samo jak w przykładzie grep
. Możesz rozwinąć tę kwestię, korzystając z mocy awk, na przykład:
tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'
który wypisze od 6. do ostatniego pola wyniku (pola są oddzielone białymi spacjami)
Innym podobnym pomysłem jest użycie Perla One-Liner:
tail -f /var/log/messages | perl -ne "/myfilterword/ and print"
to działa dokładnie tak jak grep
. Może chcesz licznik numerów linii i tylko 6. pole? Co powiesz na to:
tail -f /var/log/messages | \
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"
Oczywiście wszystkie tego rodzaju rzeczy można wykonać również za pomocą innych narzędzi, ale chciałem zilustrować, że istnieją fajne sposoby używania bardziej ogólnych języków, takich jak awk lub perl.
Kolejna sztuczka, na którą warto zwrócić uwagę, jeśli masz plik CSV z nagłówkami, które chcesz pominąć, np .:
% cat data.txt
fruit dessert calories
Apple Pie 770
Banana Pudding 625
Cherry Cobbler 990
% tail -n +2 data.txt
Apple Pie 770
Banana Pudding 625
Cherry Cobbler 990
Nie ma znaczenia, jak długo trwa wejście tail
, +n -2
pominie pierwszy wiersz.
grep
będzie buforowane, gdy będzie używane nieinteraktywnie, na przykład gdy jest częścią dłuższego rurociągu. GNU grep 2.5.1 oferuje--line-buffered
opcję obejścia tego problemu, gdy eliminacja grep z potoku nie jest opcją. (Kiedy mówię, że grep zbuforuje, to znaczy, że nie zobaczysz danych wyjściowych, dopóki bufor nie osiągnie czegoś w rodzaju 4k.)