Próbuję zobaczyć, ile razy foo bar
pojawia się w /var/log/foo.log
dowolnym czasie na zdalnym serwerze, ale nic, co do tej pory próbowałem, nie zadziałało.
Mam już skrypt timera, którego używam do śledzenia, ile czasu minęło, odkąd zacząłem tailing /var/log/foo.log
, a teraz chciałbym po prostu powiedzieć, ile razy foo bar
pojawił się w wynikach tailed.
Szukałem w Google, ale nie znalazłem nic istotnego na pierwszych 10 stronach wyników.
Oto, co próbowałem z frustrującymi wynikami:
## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -
## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'
Próbowałem nawet napisać scenariusz sed, który zachowywałby się w ten sposób tail -f
, ale zrobiłem z tego postępy.
UWAGA
na zdalnym serwerze działa starsza wersja coreutils, a aktualizacja jest opcją, ale NIE jest w żaden sposób pożądanym rozwiązaniem.
ubuntu
text-processing
logs
portability
Alexej Magura
źródło
źródło
--line-buffered
opcjęgrep
. Lubtail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Odpowiedzi:
działa dla mnie i jest to pierwsze, o czym myślałem - to znaczy, jeśli naprawdę chcesz, aby wiersze były ponumerowane od 1, a nie z rzeczywistym numerem wiersza z oglądanego pliku. Opcjonalnie dodaj w
grep
razie potrzeby w odpowiednim miejscu (przed lub ponl
). Pamiętaj jednak, że może wystąpić buforowanie. W moim szczególnym przypadkugrep
ma--line-buffered
opcję, alenl
buforuje dane wyjściowe i nie ma opcji, aby ją wyłączyć. W związku z tymtail | nl | grep
kombinacja naprawdę nie ładnie płynie.To mówi,
działa również dla mnie. Numeracja zaczyna się od początku „tailing”, a nie od początku całego pliku dziennika.
źródło
-n
opcji.--line-number
:tail -f /var/log/foo.log | grep foo\ bar --line-number
działa!Myślę, że tak jest lepiej ..
źródło
Możesz również przesłać dane wyjściowe do
less
niego, ma on funkcję numeru linii,-N
która pozwala przewijać dziennik w tę iz powrotem.Przykład
UWAGA: Zwróć uwagę na wynik. Ta funkcja może Ci się nie podobać lub nie, ale zajmie to długie linie i pokroi je, aby mogły przejść do następnej linii, ale nadal zachowają ten sam odpowiedni numer linii. Uważam tę funkcję za nieocenioną podczas analizy szerokich plików dziennika! Możesz zobaczyć efekt tej funkcji w wierszach 6 i 8 .
źródło
tail
. Jeśli chodzi o długie linie, to zachowanie jest przełączane podczasless
używania-S
.Aby grepować nowe wiersze tylko w pliku dziennika, ponieważ pochodzą z numerem wiersza, możesz:
(z
mawk
, będziesz chciał dodać-Winteractive
opcję, aby zapobiec buforowaniu danych wejściowych (!)).wc -l
odczytuje linie , które już tam były i liczy je (znaki nowej linii, co oznacza, że nadal działa, nawet jeśli ostatnia linia nie jest jeszcze pełna), a następnie mytail -f
resztę (zaczynając od miejsca, w którymwc
przestał czytać) i określamy,awk
jaki jest numer linii pierwszy, który zobaczy.źródło
l
nazwy zmiennej zmusiło mnie do zmrużenia oczu na $ l, myśląc, że to$1
^^ (ale jak wiem (i 100% ufam), przeczytałem ponownie i zobaczyłem prawdę). Dla ciekawości: aby uniknąć pewnego „warunku wyścigu” międzywc -l
itail -f
(jeśli plik rośnie szybko, można odrzucić niektóre linie, a zatem NR zaczyna się od niewłaściwej liczby), czy można$l
zamiast tego pominąć linie? (i jaki jest limit ogonów-n
w posiksach i GNU?). Może z tymczasowym plikiem pośrednim?tail -n +1
(czytaj wszystko z pozycji początkowej) rozwiązuje problemy związane z wyścigiem. Odczyta wiersze, które nie były w pliku w chwiliwc -l
zakończenia, z dokładnej pozycji, którawc
go opuściła. Tak więc NR będzie miał właściwą pozycję bez względu na to, ile wierszy zostało napisanych międzywc
końcem atail
początkiem. Gdybyś powiedział,tail
żeby zacząć od pewnej pozycji względem końca pliku, będziesz miał problemy.tail -n +1
tutaj), w przypadku zwykłych plików większość implementacji ich nie ma, ponieważ mogą zaczynać od końca i zseek
powrotem, dopóki nie znajdą n-tego nowego wiersza bez konieczności przechowywania więcej niż jednej wartości buf danych w pamięci. W przypadku niewidocznych danych wejściowych możesz napotkać limity. POSIX wymaga implementacji, aby móc przechowywać co najmniej 10 x LINE_MAX bajtów (LINE_MAX to co najmniej 2048). Ogon GNU nie ma limitu innego niż pamięć AFAIKJeśli chcesz numerować od samego początku, potrzebujesz grep -n, aby zastosować się do wszystkich linii.
Jeśli chciałbyś wtedy pokazać tylko 10 ostatnich, pomyślałem, że możesz ponownie ogonić plik:
Pierwszy jest przydatny, ale pokazuje zbyt dużą moc wyjściową. Nie wiem, dlaczego drugi nie działa.
źródło
tail -n +1 -f
ogon od początku.tail
nie może nic wypisać, dopóki nie zobaczy ostatniego wiersza swojego wejścia (skąd miałby wiedzieć, który jest dziesiąty ostatni wiersz?), Który nigdy się nie wydarzy, ponieważtail -f
nigdy się nie kończy.Polecenie
cat -n [filename] | tail
to szybko policzy i wyświetli najnowsze rekordy, jeśli tego właśnie szukasz.-f
Przełącznik sprawia, że trwały aż do ucieczki - która naprawdę nie brzmi zastosowanie w scenariuszu lub jest zbędny.wc -l [filename]
otrzyma liczbę linii w celuwc -l [filenameprefix]*
policzy wszystkie wiersze we wszystkich plikach pasujących do wzorca, a nawet poda podsumowanie na końcu.Pełniejsze szczegóły mogą dać pełniejsze odpowiedzi.
źródło
Jest to argument
n
lub--lines
(użyte nieco inaczej, patrz poniżej):Zobacz także pomoc:
źródło