Wiem to oczywiście
cat logfile.txt | wc -l
120
powie mi liczbę wierszy w pliku.
Natomiast
tail -f logfile.txt
pokaże mi nowe wiersze, do których pisze inny program logfile.txt
.
Czy można połączyć oba, aby uzyskać ciągłą aktualizację liczby wierszy pliku logfile.txt ze standardowymi narzędziami tekstowymi?
Wiem o tym
watch wc -l logfile.txt
ale nie chcę za każdym razem przeliczać całego pliku, co wydaje się marnotrawstwem. Potrzebny byłby tylko licznik dołączany co sekundę i prawdopodobnie \r
zamiast \n
na końcu linii.
cat
produkcja rur dowc
jest również dużym marnotrawstwem !!Odpowiedzi:
Może:
Uważaj, aby wyświetlał liczbę dla każdego wiersza danych wejściowych (chociaż przesłania poprzednią wartość, jeśli zostanie wysłana do terminala).
Lub możesz wdrożyć
tail -f
ręcznie w powłoce:(zwróć uwagę, że uruchamia się jedno
wc
i jednosleep
polecenie na sekundę, które nie zostały wbudowane we wszystkie powłoki. Gdy jest wbudowaneksh93
whilesleep
, aby uzyskać wbudowanewc
(przynajmniej w Debianie), musisz dodać/opt/ast/bin
z przodu$PATH
(niezależnie od tego, czy ten katalog istnieje lub nie) lub użyjcommand /opt/ast/bin/wc
(nie pytaj ...)).Możesz użyć
pv
, jak w:Ale uważaj, że dodaje
k
,M
... sufiksy, gdy liczba przekracza 1000 (i wydaje się, że nie ma takiej możliwości ).źródło
tail | awk
rozwiązania. Poznaj swoje opcje:-n +0
nie przyszło mi do głowy w tej kombinacji.pv
- kolejne przydatne nowe narzędzie. wielkie dzięki.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
jest nadzbioremgrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
abyawk
wydrukować nowy wiersz na końcu.Spróbuj policzyć to z czystym
bash
bezwc
:lub nawet w ten sposób, aby przepisać poprzednią wartość:
źródło
Nie wierzę, że jest coś takiego. Ale powinno być łatwo wymieszać coś w stylu:
(Ogólny pomysł przeniesiony z
perlfunc(1)
)źródło
printf foo >> file
. Będziesz musiał policzyć znaki nowego wiersza (jakwc -l
ma to miejsce w rozwiązaniu powłoki, które zasugerowałem), a nie rekordy zwrócone przez<$fh>
. Nie sądzę, że musisz użyćtell
lubseek
wcale.<$fh>
Odczytuje linię domyślnie nie zapisuje. Cytowana strona podręcznika Perla mówi, aby zrobić to w ten sposób ze względu na możliwie niechętne do współpracy środowisko (może to zależeć od systemu plików, sądzę, że NFS lub inne systemy plików podłączone do sieci mogą wymagać trochę prowokacji).<$fh>
zwróci rekord, nawet jeśli nie jest zakończony znakiem nowej linii. Więc jeśliperl
siedzi na końcu pliku, a ktoś później to zrobiprintf foo >> file
, to<$fh>
wrócifoo
(nie wiersz, ponieważ nie jest zakończony znakiem nowego wiersza) i$count
będzie zwiększany, nawet jeśli do pliku nie dodano żadnej dodatkowej linii.Kontynuacja rozwiązania opartego na awk: może nie być konieczne wyświetlanie licznika dla każdej linii w dzienniku; tak jest, możesz to zrobić w ten sposób (liczba zmienia się dla każdego 10 wierszy):
źródło