Aynı anda birden fazla dosyayı kuyruklarken her satırın başında dosya adı gösterilsin mi?


14

aşağıda gösterildiği gibi aynı anda birden fazla dosyayı kuyruklarken, her satırın başında dosya adını göstermenin herhangi bir yolu var mı?

tail -f one.log two.log

akım çıkışı

==> one.log <==
contents of one.log here...
contents of one.log here...

==> two.log <==
contents of one.log here...
contents of two.log here..

Şuna benzer bir şey mi arıyorsunuz?

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...

-vKuyruk için (ayrıntılı) seçeneğe bakabilirsiniz . Bu, isteğinizle tam olarak eşleşmeyebilir, ancak bir başlangıçtır.
rahul

multitail bunu yapabilirim düşünüyorum
Gilles 'SO- kötü olmaktan vazgeç'

Yanıtlar:


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

\ Sayesinde {don_cristti}


@don_crissti, teşekkür ederim! (1) bir vs dosyası - camıma artık şarap yok! (2) iyi fikir. Böyle bir şey yapmaya başladım ama ben kendi kendime "hiç kimse boşlukları olan dosyaların kuyruk -f yapacak" dedi :) - Ben mükemmel önerilerinizi kullanacağım.
JJoao

uzunluk-8'i açıklayabilir misiniz? neden burada 8, sadece 8 eser biliyorum.
Shicheng Guo

1
kuyruk -n 1 * .txt | awk '/ ^ ==> / {a = substr (0, 5 $, uzunluk-8); sonraki} {baskı a, 1 $} '| awk '$ 2> 0 {eğer (2 $! ~ / chrY /) 1 $ yazdırırsa}' | xargs -I {} qsub {}
Shicheng Guo

@ShichengGuo, 8 = uzunluk ("==>") + uzunluk ("<==")
JJoao 25:17

1
şaşırtıcı / şaşırtıcı joojoo sihirli awkçözüm çalışıyor!
Trevor Boyd Smith

6

Kısa cevap

GNU Parallel , bu tür şeyleri yapmayı gerçekten kolaylaştıran bir dizi güzel seçeneğe sahiptir:

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

Çıktı:

one.log: one.log içeriği burada ...
one.log: one.log içeriği burada ...
two.log: two.log içeriği burada ...
two.log: two.log içeriği burada ...

Daha fazla açıklama

  • Seçenek, --tagstring=strher çıkış satırını str dizesiyle etiketler . Gönderen parallel adam sayfası :
--tagstring str
                Satırları bir dizeyle etiketleyin. Her bir çıktı satırı
                str ve SEKME (\ t). str, {} gibi yedek dizeler içerebilir.

                -u, --onall ve --nonall kullanılırken --tagstring yok sayılır.
  • Tüm oluşumları, {}bu durumda günlük dosyası adları olan paralel ile değiştirilir; ie one.logve two.log(sonraki tüm argümanlar :::).

  • --line-bufferBir komutun (örn. tail -f one.logVeya tail -f two.log) çıkışı, komut tamamlandığında yazdırılacağı için bu seçenek gereklidir . Yana tail -fdosya büyümesi için bekleyecek, hat bazında çıktı yazdırmak için gereklidir --line-bufferyapar. Yine parallel man sayfasından :

--line buffer (alfa testi)
                Hat bazında arabellek çıkışı. --grup çıktıyı tutacak
                bütün bir iş için birlikte. --ungroup, çıktıların
                bir işten gelen yarım çizgi ve bir işten gelen yarım çizgi
                başka iş. --line-buffer bu ikisinin arasına sığar: GNU paralel
                tam bir çizgi yazdıracak, ancak
                farklı işler.

2

Eğer tailzorunlu değildir, kullanabileceğiniz grepbunu başarmak için:

grep "" *.log

Bu, dosya adını her çıktı satırının öneki olarak yazdırır.

*.logYalnızca bir dosyaya genişletilirse çıktı kesilir . Bu bağlamda:

grep '' /dev/null *.log

tail -fDeğil çıktı olarak dosya adını göstermek gerekir grep.
mtk

@serenesat bu sadece dosyaların tüm içeriğini yazdırmak değil mi? OP, kuyruk belirtildiğinde dosya
adının

ayrıca sadece yapabileceği --with-filenameveya -Hdaima dosya prepend zorlamak için.
Trevor Boyd Smith

Bu cevabı gerçekten çok seviyorum! 13 karakter uzunluğunda bir çözümle ihtiyaç duyulanı tam olarak TAMAMEN yapar. zor awkçözümün aksine veya parallelyüklü olmayan.
Trevor Boyd Smith

tek sorun günlük dosyalarınız 1 milyon satır uzunluğunda olmasıdır. grep'iniz konsolda (veya ssh'ın üzerinde) 1 milyon satır spam yapacak ...
Trevor Boyd Smith

0

Benim fikrim, burada önerilen biri gibi birkaç dosyadan birleştirilmiş günlükleri olan tek bir dosya oluşturmak ve dosya adlarını eklemek olacaktır:

$ 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

0

Bir şey olabilir xargsve sedişe yarayabilir:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.