Chciałbym ogonić plik, ale tylko linie wyjściowe zawierające określony ciąg znaków. czy to możliwe?
11
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 |).
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.)Mam nadzieję, że to pomaga.
źródło
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:
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: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:
to działa dokładnie tak jak
grep
. Może chcesz licznik numerów linii i tylko 6. pole? Co powiesz na to: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.
źródło
Kolejna sztuczka, na którą warto zwrócić uwagę, jeśli masz plik CSV z nagłówkami, które chcesz pominąć, np .:
Nie ma znaczenia, jak długo trwa wejście
tail
,+n -2
pominie pierwszy wiersz.źródło