Je veux donc faire un peu de journalisation et pour cela, je veux mettre une date devant la sortie d'un script bash. Le problème est qu'il a plusieurs lignes de sortie. Je peux seulement mettre la date avant la sortie entière. Mais alors j'ai une ligne sans date dans les journaux. Bien sûr, je peux supposer que la date de la ligne ci-dessus est la même, mais j'espérais qu'il existe une solution. Merci d'avance!
Voici mon script qui appelle un autre script:
#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended
Voici la sortie:
2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended
Et c'est ce que j'aimerais avoir:
2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended
Réponses:
Selon une question similaire sur Stack Overflow , il existe 2 excellentes options.
awk ( réponse )
annoter ( réponse )
annotate est un petit script bash, qui peut être obtenu directement via le lien fourni ici, ou, sur les systèmes basés sur Debian, via le package
devscripts
(sous la forme deannotate-output
).la source
Je pense que vous pouvez utiliser awk pour cela:
(voir http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html pour mettre en forme la date renvoyée par strftime ())
la source
awk: calling undefined function strftime
- est-ce spécifique àgawk
?Vous pouvez utiliser
awk
awk
prend un flux d'entrée et modifie sa sortie. Ce script indique "imprimer d suivi de la sortie d'origine", puis remplitd
avec la date.la source
date
expression une seule fois également, de sorte que toutes ces lignes s'impriment en même temps?Cela imprimera la date et l'heure actuelles avant chaque ligne de sortie de
./script.sh
:Comment ça fonctionne
set -f
désactive l'expansion bash (ouecho *
n'imprime pas un véritable astérisque).while read -r LINE; do ... done
enregistre une ligne de sortie dans la variable$LINE
et s'exécute...
jusqu'à ce que toutes les lignes soient traitées.echo $ (date "+% F% T"): "$ LINE" imprime la ligne avec l'heure et la date actuelles.
set +f
active l'expansion bash, de sorte qu'elle n'interfère pas avec le reste de votre script bash.la source
sed
insère la même date, juste avant de démarrer le deuxième script. Probablement pas ce que l'utilisateur veut ...ls
. Essayez simplement votre script avec ce qui suitscript.sh
:#!/bin/bash
(nouvelle ligne)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
avec unewhile
boucle au lieu d'une boucle for.