Tampilkan nama file di awal setiap baris saat mengekor beberapa file sekaligus?

14

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...
mtk
sumber
Anda dapat melihat opsi -v(verbose) untuk ekor. Ini mungkin tidak persis cocok dengan permintaan Anda, tetapi ini adalah permulaan.
rahul
multitail dapat melakukan ini, saya pikir
Gilles 'SO- stop being evil'

Jawaban:

7
tail  -f ...your-files | 
    awk '/^==> / {a=substr($0, 5, length-8); next}
                 {print a":"$0}'

\ terima kasih {don_cristti}

Joao
sumber
@don_crissti, terima kasih! (1) file vs - tidak ada lagi anggur di gelas saya! (2) ide bagus Saya mulai melakukan sesuatu seperti ini tetapi saya dengan mudah berkata pada diri saya "tidak ada yang akan membuat ekor file dengan spasi" :) - Saya akan menggunakan saran Anda yang sangat baik.
JJoao
Bisakah Anda jelaskan panjangnya-8? mengapa 8 di sini, saya hanya tahu 8 bekerja.
Shicheng Guo
1
tail -n 1 * .txt | awk '/ ^ ==> / {a = substr ($ 0, 5, length-8); selanjutnya} {print a, $ 1} '| awk '$ 2> 0 {if ($ 2! ~ / chrY /) cetak $ 1}' | xargs -I {} qsub {}
Shicheng Guo
@ShichengGuo, 8 = length ("==>") + length ("<==")
JJoao
1
mengejutkan / luar biasa awksolusi sihir joojoo Anda bekerja!
Trevor Boyd Smith
6

Jawaban singkat

GNU Parallel memiliki serangkaian opsi bagus yang membuatnya sangat mudah untuk melakukan hal-hal seperti itu:

parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log

Outputnya adalah:

one.log: isi one.log di sini ...
one.log: isi one.log di sini ...
two.log: isi two.log di sini ...
two.log: isi two.log di sini ...

Penjelasan lebih lanjut

  • Opsi --tagstring=strmenandai setiap baris output dengan str str . Dari parallel halaman manual :
--tagstring str
                Tandai baris dengan string. Setiap jalur output akan diawali dengan
                str dan TAB (\ t). str dapat berisi string pengganti seperti {}.

                --tagstring diabaikan ketika menggunakan -u, --onall, dan --nonall.
  • Semua kemunculan {}akan digantikan oleh argumen paralel yang, dalam hal ini, adalah nama file log; yaitu one.logdan two.log(semua argumen setelah :::).

  • Opsi --line-bufferini diperlukan karena output dari suatu perintah (misalnya tail -f one.logatau tail -f two.log) akan dicetak jika perintah itu selesai. Karena tail -fakan menunggu pertumbuhan file, maka diperlukan untuk mencetak output secara garis yang --line-buffermelakukannya. Lagi dari parallel halaman manual :

--line-buffer (pengujian alfa)
                Output buffer berdasarkan garis. --group akan menyimpan hasilnya
                bersama untuk seluruh pekerjaan. --ungroup memungkinkan output untuk digabungkan
                setengah garis datang dari satu pekerjaan dan setengah garis datang dari
                pekerjaan lain. --line-buffer cocok di antara keduanya: paralel GNU
                akan mencetak satu baris penuh, tetapi akan memungkinkan untuk mencampur garis
                pekerjaan yang berbeda.
kartunis
sumber
2

Jika tailtidak wajib, Anda dapat menggunakan grepuntuk mencapai ini:

grep "" *.log

Ini akan mencetak nama file sebagai awalan dari setiap baris output.

Output rusak jika *.logdiperluas hanya ke satu file. Dalam kasus ini:

grep '' /dev/null *.log
serenesat
sumber
Saya perlu menunjukkan nama file dalam output tail -ftidak grep.
mtk
@serenesat ini hanya akan mencetak seluruh isi file bukan? OP meminta nama file untuk dicetak ketika ekornya ditentukan
rahul
Anda juga bisa melakukan --with-filenameatau-H untuk selalu memaksa nama file prepend.
Trevor Boyd Smith
Saya sangat suka jawaban ini! tidak persis PERSIS apa yang dibutuhkan dengan solusi yang panjangnya 13 karakter. sebagai lawan awksolusi rumit atau parallelyang tidak diinstal.
Trevor Boyd Smith
satu-satunya masalah adalah bahwa jika file log Anda panjangnya 1 juta baris. maka grep Anda akan mengirim spam 1 juta baris ke konsol (atau lebih ssh) ...
Trevor Boyd Smith
0

Ide saya adalah membuat satu file dengan log yang digabungkan dari beberapa file, seperti seseorang yang disarankan di sini dan tambahkan nama file:

$ tail -f /var/log/syslog | sed -u -E 's,(^.+$),/var/log/syslog: \1,g' >> /tmp/LOG &&
$ tail -f /var/log/Xorg.0.log | sed -u -E 's,(^.+$),/var/log/Xorg.0.log: \1,g' >> /tmp/LOG &&
$ tail -f /tmp/LOG
Arkadiusz Drabczyk
sumber
0

Sesuatu dengan xargsdan sedbisa berfungsi:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
FloHimself
sumber