ketika mengekor beberapa file sekaligus seperti yang ditunjukkan di bawah ini, adakah yang bisa menunjukkan nama file di awal setiap baris?
tail -f one.log two.log
output saat ini
==> one.log <==
contents of one.log here...
contents of one.log here...
==> two.log <==
contents of one.log here...
contents of two.log here..
Mencari sesuatu seperti
one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...
-v
(verbose) untuk ekor. Ini mungkin tidak persis cocok dengan permintaan Anda, tetapi ini adalah permulaan.Jawaban:
\ terima kasih {don_cristti}
sumber
awk
solusi sihir joojoo Anda bekerja!Jawaban singkat
GNU Parallel memiliki serangkaian opsi bagus yang membuatnya sangat mudah untuk melakukan hal-hal seperti itu:
Outputnya adalah:
Penjelasan lebih lanjut
--tagstring=str
menandai setiap baris output dengan str str . Dariparallel
halaman manual :Semua kemunculan
{}
akan digantikan oleh argumen paralel yang, dalam hal ini, adalah nama file log; yaituone.log
dantwo.log
(semua argumen setelah:::
).Opsi
--line-buffer
ini diperlukan karena output dari suatu perintah (misalnyatail -f one.log
atautail -f two.log
) akan dicetak jika perintah itu selesai. Karenatail -f
akan menunggu pertumbuhan file, maka diperlukan untuk mencetak output secara garis yang--line-buffer
melakukannya. Lagi dariparallel
halaman manual :sumber
Jika
tail
tidak wajib, Anda dapat menggunakangrep
untuk mencapai ini:Ini akan mencetak nama file sebagai awalan dari setiap baris output.
Output rusak jika
*.log
diperluas hanya ke satu file. Dalam kasus ini:sumber
tail -f
tidakgrep
.--with-filename
atau-H
untuk selalu memaksa nama file prepend.awk
solusi rumit atauparallel
yang tidak diinstal.Ide saya adalah membuat satu file dengan log yang digabungkan dari beberapa file, seperti seseorang yang disarankan di sini dan tambahkan nama file:
sumber
Sesuatu dengan
xargs
dansed
bisa berfungsi:sumber