รับการจับคู่ครั้งสุดท้ายในไฟล์โดยใช้ grep


58

วิธีที่ดีที่สุดในการรับการจับคู่สุดท้ายของนิพจน์ปกติในไฟล์โดยใช้ grep คืออะไร

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

คำตอบ:


85

คุณสามารถลอง

grep pattern file | tail -1

หรือ

tac file | grep pattern | head -1

หรือ

tac file | grep -m1 pattern

20
tac file | grep -m 1 pattern
Dennis Williamson

1
ด้วยข้อ จำกัด เพิ่มที่ฉันต้องการที่จะได้รับหมายเลขบรรทัด ( grep -n) ในไฟล์จริงผมคิดว่าสวยมากจะต้องมีการหลีกเลี่ยงถ้าฉันอยากจะทำบางอย่างกับลบtac wc -lเป็นอย่างอื่นtacด้วยgrep -m1ทำให้รู้สึกมาก
Nick Merrill

1
ฉันชอบที่จะดูเวอร์ชั่นที่มีประสิทธิภาพมากกว่านี้เนื่องจากฉันพยายามค้นหาไฟล์ 20GB
Jeff

คำตอบของ @DennisWilliamson นั้นดีกว่าเพราะgrepจะหยุดทำงานหลังจากนัดแรก โดยไม่ต้อง-m 1, grepแรกจะหารูปแบบที่ตรงกันทั้งหมดในแฟ้มแล้วheadจะแสดงเพียงครั้งแรก - มีประสิทธิภาพน้อย เดนนิสโปรดพิจารณาโพสต์นี้ด้วยคำตอบแยกต่างหาก!
gilad mayani

1

สำหรับคนที่ทำงานกับไฟล์ข้อความขนาดใหญ่ใน Unix / Linux / Mac / Cygwin ถ้าคุณใช้ Windows checkt นี้เกี่ยวกับเครื่องมือลินุกซ์ใน Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows

สามารถติดตามเวิร์กโฟลว์นี้เพื่อให้ได้ประสิทธิภาพที่ดี:

  1. บีบอัดด้วย gzip
  2. ใช้ zindex (บน github: https://github.com/mattgodbolt/zindex ) เพื่อสร้างดัชนีไฟล์ด้วยรหัสที่เหมาะสม
  3. สอบถามไฟล์ที่จัดทำดัชนีด้วยzqจากแพคเกจ

อ้างอิงจาก github readme:

การสร้างดัชนี

zindex จำเป็นต้องได้รับการบอกว่าส่วนใดของแต่ละบรรทัดถือเป็นดัชนี สิ่งนี้สามารถทำได้โดยการแสดงออกปกติโดยสนามหรือโดยท่อแต่ละบรรทัดผ่านโปรแกรมภายนอก

โดยค่าเริ่มต้น zindex สร้างดัชนีของ file.gz.zindex เมื่อถูกขอให้ทำดัชนี file.gz

ตัวอย่าง:

สร้างดัชนีในบรรทัดที่ตรงกับการแสดงออกปกติตัวเลข กลุ่มการดักจับระบุส่วนที่จะจัดทำดัชนีและตัวเลือกที่แสดงแต่ละบรรทัดจะมีดัชนีที่เป็นเอกลักษณ์และตัวเลข

$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique

ตัวอย่าง: สร้างดัชนีในฟิลด์ที่สองของไฟล์ CSV:

$ zindex file.gz --delimiter , --field 2 

ตัวอย่าง:

สร้างดัชนีบนฟิลด์ JSON orderId.id ในรายการใด ๆ ในอาร์เรย์การกระทำของรูทเอกสาร (ต้องมี jq) แบบสอบถาม jq สร้างอาร์เรย์ของ orderId.ids ทั้งหมดจากนั้นรวมกับช่องว่างเพื่อให้แน่ใจว่าแต่ละบรรทัดที่ส่งไปยัง jq จะสร้างเอาต์พุตบรรทัดเดียวโดยมีการจับคู่หลายรายการคั่นด้วยช่องว่าง (ซึ่งเป็นตัวคั่นเริ่มต้น)

$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'" 

การสืบค้นดัชนี

โปรแกรม zq ใช้เพื่อสืบค้นดัชนี มันได้รับชื่อของไฟล์บีบอัดและรายการแบบสอบถาม ตัวอย่างเช่น:

$ zq file.gz 1023 4443 554 

นอกจากนี้ยังสามารถส่งออกด้วยหมายเลขบรรทัดดังนั้นในการพิมพ์บรรทัดที่ 1 และ 1,000 จากไฟล์:

$ zq file.gz --line 1 1000

1

ฉันใช้แมวอยู่ตลอดเวลา cat file | grep pattern | tail -1

ฉันจะตำหนิครูสอนวิชา linux ของฉันที่วิทยาลัยที่รักแมว :))))

- คุณไม่ต้อง cat ไฟล์ก่อนที่จะ grepping มัน grep pattern file | tail -1และมีประสิทธิภาพมากขึ้นเช่นกัน


6
นี่เป็นเพียงส่วนแรกของคำตอบของ Cakemox ยกเว้นแย่กว่านั้น
augurar

มันใช้งานได้ แต่ทำตามขั้นตอนที่ไม่จำเป็น สำหรับการใช้งานแบบเบาโซลูชันนี้ใช้งานได้ดี แต่ทำงานได้ไม่ดี เหตุผลเป็นเพราะคุณไม่จำเป็นต้องไฟล์และท่อไปยังcat grepคุณสามารถgrepค้นหาไฟล์ได้โดยตรงผ่านทางgrep pattern file(จากนั้นใช้tailเพื่อส่งกลับผลลัพธ์สุดท้าย) เช่นเดียวกับในคำตอบของ Cakemox
jvriesem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.