Saya akhirnya menulis skrip kecil cepat untuk ini dengan Python, tapi saya bertanya-tanya apakah ada utilitas yang dapat Anda masukkan teks yang akan menambah setiap baris dengan beberapa teks - dalam kasus khusus saya, cap waktu. Idealnya, penggunaannya akan seperti:
cat somefile.txt | prepend-timestamp
(Sebelum Anda menjawab sed, saya mencoba ini:
cat somefile.txt | sed "s/^/`date`/"
Tapi itu hanya mengevaluasi perintah tanggal sekali ketika sed dieksekusi, jadi stempel waktu yang sama salah dituliskan ke setiap baris.)
cat somefile.txt
agak "menyesatkan"? Saya berharap itu terjadi "sekaligus" dan memiliki cap waktu tunggal. Bukankah ini menjadi program tes yang lebih baik:(echo a; sleep 1; echo b; sleep 3; echo c; sleep 2)
?Jawaban:
Bisa mencoba menggunakan
awk
:Anda mungkin perlu memastikan bahwa
<command>
menghasilkan output buffered garis, yaitu itu mengalir aliran output setelah setiap baris; timestampawk
menambahkan akan menjadi waktu di mana ujung garis muncul pada pipa inputnya.Jika awk menunjukkan kesalahan, maka cobalah
gawk
.sumber
gawk
dan menggunakannyaawk
. Jika Anda memiliki MacPorts:sudo port install gawk
awk
'sstrftime()
tidak memiliki presisi milidetik. Namun Anda dapat menggunakandate
perintah. Pada dasarnya Anda hanya memotong nanodetik menjadi tiga karakter. Ini akan terlihat seperti ini:COMMAND | while read -r line; do echo "$(date '+%Y-%m-%d %T.%3N') $line"; done
. Perhatikan bahwa Anda dapat menyingkat% H:% M:% S dengan% T. Jika Anda masih ingin menggunakanawk
untuk beberapa alasan, Anda dapat melakukan hal berikut:COMMAND | awk '{ "date +%Y-%m-%d\\ %T.%3N" | getline timestamp; print timestamp, $0; fflush(); }'
ts
dari moreutils akan menambahkan cap waktu ke setiap baris input yang Anda berikan. Anda dapat memformatnya menggunakan strftime juga.Untuk menginstalnya:
sumber
bad command 2>&1 | ts
menghasilkanJan 29 19:58:31 -bash: bad: command not found
2014 Mar 21 18:07:28
. Bagaimana saya mendapatkannya?strftime
string format sebagai argumen :,[.. command ..] | ts '%Y %b %d %T'
misalnya.brew install moreutils
,. Untuk menghasilkan UTC, Anda dapat mengatur TZ secara lokal, misalnyals -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'
membubuhi keterangan , tersedia melalui tautan itu atau seperti
annotate-output
dalamdevscripts
paket Debian .sumber
Menyaring jawaban yang diberikan ke yang paling sederhana:
Di Ubuntu, mereka datang dari paket-paket harapan-dev dan moreutils.
sumber
expect
, bukanexpect-dev
, tapi tarikan yang terakhir di bekas sehingga karya ini. (Ubuntu 14.10, saya ingin tahu apakah biner dipindahkan ke paket yang berbeda di beberapa titik.)expect-dev
unbuffer $COMMAND | ts -s %.s
(-s
jika untuk waktu yang berlalu dan%.s
untuk waktu dalam detik dengan bagian fraksional)Bagaimana dengan ini?
Menilai dari keinginan Anda untuk mendapatkan cap waktu hidup, mungkin Anda ingin melakukan pembaruan langsung pada file log atau sesuatu? Mungkin
sumber
tail -f /path/to/log | perl -pne 'use POSIX qw(strftime); print strftime "%Y-%m-%dT%H:%M:%SZ ", gmtime();'
untuk mendapatkan tanggal gaya ISO8601 / RFC3339 bukan Wacko yang menghasilkan versi sederhana.BEGIN { $|++; }
sebelum pernyataan cetak untuk membuat Perl flush output dengan setiap baris.ls | perl -pne 'print localtime." "'
. Konversi skalar terjadi karena penggabungan string.-p
dan-n
opsi? Sepertinya-n
berlebihan jika Anda telah menentukan-p
.Hanya akan membuang ini di luar sana: ada sepasang utilitas di daemontools yang disebut tai64n dan tai64nlocal yang dibuat untuk stempel waktu berurutan untuk mencatat pesan.
Contoh:
sumber
Jawaban Kieron adalah yang terbaik sejauh ini. Jika Anda memiliki masalah karena program pertama sedang melakukan buffering, Anda dapat menggunakan program unbuffer:
Ini diinstal secara default pada sebagian besar sistem linux. Jika Anda perlu membuatnya sendiri, itu adalah bagian dari paket yang diharapkan
http://expect.nist.gov
sumber
Gunakan perintah baca (1) untuk membaca satu baris pada satu waktu dari input standar, kemudian output baris yang diawali dengan tanggal dalam format yang Anda pilih menggunakan tanggal (1).
sumber
Saya bukan orang Unix, tapi saya pikir Anda bisa menggunakannya
sumber
sumber
Inilah solusi awk saya (dari sistem Windows / XP dengan MKS Tools diinstal di direktori C: \ bin). Ini dirancang untuk menambahkan tanggal dan waktu saat ini dalam bentuk mm / hh: mm ke awal setiap baris setelah mengambil stempel waktu dari sistem saat setiap baris dibaca. Anda tentu saja dapat menggunakan pola BEGIN untuk mengambil stempel waktu satu kali dan menambahkan stempel waktu itu ke setiap record (semuanya sama). Saya melakukan ini untuk menandai file log yang sedang dibuat untuk stdout dengan stempel waktu pada saat pesan log dihasilkan.
/"pattern"/ "C\:\\\\bin\\\\date '+%m/%d %R'" | getline timestamp;
print timestamp, $0;
di mana "pola" adalah string atau regex (tanpa tanda kutip) untuk dicocokkan di baris input, dan opsional jika Anda ingin mencocokkan semua baris input.
Ini harus bekerja pada sistem Linux / UNIX juga, cukup singkirkan C \: \\ bin \\ meninggalkan garis
Ini, tentu saja, mengasumsikan bahwa perintah "date" membawa Anda ke perintah tampilan / set tanggal Linux / UNIX standar tanpa informasi jalur spesifik (yaitu, variabel PATH lingkungan Anda dikonfigurasikan dengan benar).
sumber
Mencampur beberapa jawaban di atas dari natevw dan Frank Ch. Eigler.
Ini memiliki milidetik, berkinerja lebih baik daripada memanggil
date
perintah eksternal setiap kali dan perl dapat ditemukan di sebagian besar server.Versi alternatif dengan flush dan baca dalam satu lingkaran:
sumber
printf "%s+%06d %s", (strftime "%Y-%m-%dT%H:%M:%S", gmtime($s)), $ms, $_;
Anda dapat melakukan ini (dengan gnu / sed ):
contoh:
tentu saja, Anda dapat menggunakan opsi lain dari tanggal program . ganti saja
date +%T
dengan yang Anda butuhkan.sumber
Jawaban caerwyn dapat dijalankan sebagai subrutin, yang akan mencegah proses baru per baris:
sumber
date
melahirkan di setiap baris?timestamp() { while read line; do echo "$(date) $line"; done; }; export -f timestamp
dalam skrip yang Anda sumber.date
untuk setiap baris, coba gunakan bashprintf
builtin dengan format T% (Datepec) . Jadi mungkin terlihat sepertitimestamp() { while IFS= read -r line; do printf "%(%F %T)T %s\n" -1 "$line"; done; }
. Shell bawaan tidak akan muncul. Format Datespec seperti formatstrftime(3)
iedate
. Ini membutuhkan bash, tidak yakin karena versi mana yang mendukungnyaprintf
.Penafian : solusi yang saya usulkan bukanlah utilitas bawaan Unix.
Saya menghadapi masalah yang sama beberapa hari yang lalu. Saya tidak menyukai sintaks dan keterbatasan solusi di atas, jadi saya segera membuat program di Go untuk melakukan pekerjaan untuk saya.
Anda dapat memeriksa alat di sini: preftime
Ada executable prebuilt untuk Linux, MacOS, dan Windows di bagian Rilis proyek GitHub.
Alat ini menangani jalur keluaran yang tidak lengkap dan memiliki (dari sudut pandang saya) sintaksis yang lebih ringkas.
<command> | preftime
Ini tidak ideal, tetapi saya pikir saya akan membagikannya jika itu membantu seseorang.
sumber
melakukannya dengan
date
dantr
danxargs
di OSX:jika Anda ingin milidetik:
tetapi perhatikan bahwa pada OSX, date tidak memberi Anda opsi% N, jadi Anda harus menginstal gdate (
brew install coreutils
) dan akhirnya sampai pada ini:sumber
Jika nilai yang Anda prabayar sama pada setiap baris, jalankan emacs dengan file tersebut, lalu:
Ctrl + <space>
di awal file (untuk menandai tempat itu), kemudian gulir ke bawah ke awal baris terakhir (Alt +> akan pergi ke akhir file ... yang mungkin akan melibatkan tombol Shift juga, lalu Ctrl + a untuk menuju ke awal baris itu) dan:
Ctrl + x r t
Yang merupakan perintah untuk menyisipkan pada persegi panjang yang baru saja Anda tentukan (persegi panjang dengan lebar 0).
2008-8-21 18:45 <enter>
Atau apa pun yang ingin Anda tambahkan terlebih dahulu ... maka Anda akan melihat teks tersebut ditambahkan ke setiap baris dalam persegi panjang 0 lebar.
UPDATE: Saya baru sadar Anda tidak ingin tanggal SAMA, jadi ini tidak akan berhasil ... meskipun Anda mungkin dapat melakukan ini di emacs dengan makro kustom yang sedikit lebih rumit, tapi tetap saja, penyuntingan persegi panjang semacam ini adalah cukup baik untuk mengetahui tentang ...
sumber