Lorsque vous faites un tail -f error.log
, comment insérer par programmation un saut de ligne après que rien n'a été ajouté au fichier pendant 3 secondes?
(évidemment, une fois qu'un saut de ligne a été ajouté, aucun autre saut de ligne ne doit être ajouté jusqu'à ce que d'autres lignes de texte soient ajoutées au fichier journal)
Par exemple, ces lignes sont ajoutées à error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Ce serait la sortie dans la console:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cédric
la source
la source
ts
pour ajouter un horodatage à la sortie et traiter les horodatagesRéponses:
Vous pouvez toujours implémenter le
tail -f
(enfin ici, à moins que vous ne décommentiez leseek()
, plus commetail -n +1 -f
nous vidons tout le fichier) à la main avecperl
par exemple:Ou laissez
tail -f
faire la queue et utilisezperl
pour insérer les sauts de ligne s'il n'y a pas d'entrée pendant 3 secondes:Ceux-ci supposent que la sortie elle-même n'est pas ralentie (comme lorsque la sortie va vers un tube qui n'est pas activement lu).
la source
bash
+date
solution:la source
$SECONDS
pour compter les intervalles de temps. Je pense que c'est le nombre de secondes écoulées depuis le démarrage de la coque, pas que cela soit important pour prendre une différence.read -t
ou$TMOUT
.$SECONDS
est cassébash
etmksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
durera entre 2 et 3 secondes. Mieux vaut utiliser zsh ou ksh93 à la place ici (avectypeset -F SECONDS
)date +%s
. Les deux donnent le temps en secondes complètes, ce qui a pour effet que l'intervalle de, disons, 1,9 à 4,0 ressemble à 3 secondes complètes, même si c'est vraiment 2,1. Il est difficile de contourner cela si vous ne pouvez pas accéder à la fraction de seconde. Mais oui, ils devraient probablement dormir ici au lieu de se déplacer, etread -t
pourraient alors tout aussi bien être utilisés. Même si vous dormez manuellement, celatime bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
fonctionne très bien.SECONDS=0
garantit qu'il$SECONDS
atteindra 1 en 1 seconde exactement. Ce n'est pas le casbash
car il utilisetime()
pour suivre$SECONDS
au lieu degettimeofday()
. J'ai signalé des bogues à mksh, zsh et bash il y a quelque temps, seul zsh a été corrigé. (bon point sur le problème étant le même avecdate +%s
). Notez que ce n'est pas un busyloop ici, comme nous le lisons à partir de la sortie d'tail -f
un tube.printf
Émulerdate
sans outils externes ou substitution de commande:printf -v t '%(%s)T' -1
.Python
solution (avec argument d' écart de temps dynamique ):tailing_by_time.py
scénario:Usage:
la source