แสดงชื่อไฟล์ที่จุดเริ่มต้นของแต่ละบรรทัดเมื่อปรับหลายไฟล์พร้อมกันหรือไม่


14

เมื่อปรับหลายไฟล์พร้อมกันตามที่แสดงด้านล่างมีวิธีใดบ้างที่จะแสดงชื่อไฟล์ที่จุดเริ่มต้นของแต่ละบรรทัด?

tail -f one.log two.log

กระแสไฟขาออก

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

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

กำลังมองหาบางสิ่งที่ชอบ

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) สำหรับหาง สิ่งนี้อาจไม่ตรงกับคำถามของคุณ แต่เป็นการเริ่มต้น
ราหุล

Multitail สามารถทำสิ่งนี้ได้ฉันคิดว่า
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


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

\ ขอบคุณ {} don_cristti


@don_crissti ขอขอบคุณ! (1) ไฟล์ vs - ไม่มีไวน์ให้กับแก้วของฉันอีกแล้ว! (2) ความคิดที่ดี ฉันเริ่มที่จะทำสิ่งนี้ แต่ฉันพูดกับตัวเองอย่างขี้เกียจว่า "ไม่มีใครทำส่วนท้ายของไฟล์ที่มีช่องว่าง" :) - ฉันจะใช้คำแนะนำที่ยอดเยี่ยมของคุณ
JJoao

คุณสามารถอธิบายความยาว -8 ได้ไหม? ทำไมมันถึง 8 ตรงนี้, ฉันรู้เพียงแค่ 8 ผลงาน
Shicheng Guo

1
tail -n 1 * .txt | awk '/ ^ ==> / {a = substr ($ 0, 5, length-8); next} {พิมพ์ a, $ 1} '| awk '$ 2> 0 {ถ้า ($ 2! ~ / chrY /) พิมพ์ $ 1}' | xargs -I {} qsub {}
Shicheng Guo

@ShichengGuo, 8 = length ("==>") + length ("<==")
JJoao

1
ประหลาดใจ / น่าอัศจรรย์โซลูชัน joojoo ของคุณใช้awkงานได้!
Trevor Boyd Smith

6

คำตอบสั้น ๆ

GNU Parallelมีชุดตัวเลือกที่ดีซึ่งทำให้ง่ายต่อการทำสิ่งต่าง ๆ เช่น:

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

ผลลัพธ์จะเป็น:

one.log: เนื้อหาของ one.log ที่นี่ ...
one.log: เนื้อหาของ one.log ที่นี่ ...
two.log: เนื้อหาของ two.log ที่นี่ ...
two.log: เนื้อหาของ two.log ที่นี่ ...

คำอธิบายเพิ่มเติม

  • ตัวเลือกใน--tagstring=strแท็กสายการส่งออกแต่ละคนมีสตริงSTR จากparallel หน้าคน :
- แท็กสตริง
                ติดแท็กบรรทัดด้วยสตริง แต่ละบรรทัดเอาต์พุตจะถูกเติมไว้ด้วย
                STR และ TAB (\ t) str สามารถมีสตริงการแทนที่เช่น {}

                - แท็กสตริงถูกละเว้นเมื่อใช้ -u, --onall และ --nonall
  • สิ่งที่เกิดขึ้นทั้งหมด{}จะถูกแทนที่ด้วยข้อโต้แย้งของขนานซึ่งในกรณีนี้คือชื่อไฟล์บันทึก ie one.logและtwo.log(อาร์กิวเมนต์ทั้งหมดหลังจาก:::)

  • --line-bufferจำเป็นต้องมีตัวเลือกเนื่องจากเอาต์พุตของคำสั่ง (เช่นtail -f one.logหรือtail -f two.log) จะถูกพิมพ์หากคำสั่งนั้นเสร็จสิ้น เนื่องจากtail -fจะรอการเติบโตของไฟล์จึงจำเป็นต้องพิมพ์เอาต์พุตตามบรรทัดที่--line-bufferทำเช่นนั้น อีกครั้งจากparallel หน้าคน :

- line-buffer (การทดสอบอัลฟา)
                บัฟเฟอร์เอาต์พุตตามบรรทัด - กลุ่มจะเก็บเอาท์พุท
                ด้วยกันสำหรับงานทั้งหมด - กลุ่มช่วยให้การส่งออกไปมิกซ์กับ
                ครึ่งบรรทัดมาจากงานหนึ่งและครึ่งบรรทัดมาจาก
                งานอื่น - line-buffer พอดีระหว่างสอง: GNU ขนาน
                จะพิมพ์เต็มบรรทัด แต่จะอนุญาตให้ผสมกับ
                งานที่แตกต่าง

2

หากtailไม่ได้รับคำสั่งคุณสามารถใช้grepเพื่อให้บรรลุสิ่งนี้:

grep "" *.log

นี้จะพิมพ์ชื่อไฟล์เป็นคำนำหน้าของแต่ละบรรทัดเอาท์พุท

เอาต์พุตหยุดพักหาก*.logขยายเป็นไฟล์เดียวเท่านั้น ในเรื่องนี้:

grep '' /dev/null *.log

ฉันต้องการที่จะแสดงชื่อแฟ้มในการส่งออกของไม่ได้tail -f grep
mtk

@serenesat สิ่งนี้จะพิมพ์เนื้อหาทั้งหมดของไฟล์ใช่มั้ย OP ได้ขอชื่อไฟล์ที่จะพิมพ์เมื่อระบุหาง
ราหุล

คุณสามารถทำได้--with-filenameหรือ-Hบังคับให้ชื่อไฟล์เติมไว้
เทรเวอร์บอยด์สมิ ธ

ฉันรักคำตอบนี้จริงๆ! ทำสิ่งที่ต้องการด้วยโซลูชันที่มีความยาว 13 อักขระอย่างแน่นอน ซึ่งแตกต่างจากawkวิธีการที่ซับซ้อนหรือparallelซึ่งไม่ได้ติดตั้ง
เทรเวอร์บอยด์สมิ ธ

ปัญหาเดียวคือถ้าไฟล์บันทึกของคุณยาว 1 ล้านบรรทัด จากนั้น grep ของคุณจะสแปม 1 ล้านบรรทัดเพื่อปลอบใจ (หรือมากกว่า ssh) ...
เทรเวอร์บอยด์สมิ ธ

0

ความคิดของฉันคือการสร้างไฟล์เดียวที่มีบันทึกที่ผสานจากหลายไฟล์เช่นมีคนแนะนำที่นี่และเติมชื่อไฟล์:

$ 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

บางสิ่งบางอย่างด้วยxargsและsedสามารถทำงานได้:

$ xargs -I% -P0 sh -c "tail -f % | sed s/^/%:/g" <<EOT
one.log
two.log
EOT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.