Czy istnieje polecenie Unix / Linux do zliczania linii na sekundę od standardowego wejścia?


22

Próbuję policzyć liczbę zapytań SQL na sekundę z pliku dziennika i chcę to zrobić w czasie rzeczywistym, przesyłając stdout z grep do jakiegoś polecenia. (Robię testy wydajności)

Mógłbym to napisać sam, ale na pewno myślałem, że tak będzie.

Spojrzałem na wc, ale nie widziałem opcji, aby na to pozwolić.

Mógłbym go również użyć do zliczania żądań na sekundę, wysyłając potok z dziennika dostępu.



Szukam czegoś bardziej użytecznego niż to, do czego odnosi się to pytanie.
digidigo

Odpowiedzi:


2
watch -n 3 "wc -l logfile"

strona man

watch - okresowo uruchamiaj program, wyświetlając pełny ekran wyjściowy Domyślnie program jest uruchamiany co 2 sekundy; użyj -n lub --interval, aby określić inny interwał.


45

pvto twoje polecenie! P ipe V iewer drukuje statystyki dotyczące przepływających przez nią danych i może działać w dowolnym miejscu w potoku, ponieważ przesyła stdin bezpośrednio do stdout. Na przykład:

tail -f /var/log/nginx/access.log | pv --line-mode --rate > /dev/null

W pvkomenda na stderr aktualną liczbę wierszy na sekundę (domyślnie jest to bajtów na sekundę), który dla tego konkretnego źródła danych (domyślnie w pliku dziennika nginx), przyrównuje do przychodzących żądań internetowych na sekundę. Dbam tylko o liczby, więc wkładam stdout do /dev/null. Istnieją również opcje takie jak:

  • -b (całkowita liczba linii),
  • --average-rate (średnia stawka od początku), oraz
  • --timer (śledzi, jak długo trwa rura).

Jeśli nie powiesz --line-mode, policzy bajty, co prawdopodobnie nie jest tym, czego potrzebujesz do dzienników serwera, ale może być przydatne w innym miejscu.

Ostatnia uwaga: ... | pv -lb > file.txtjest bardzo podobna ... | tee file.txt | awk '{printf "\r%lu", NR}', co jest również przydatne do zliczania linii, ale pvpołączenie jest znacznie krótsze, chociaż wyjście nie jest tak ekscytujące - pvdomyślnie aktualizuje się co sekundę, podczas gdy to awkpolecenie aktualizuje się ciągle.


Czy można uzyskać tylko jedną wartość z pv? Potrzebuję średniej wartości dla okresu w celu monitorowania. Więc muszę przypisać wartość do zmiennej.
Sonique

@Sonique to kludge, ponieważ nie po to pvjest stworzony ( sięgałbym po awkciebie, gdybym był tobą), ale oczywiście jest to możliwe. Załóżmy, że twilight stream --timeout 5jest to polecenie, które pobiera próbki ze spritzera na Twitterze przez 5 sekund, a następnie wychodzi:, RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)"a następnie echo $RATEprodukuje coś w rodzaju „[40,8 / s]” (zwróć uwagę na dodatkową --forceflagę, ponieważ pv„s” stderrnie jest już TTY).
chbrown 12.04.16

Wydaje się, że nie działa dla mnie niezawodnie dla wszystkich programów; usunięcie > /dev/nullpokazuje, że dane wyjściowe są teraz „dzielone na fragmenty” i nie są już przesyłane płynnie. Być może unbufferpotrzebne są niektóre programy produkcyjne, aby nie przełączały się na blokowanie buforowania danych wyjściowych po wykryciu, że są one przesyłane w potoku?
nh2


1
watch -n 5 "mysqladmin status | awk -F'  ' '{ print \$NF }'"

Nie mogłem tego uruchomić. Jesteś pewien co do składni?
digidigo

Jaki masz błąd? Czy skonfigurowałeś ~/.my.cnfdziałanie mysqladminbez pytania o hasło?
kwanty
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.