Je sais bien sûr que
cat logfile.txt | wc -l
120
me dira le nombre de lignes dans un fichier.
Tandis que
tail -f logfile.txt
me montrera les nouvelles lignes dans lesquelles un autre programme écrit logfile.txt
.
Est-il possible de combiner les deux pour obtenir un nombre de lignes de mise à jour continue de logfile.txt avec des utilitaires de texte standard?
Je connais
watch wc -l logfile.txt
mais je ne veux pas recompter tout le dossier à chaque fois, cela semble être un gaspillage. On aurait besoin d'un comptage en annexe uniquement toutes les secondes environ et probablement un \r
au lieu d'un \n
à la fin de la ligne.
cat
sortiewc
est aussi un gros gaspillage !!Réponses:
Peut être:
Méfiez-vous qu'il afficherait un nombre pour chaque ligne d'entrée (mais en remplaçant la valeur précédente s'il était envoyé à un terminal).
Ou vous pouvez implémenter le
tail -f
à la main dans le shell:(notez qu'il s'exécute jusqu'à une
wc
et unesleep
commande par seconde que tous les shells n'ont pas intégrés. Avecksh93
whilesleep
est intégré, pour obtenir un intégréwc
(au moins sur Debian), vous devez ajouter/opt/ast/bin
à l'avant de$PATH
(indépendamment du fait que ce répertoire existe ou non) ou utilisezcommand /opt/ast/bin/wc
(ne demandez pas ...)).Vous pouvez utiliser
pv
, comme dans:Mais attention, il ajoute
k
,M
... suffixes lorsque le nombre est supérieur à 1000 (et il ne semble pas y avoir de solution ).la source
tail | awk
solution. Connaissez vos options:-n +0
ne me serait pas venu à l'esprit dans cette combinaison.pv
- un autre nouvel outil utile. merci beaucoup.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
est un sur-ensemble degrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
pour faireawk
imprimer une nouvelle ligne à la fin.Essayez de le compter avec pur
bash
sanswc
:ou même comme ceci pour réécrire la valeur précédente:
la source
Je ne crois pas qu'il y ait quelque chose comme ça. Mais il devrait être facile de préparer quelque chose comme:
(Idée générale tirée de
perlfunc(1)
)la source
printf foo >> file
. Vous devez compter les caractères de nouvelle ligne (commewc -l
dans la solution shell que j'ai suggérée), pas les enregistrements renvoyés par<$fh>
. Je ne pense pas que vous ayez besoin d'utilisertell
ou passeek
du tout.<$fh>
lit une ligne par défaut, pas des enregistrements. La page de manuel Perl citée indique de le faire de cette façon dans un environnement éventuellement non coopératif (pourrait dépendre du système de fichiers, je suppose que NFS ou d'autres systèmes de fichiers montés sur réseau pourraient nécessiter un peu de réflexion).<$fh>
retournerez un enregistrement même s'il n'est pas terminé par un caractère de nouvelle ligne. Donc, si seperl
trouve à la fin du fichier, et que quelqu'un le fait plus tardprintf foo >> file
, alors<$fh>
reviendrafoo
(pas une ligne car il n'est pas terminé par un caractère de nouvelle ligne), et$count
sera incrémenté même si aucune ligne supplémentaire n'a été ajoutée au fichier.Poursuivre la solution basée sur awk: vous n'aurez peut-être pas besoin de voir le compteur cocher pour chaque ligne de votre journal; si c'est le cas, vous pouvez l'avoir comme ceci (le nombre changerait pour chaque 10 lignes):
la source