J'ai fini par écrire un petit script rapide pour cela en Python, mais je me demandais s'il y avait un utilitaire dans lequel vous pourriez insérer du texte dans lequel ajouterait chaque ligne avec du texte - dans mon cas spécifique, un horodatage. Idéalement, l'utilisation serait quelque chose comme:
cat somefile.txt | prepend-timestamp
(Avant de répondre à sed, j'ai essayé ceci:
cat somefile.txt | sed "s/^/`date`/"
Mais cela n'évalue la commande de date qu'une seule fois lorsque sed est exécuté, de sorte que le même horodatage est incorrectement ajouté à chaque ligne.)
cat somefile.txt
un peu "trompeur"? Je m'attendrais à ce que cela se produise "à la fois" et ait un seul horodatage. Ne serait - ce pas un meilleur programme de test:(echo a; sleep 1; echo b; sleep 3; echo c; sleep 2)
?Réponses:
Pourrait essayer d'utiliser
awk
:Vous devrez peut-être vous assurer que
<command>
produit une sortie en tampon de ligne, c'est-à-dire qu'il vide son flux de sortie après chaque ligne; L'horodatageawk
ajouté sera l'heure à laquelle la fin de la ligne est apparue sur son tube d'entrée.Si awk affiche des erreurs, essayez à la
gawk
place.la source
gawk
et utiliser cela à la place deawk
. Si vous avez MacPorts:sudo port install gawk
awk
'sstrftime()
n'a pas une précision à la milliseconde. Cependant, vous pouvez utiliser ladate
commande. Fondamentalement, vous réduisez simplement les nanosecondes à trois caractères. Il ressemblera à ceci:COMMAND | while read -r line; do echo "$(date '+%Y-%m-%d %T.%3N') $line"; done
. Notez que vous pouvez abréger% H:% M:% S avec% T. Si vous souhaitez toujours utiliserawk
pour une raison quelconque, vous pouvez faire ce qui suit:COMMAND | awk '{ "date +%Y-%m-%d\\ %T.%3N" | getline timestamp; print timestamp, $0; fflush(); }'
ts
de moreutils ajoutera un horodatage à chaque ligne d'entrée que vous lui donnez. Vous pouvez également le formater en utilisant strftime.Pour l'installer:
la source
bad command 2>&1 | ts
résultatsJan 29 19:58:31 -bash: bad: command not found
2014 Mar 21 18:07:28
. Comment puis-je l'obtenir?strftime
chaîne de format comme argument :,[.. command ..] | ts '%Y %b %d %T'
par exemple.brew install moreutils
. Pour générer UTC, vous pouvez définir TZ localement, par exemplels -l |TZ=UTC ts '%Y-%m-%dT%H:%M:%SZ'
ruby -e "puts 1; STDOUT.flush; sleep 1; puts 2; STDOUT.flush; sleep 2; puts 3" | ts '%F %T'
annoter , disponible via ce lien ou comme
annotate-output
dans ledevscripts
paquet Debian .la source
Distiller les réponses données à la plus simple possible:
Sur Ubuntu, ils proviennent des packages expect-dev et moreutils.
la source
expect
pas le casexpect-dev
, mais le dernier tire le premier pour que cela fonctionne. (Ubuntu 14.10, je me demande si le binaire a été déplacé vers un package différent à un moment donné.)expect-dev
unbuffer $COMMAND | ts -s %.s
(-s
si pour le temps écoulé et%.s
pour le temps en secondes avec partie fractionnaire)Que dis-tu de ça?
À en juger par votre désir d'obtenir des horodatages en direct, vous souhaitez peut-être effectuer une mise à jour en direct sur un fichier journal ou quelque chose? Peut être
la source
tail -f /path/to/log | perl -pne 'use POSIX qw(strftime); print strftime "%Y-%m-%dT%H:%M:%SZ ", gmtime();'
d'obtenir une date de style ISO8601 / RFC3339 au lieu de la wacko que la version la plus simple donne.BEGIN { $|++; }
avant l'instruction print afin que Perl vider sa sortie avec chaque ligne.ls | perl -pne 'print localtime." "'
. La conversion scalaire se produit en raison de la concaténation de chaînes.-p
et-n
? Cela semble-n
redondant si vous avez spécifié-p
.Je vais juste jeter ceci là-bas: il y a une paire d'utilitaires dans daemontools appelés tai64n et tai64nlocal qui sont faits pour ajouter des horodatages aux messages.
Exemple:
la source
La réponse de Kieron est la meilleure à ce jour. Si vous rencontrez des problèmes parce que le premier programme met en mémoire tampon, vous pouvez utiliser le programme de suppression de tampon:
Il est installé par défaut sur la plupart des systèmes Linux. Si vous avez besoin de le construire vous-même, il fait partie du package expect
http://expect.nist.gov
la source
Utilisez la commande read (1) pour lire une ligne à la fois à partir de l'entrée standard, puis sortez la ligne précédée de la date dans le format de votre choix en utilisant date (1).
la source
Je ne suis pas un gars Unix, mais je pense que vous pouvez utiliser
la source
la source
Voici ma solution awk (à partir d'un système Windows / XP avec MKS Tools installé dans le répertoire C: \ bin). Il est conçu pour ajouter la date et l'heure actuelles sous la forme mm / jj hh: mm au début de chaque ligne ayant récupéré cet horodatage du système à mesure que chaque ligne est lue. Vous pouvez, bien sûr, utiliser le modèle BEGIN pour récupérer l'horodatage une fois et ajouter cet horodatage à chaque enregistrement (tout de même). J'ai fait cela pour étiqueter un fichier journal généré sur stdout avec l'horodatage au moment où le message de journal a été généré.
/"pattern"/ "C\:\\\\bin\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;
où "pattern" est une chaîne ou une expression régulière (sans les guillemets) à mettre en correspondance dans la ligne d'entrée, et est facultatif si vous souhaitez faire correspondre toutes les lignes d'entrée.
Cela devrait également fonctionner sur les systèmes Linux / UNIX, supprimez simplement le C \: \\ bin \\ en laissant la ligne
Ceci, bien sûr, suppose que la commande "date" vous amène à la commande standard d'affichage / de définition de la date Linux / UNIX sans informations de chemin spécifiques (c'est-à-dire que votre variable PATH d'environnement est correctement configurée).
la source
Mélange de quelques réponses ci-dessus de natevw et Frank Ch. Eigler.
Il a des millisecondes, fonctionne mieux que d'appeler une
date
commande externe à chaque fois et perl peut être trouvé dans la plupart des serveurs.Version alternative avec flush et lecture en boucle:
la source
printf "%s+%06d %s", (strftime "%Y-%m-%dT%H:%M:%S", gmtime($s)), $ms, $_;
vous pouvez le faire (avec gnu / sed ):
exemple:
bien sûr, vous pouvez utiliser d'autres options de la date du programme . remplacez simplement
date +%T
par ce dont vous avez besoin.la source
La réponse de caerwyn peut être exécutée en tant que sous-programme, ce qui empêcherait les nouveaux processus par ligne:
la source
date
d'être engendré à chaque ligne?timestamp() { while read line; do echo "$(date) $line"; done; }; export -f timestamp
dans un script que vous source.date
pour chaque ligne, essayez d' utiliser bashprintf
builtin avec % (datespec) T format. Cela peut donc ressembler àtimestamp() { while IFS= read -r line; do printf "%(%F %T)T %s\n" -1 "$line"; done; }
. Les fonctions intégrées de Shell ne se reproduiront pas. Le format Datespec est comme les formatsstrftime(3)
iedate
. Cela nécessite bash, je ne sais pas depuis quelle version il prend en charge ceprintf
spécificateur.Avertissement : la solution que je propose n'est pas un utilitaire intégré Unix.
J'ai été confronté à un problème similaire il y a quelques jours. Je n'aimais pas la syntaxe et les limites des solutions ci-dessus, j'ai donc rapidement mis en place un programme dans Go pour faire le travail à ma place.
Vous pouvez vérifier l'outil ici: preftime
Il existe des exécutables prédéfinis pour Linux, MacOS et Windows dans la section Releases du projet GitHub.
L'outil gère les lignes de sortie incomplètes et a (de mon point de vue) une syntaxe plus compacte.
<command> | preftime
Ce n'est pas idéal, mais je pensais que je le partagerais au cas où cela aiderait quelqu'un.
la source
le faire avec
date
ettr
etxargs
sur OSX:si vous voulez des millisecondes:
mais notez que sur OSX, date ne vous donne pas l'option% N, vous devrez donc installer gdate (
brew install coreutils
) et donc finalement arriver à ceci:la source
Si la valeur que vous ajoutez est la même sur chaque ligne, lancez emacs avec le fichier, puis:
Ctrl + <space>
au début du fichier (pour marquer cet endroit), puis faites défiler jusqu'au début de la dernière ligne (Alt +> ira à la fin du fichier ... ce qui impliquera probablement la touche Shift aussi, puis Ctrl + a pour aller au début de cette ligne) et:
Ctrl + x r t
Quelle est la commande à insérer dans le rectangle que vous venez de spécifier (un rectangle de largeur 0).
2008-8-21 18:45 <enter>
Ou tout ce que vous voulez ajouter ... alors vous verrez ce texte ajouté à chaque ligne dans le rectangle de largeur 0.
MISE À JOUR: Je viens de réaliser que vous ne voulez pas la MÊME date, donc cela ne fonctionnera pas ... bien que vous puissiez le faire dans emacs avec une macro personnalisée légèrement plus compliquée, mais quand même, ce type d'édition de rectangle est assez agréable à savoir ...
la source