Das weiß ich natürlich
cat logfile.txt | wc -l
120
wird mir die Anzahl der Zeilen in einer Datei sagen.
Wohingegen
tail -f logfile.txt
zeigt mir die neuen Zeilen, in die ein anderes Programm schreibt logfile.txt
.
Ist es möglich, beide zu kombinieren, so dass ich eine fortlaufende Aktualisierung der Zeilenanzahl von logfile.txt mit Standardtextdienstprogrammen erhalte?
Ich weiß ungefähr
watch wc -l logfile.txt
aber ich möchte nicht jedes Mal die ganze Datei neu zählen, das scheint eine Verschwendung zu sein. Man würde ungefähr jede Sekunde eine Nur-Anhänge-Zählung benötigen und wahrscheinlich eine \r
anstelle einer \n
am Ende der Zeile.
cat
ausgegeben wird,wc
sind ebenfalls eine große Verschwendung !!Antworten:
Vielleicht:
Beachten Sie, dass für jede Eingabezeile eine Zahl ausgegeben wird (der vorherige Wert wird jedoch überschrieben, wenn er an ein Terminal gesendet wird).
Oder Sie können das
tail -f
von Hand in Shell umsetzen :(Beachten Sie, dass es bis zu ein
wc
und zweisleep
Befehle pro Sekunde ausführt, die nicht alle Shells eingebaut haben. Wennksh93
whilesleep
eingebaut ist, müssen Sie, um ein eingebauteswc
(zumindest unter Debian) zu erhalten,/opt/ast/bin
vorne hinzufügen$PATH
(unabhängig davon, ob das Verzeichnis existiert oder nicht) oder verwendencommand /opt/ast/bin/wc
(nicht fragen ...)).Sie könnten verwenden
pv
, wie in:Aber hüte dich davor, dass es ... Suffixe hinzufügt
k
,M
wenn die Zahl über 1000 liegt (und es scheint keinen Ausweg zu geben ).quelle
tail | awk
Lösung ? Kennen Sie Ihre Möglichkeiten:-n +0
wäre mir in dieser Kombination nicht eingefallen.pv
- Ein weiteres nützliches neues Tool. Vielen Dank.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
ist eine Obermenge vongrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
, umawk
am Ende eine neue Zeile zu drucken.Versuchen Sie es mit rein
bash
ohne zu zählenwc
:oder sogar so, um den vorherigen Wert umzuschreiben:
quelle
Ich glaube nicht, dass es so etwas gibt. Aber es sollte einfach sein, etwas in der Art von:
(Allgemeine Idee abgeschnitten von
perlfunc(1)
)quelle
printf foo >> file
. Sie müssten die Zeilenumbruchzeichen zählen (wiewc -l
in der von mir vorgeschlagenen Shell-Lösung), nicht die Datensätze, die von zurückgegeben wurden<$fh>
. Ich denke nicht, dass Sie verwenden müssentell
oderseek
überhaupt.<$fh>
liest standardmäßig eine Zeile, keine Datensätze. Die angeführte Perl-Manpage fordert dazu auf, dies aus Gründen einer möglicherweise nicht kooperativen Umgebung zu tun (hängt möglicherweise vom Dateisystem ab, ich denke, NFS oder andere im Netzwerk installierte Dateisysteme erfordern ein bisschen Nacharbeit).<$fh>
sobald das Dateiende erreicht ist, wird ein Datensatz zurückgegeben, auch wenn er nicht durch ein Zeilenumbruchzeichen abgeschlossen wird. Also , wennperl
am Ende der Datei sitzt und jemand später kommt einprintf foo >> file
, dann<$fh>
wird wiederfoo
(keine Linie , da sie von einem Newline - Zeichen nicht beendet ist), und$count
wird sogar erhöht werden , obwohl keine zusätzliche Zeile in die Datei hinzugefügt wurde.Fortsetzung der awk-basierten Lösung: Möglicherweise müssen Sie den Zähler nicht für jede Zeile in Ihrem Protokoll ankreuzen. Wenn dies der Fall ist, können Sie es so haben (die Zahl würde sich für jeweils 10 Zeilen ändern):
quelle