วิธีการ tail / grep / awk N ไบต์สุดท้ายของไฟล์แทนที่จะเป็นบรรทัด


14

ฉันมีแอปพลิเคชันที่กำลังบันทึกลงในไฟล์บันทึกข้อความธรรมดา (myapp.log) แต่ดูเหมือนจะไม่ได้เขียนอักขระบรรทัดใหม่ที่ท้ายรายการบันทึกแต่ละรายการ ถ้าฉันรันคำสั่งเหมือนtail -n 50 myapp.logฉันได้รับข้อความ "บรรทัด" หลายร้อยรายการ (รายการบันทึก)

ไฟล์บันทึกนี้มีขนาดใหญ่มาก ๆ ประมาณ 1GB ใครจะรู้ว่า CR และ / หรือ LF ที่ผ่านมานานมาแล้วนั้นถูกแทรกเข้าไป ฉันจะคว้าตัวอย่าง 2MB ล่าสุดได้อย่างไร

คำตอบ:


27

การใช้-cสวิตช์ (2MB = 2 * 1024 * 1024 = 2097152 ไบต์):

tail -c 2097152 myapp.log

ขอบคุณPetr Uzelสำหรับคำแนะนำ การปรับใช้หางบางส่วนอนุญาตให้เพิ่มหน่วยเพื่อพิมพ์กิโลไบต์สุดท้าย (k) หรือเมกะไบต์ (m) เช่น:

tail -c 2m myapp.log

อย่างไรก็ตามโปรดทราบว่ามันไม่ได้เป็นแบบมาตรฐาน (ไม่มีใน POSIX, UNIX (SUS) หรือ Linux (LSB)) และไม่ใช่แบบพกพา โปรดทราบด้วยว่าเนื่องจากคำว่า "Mega" / "kilo" ... และตัวย่อ (M, k ... ) มีความหมายที่คลุมเครือ (1000 vs 1024) จึงไม่มีการรับประกันว่าสิ่งนี้หรือการนำไปปฏิบัติtailจะหมายถึงอะไรมาก2m(แม้ว่ารุ่นปัจจุบันของการใช้งานในปัจจุบันที่สนับสนุนดูเหมือนจะเป็นไปได้สำหรับตัวแปร 1024)


5
Tail ควรสามารถยอมรับหมายเลขที่มีหน่วยเป็นอาร์กิวเมนต์สำหรับสวิตช์ c ดังนั้นtail -c 2M myapp.logควรทำงานเช่นกัน
Petr Uzel

@ PetrUzel: ขอบคุณ แก้ไขคำตอบเพื่อเพิ่ม
Birei

ตอนนี้ฉันรู้สึกงี่เง่า :) ขอบคุณสำหรับความรวดเร็วขอบคุณจริง ๆ ที่ ข้อเสนอแนะยอดเยี่ยม!
jwbensley

1
สมบูรณ์แบบไม่แน่ใจว่าสิ่งนี้จะช่วยได้หรือไม่ แต่ฉันจะเพิ่มสตริงข้อความนี้เพราะมันคือสิ่งที่ฉันเป็นคำหลักที่ฉันค้นหาเพื่อให้ได้มาที่นี่ (ใช้เวลาพอสมควร): "ข้อมูลไฟล์แมวระหว่างสองตำแหน่งไบต์ (ไม่ใช่บรรทัด) "
Torxed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.