Jadi saya ingin melakukan beberapa logging dan karenanya, ingin meletakkan tanggal di depan output skrip bash. Masalahnya adalah bahwa ini memiliki beberapa jalur output. Saya hanya bisa meletakkan tanggal sebelum seluruh output. Tapi kemudian saya memiliki garis tanpa tanggal di log. Tentu saja saya dapat berasumsi bahwa tanggal dari baris di atas sama, tetapi saya berharap ada solusinya. Terima kasih sebelumnya!
Ini skrip saya yang memanggil skrip lain:
#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended
Ini hasilnya:
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
Dan itulah yang ingin saya miliki:
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
Jawaban:
Menurut pertanyaan serupa pada Stack Overflow , ada 2 pilihan bagus.
awk ( Jawab )
annotate ( Jawab )
annotate adalah skrip bash kecil, yang dapat langsung diperoleh melalui tautan yang disediakan di sini, atau, pada sistem berbasis Debian, melalui paket
devscripts
(dalam bentukannotate-output
).sumber
Saya pikir Anda dapat menggunakan awk untuk ini:
(lihat http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html untuk memformat tanggal yang dikembalikan oleh strftime ())
sumber
awk: calling undefined function strftime
- apakah ini khusus untukgawk
?Kamu bisa menggunakan
awk
awk
mengambil aliran input dan memodifikasi outputnya. Skrip ini mengatakan "cetak d diikuti oleh keluaran asli", lalu isid
dengan tanggal.sumber
date
ekspresi hanya sekali juga, sehingga semua garis seperti itu mencetak waktu yang sama?Ini akan mencetak tanggal dan waktu saat ini sebelum setiap baris output
./script.sh
:Bagaimana itu bekerja
set -f
mematikan ekspansi bash (atauecho *
tidak mau mencetak tanda bintang yang sebenarnya).while read -r LINE; do ... done
menyimpan satu baris output dalam variabel$LINE
dan dijalankan...
, sampai semua baris diproses.echo $ (tanggal "+% F% T"): "$ LINE" mencetak baris dengan waktu dan tanggal saat ini.
set +f
mengaktifkan ekspansi bash kembali, sehingga tidak akan mengganggu sisa skrip bash Anda.sumber
sed
menyisipkan tanggal yang sama, dari sesaat sebelum memulai skrip kedua. Sepertinya bukan yang diinginkan pengguna ...ls
. Coba saja skrip Anda dengan yang berikut iniscript.sh
:#!/bin/bash
(baris baru)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
read
denganwhile
loop, bukan untuk loop.