Wie man auf die Anzahl neuer Zeilen im Schwanz achtet

9

Ich möchte so etwas machen:

watch tail -f | wc -l
#=> 43
#=> 56
#=> 61
#=> 44
#=> ...

Jede Sekunde werden neue Schwanzlinien gezählt

/ Linux, CentOs

Um klarer zu sein. Ich habe so etwas:

tail -f /var/log/my_process/*.log | grep error

Ich lese einige Fehlermeldungen. Und jetzt möchte ich sie zählen. Wie viele ~ Fehler habe ich in einer Sekunde bekommen. Eine Zeile in einem Protokoll ist also ein Fehler in einem Prozess.

fl00r
quelle
Was versuchst du zu machen? Wenn Sie angehängte Zeilen ansehen möchten, reicht es aus, sie tail -f /path/to/filealleine zu verwenden . Wenn Sie Dateizeilen überwachen möchten, können Sie verwenden watch wc -l /path/to/file.
Khaled
@ Khaled, ich muss sehen, wie viele neue Zeilen angehängt wurden
fl00r
Ich benutze Tail mit Regex für eine Reihe von Dateien, und ich möchte sehen, wie viele Zeilen an all diese Dateien im
Laufe
1
Hmpfh. tail -f /var/log/my_process/*.log |grep error > /tmp/error.lines & ; watch wc /tmp/error.lines? Dann mach Mathe.
cjc
@cjc es funktioniert, danke! :) Sie sollten es als ab Antwort
fl00r

Antworten:

24

Ich habe kürzlich pv entdeckt und es ist wirklich cool, man könnte so etwas machen

tail -f logfile | pv -i2 -ltr > /dev/null

  • -i2 = alle 2 Sekunden zählen
  • -l = Zeilen zählen
  • -t = Druckzeit
  • -r = Showrate
Javipolo
quelle
3

Hier ist eine schnelle und schmutzige Methode. Sie möchten im Grunde das tailund das watch wcin separate Teile zerlegen und etwas tun wie:

tail -f /var/log/my_process/*.log |grep error > /tmp/error.lines &
watch wc /tmp/error.lines

An diesem Punkt können Sie rechnen, um eine Fehler- / Sek. -Nummer zu erhalten. Wenn Sie dies jedoch nur für eine einmalige Überprüfung Ihrer Fehlerrate tun, ist Quick-and-Dirty möglicherweise gut genug.

cjc
quelle
3

Falls pv nicht verfügbar ist, kann dies mit perl durchgeführt werden:

Jede Sekunde:

tail -f  recycleBack*out  | perl -e 'while (<>) {$l++;if (time > $e) {$e=time;$i++;print "$i=> $l\n";$l=0}}'

Alle 10 Sekunden

tail -f  recycleBack*out  | perl -e 'while (<>) {$l++;if (time > $e+10) {$e=time;$i++;print "$i=> $l\n";$l=0}}'

Beispielausgabe:

1=> 1
2=> 1523
3=> 1339
4=> 1508
5=> 1785
6=> 1587
7=> 1770
8=> 1432
9=> 1339
10=> 1555
11=> 1663
12=> 1693
13=> 1647
Aprodan
quelle
-1

Sie könnten so etwas versuchen:

tail -f /var/log/my_process/*.log | perl -pe '$_ = "$. $_"'

Es druckt die Zeilennummer vor jeder Zeile.

Finn
quelle
1) Das ist nicht das, wonach das OP sucht, und 2) nlwird dies tun, ohne dass der Anruf an Perl erforderlich ist.
EEAA