grep ในไฟล์บันทึกขนาดใหญ่ (> 14 GB) เฉพาะ x GB สุดท้ายหรือไม่


34

ฉันต้องการค้นหาไฟล์บันทึกขนาดใหญ่ (มากกว่า 14 GB) ฉันค่อนข้างแน่ใจว่ามันอยู่ในช่วง 4 GB หรือมากกว่านั้น

มีวิธีการข้าม X GB แรกเพื่อเร่งความเร็วหรือไม่


7
LC_ALL=C grepอาจเร็วขึ้น
jfs

1
คุณจะสามารถได้รับความเร็วมากโดยการเลือกการgrepแสดงออกที่เหมาะสม... wildcard ของความยาวที่ไม่รู้จัก (เช่นa.*thing) จะในบางกรณีใช้เวลานานกว่าการประเมิน อาจเป็นไปได้ว่าคุณกำลังปรับสิ่งผิดให้เหมาะสม (แม้ว่าจะไม่เคยเจ็บปวดที่จะค้นหาเฉพาะส่วนหนึ่งของไฟล์อย่างชัดเจน - มันอาจไม่ใช่แหล่งที่มาของการเร่งความเร็วที่ยิ่งใหญ่ที่สุด)
Floris

คำตอบ:


75

ฉันเดาว่าคุณสามารถใช้tailเพื่อเอาท์พุทที่ 4GB ล่าสุดหรือมากกว่านั้นโดยใช้-cสวิตช์

-c, --bytes = [+] NUM
เอาต์พุตสุดท้าย NUM ไบต์; หรือใช้ -c + NUM เพื่อส่งออกเริ่มต้นด้วยไบต์ NUM ของแต่ละไฟล์

คุณสามารถทำบางสิ่งด้วยdd ได้ด้วยการตั้งค่าbs=1และskipเข้าสู่ offset ที่คุณต้องการเริ่มเช่น

dd if=file bs=1024k skip=12g | grep something

83
หลังจากนั้นคุณควรกำหนดค่า logrotate
เจอรัลด์ชไนเดอร์

3
@Rogier โปรดเพิ่มคำตอบด้วยวิธีการแก้ปัญหาแทนการเพิ่มในคำถามของคุณ สิ่งนี้คล้ายกับการตอบด้วยตนเอง: serverfault.com/help/self-answer
AL

5
@istheEnglishway: ใช่แล้วพวกเขาโพสต์คำสั่งอื่น
การแข่งขัน Lightness กับโมนิก้า

11
แต่คำตอบของคุณไม่ได้ให้คำสั่งจริงที่ใช้โซลูชันนั้นซึ่งเป็นการเพิ่มมูลค่า คุณสามารถแก้ไขมันเป็นคำตอบของคุณหรือ OP สามารถโพสต์มันเป็นคำตอบใหม่ พวกเขาไม่ควรเพิ่มเข้าไปในคำถามซึ่งเป็นสิ่งที่เกิดขึ้น และแน่นอนว่าคุณไม่ควรขว้างปาไปรอบ ๆ คำพังเพยอย่าง "จิ้มจมูก"
การแข่งขัน Lightness กับโมนิก้า

7
@istheEnglishway เชื่อหรือไม่มีตัวอย่างทำให้สิ่งต่าง ๆ ง่ายกว่าการอ่าน man page (ดูเพิ่มเติมที่: เอกสาร
คู่มือ

32

ฉันเพิ่งโพสต์สิ่งนี้เพราะมีความคิดเห็นบางส่วนถาม

สิ่งที่ฉันใช้คือ (ไฟล์ 15 GB) มันทำงานได้เร็วมากและช่วยฉันได้หนึ่งครั้ง

tail -f -c 14G file | grep something

ฉันยังได้สร้างเกณฑ์พื้นฐานที่ดีมากในไฟล์เดียวกัน ฉันทดสอบแล้ว:

grep xxx file
// ใช้เวลานาน (> 5 นาที)

dd if = file bs = 1 ข้าม = 14G | grep xxx
// เร็วมาก <1 วินาที

หาง -c 14g | grep xxx
// ค่อนข้างเร็ว <2 วินาที

tailเป็นเพียงเล็กน้อยสั้น

หมายเหตุ:ส่วนต่อท้ายที่ใช้gและGแตกต่างกันตามคำสั่ง (Ubuntu 15.10)


คุณล้างแคชดิสก์ระหว่างการวัดประสิทธิภาพหรือไม่ ฉันสงสัยว่าส่วนใหญ่ในครั้งแรกคือ I / O การเร่งความเร็วควรอยู่ในลำดับ 15 ×ไม่ใช่ 300 ×
Reid

2
@ อ่านฉันไม่ได้ แต่ฉันรันแต่ละคำสั่งหลายครั้ง ฉันค่อนข้างแน่ใจว่าddหรือtailจะเพิ่มความเร็วอย่างมีนัยสำคัญมากกว่าเพียงแค่grep (แคชหรือไม่)
Roger

19

สิ่งนี้ไม่ได้ตอบคำถามชื่อเรื่อง แต่จะทำในสิ่งที่คุณต้องการจะทำ ใช้ tac เพื่อย้อนกลับไฟล์จากนั้นใช้ grep เพื่อค้นหาสตริงของคุณ หากสตริงของคุณเกิดขึ้นเพียงครั้งเดียวหรือเป็นจำนวนครั้งที่รู้จักกันในไฟล์จากนั้นปล่อยให้มันทำงานจนกว่าจะพบจำนวนที่เกิดขึ้นเป็นที่รู้จัก ด้วยวิธีนี้หากสมมติฐานของคุณเกี่ยวกับตำแหน่งที่อยู่ในไฟล์ไม่ถูกต้องก็จะยังคงพบ หากคุณต้องการ จำกัด คุณสามารถใช้เฮดเพื่อทำสิ่งนั้นได้ คำสั่ง head จะอยู่ระหว่างแทกและ grep

ดังนั้นคำสั่งดูเหมือน:

tac < logfile | grep myString

1
ฉันมาที่นี่เพื่อเขียนคำตอบเดียวกัน ฉันประหลาดใจที่ไม่มีใครโหวตให้คุณ
Dmitry Grigoryev

2
ใช้เวลาสักครู่ แต่แล้วฉันก็คร่ำครวญที่ปุ่น ... แทคเป็นสิ่งที่ตรงกันข้ามกับแมว
Sammi

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