Więc chcę zrobić rejestrowanie i dlatego chcę umieścić datę przed wyjściem skryptu bash. Problem polega na tym, że ma wiele linii wyjściowych. Jestem w stanie umieścić datę tylko przed całym wyjściem. Ale potem w dziennikach mam wiersz bez daty. Oczywiście mogę założyć, że data z powyższej linii jest taka sama, ale miałem nadzieję, że istnieje rozwiązanie. Z góry dziękuję!
To jest mój skrypt, który wywołuje inny skrypt:
#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended
To jest wynik:
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
I właśnie to chciałbym mieć:
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
Odpowiedzi:
Zgodnie z podobnym pytaniem na temat przepełnienia stosu istnieją 2 świetne opcje.
awk ( odpowiedź )
adnotacja ( odpowiedź )
adnotate to mały skrypt bash, który można uzyskać bezpośrednio poprzez link podany tutaj lub, w systemach opartych na Debianie, poprzez pakiet
devscripts
(w formieannotate-output
).źródło
Myślę, że możesz użyć do tego awk:
(zobacz http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html w celu sformatowania daty zwróconej przez strftime ())
źródło
awk: calling undefined function strftime
- czy to jest specyficznegawk
?Możesz użyć
awk
awk
pobiera strumień wejściowy i modyfikuje jego wynik. Skrypt mówi „drukuj d po oryginalnym wydruku”, a następnie zapełniad
się datą.źródło
date
wyrażenia również tylko raz, aby wszystkie takie linie były drukowane w tym samym czasie?Spowoduje to wydrukowanie bieżącej daty i godziny przed każdym wierszem danych wyjściowych
./script.sh
:Jak to działa
set -f
wyłącza rozszerzenie bash (lubecho *
nie drukuje rzeczywistej gwiazdki).while read -r LINE; do ... done
zapisuje jeden wiersz wyniku w zmiennej$LINE
i wykonuje...
, dopóki wszystkie wiersze nie zostaną przetworzone.echo $ (data „+% F% T”): „$ LINE” drukuje linię z bieżącą godziną i datą.
set +f
ponownie włącza rozszerzenie bash, aby nie zakłócało reszty skryptu bash.źródło
sed
wstawia tę samą datę, tuż przed rozpoczęciem drugiego skryptu. Prawdopodobnie nie to, czego chce użytkownik ...ls
. Po prostu wypróbuj swój skrypt w następujący sposóbscript.sh
:#!/bin/bash
(nowa linia)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
zwhile
pętlą zamiast z pętlą for.