วิธีที่ดีที่สุดในการรับการจับคู่สุดท้ายของนิพจน์ปกติในไฟล์โดยใช้ grep คืออะไร
นอกจากนี้เป็นไปได้ไหมที่จะเริ่ม grepping จากจุดสิ้นสุดไฟล์แทนจุดเริ่มต้นและหยุดเมื่อพบการจับคู่ครั้งแรก
วิธีที่ดีที่สุดในการรับการจับคู่สุดท้ายของนิพจน์ปกติในไฟล์โดยใช้ grep คืออะไร
นอกจากนี้เป็นไปได้ไหมที่จะเริ่ม grepping จากจุดสิ้นสุดไฟล์แทนจุดเริ่มต้นและหยุดเมื่อพบการจับคู่ครั้งแรก
คำตอบ:
คุณสามารถลอง
grep pattern file | tail -1
หรือ
tac file | grep pattern | head -1
หรือ
tac file | grep -m1 pattern
grep -n
) ในไฟล์จริงผมคิดว่าสวยมากจะต้องมีการหลีกเลี่ยงถ้าฉันอยากจะทำบางอย่างกับลบtac
wc -l
เป็นอย่างอื่นtac
ด้วยgrep -m1
ทำให้รู้สึกมาก
grep
จะหยุดทำงานหลังจากนัดแรก โดยไม่ต้อง-m 1
, grep
แรกจะหารูปแบบที่ตรงกันทั้งหมดในแฟ้มแล้วhead
จะแสดงเพียงครั้งแรก - มีประสิทธิภาพน้อย เดนนิสโปรดพิจารณาโพสต์นี้ด้วยคำตอบแยกต่างหาก!
สำหรับคนที่ทำงานกับไฟล์ข้อความขนาดใหญ่ใน Unix / Linux / Mac / Cygwin ถ้าคุณใช้ Windows checkt นี้เกี่ยวกับเครื่องมือลินุกซ์ใน Windows: https://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windows
สามารถติดตามเวิร์กโฟลว์นี้เพื่อให้ได้ประสิทธิภาพที่ดี:
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
ฉันใช้แมวอยู่ตลอดเวลา cat file | grep pattern | tail -1
ฉันจะตำหนิครูสอนวิชา linux ของฉันที่วิทยาลัยที่รักแมว :))))
- คุณไม่ต้อง cat ไฟล์ก่อนที่จะ grepping มัน grep pattern file | tail -1
และมีประสิทธิภาพมากขึ้นเช่นกัน
cat
grep
คุณสามารถgrep
ค้นหาไฟล์ได้โดยตรงผ่านทางgrep pattern file
(จากนั้นใช้tail
เพื่อส่งกลับผลลัพธ์สุดท้าย) เช่นเดียวกับในคำตอบของ Cakemox
tac file | grep -m 1 pattern