วิธีใช้ grep สำหรับ 2 บรรทัดที่แตกต่างกัน


15

ฉันจะค้นหาสองวลีที่แตกต่างกันอย่างไรเมื่ออยู่บนสองบรรทัดที่แตกต่างกันโดยใช้grepคำสั่งเดียว?

ตัวอย่างเช่น

บรรทัดที่ 1: นี่คือความหวาน

บรรทัดที่ 2: เลมอน

ฉันใช้สิ่งนี้ แต่ไม่มีผลลัพธ์

grep "sweet.*lemon" file_type

คำตอบ:


20

หากต้องการใช้grepสองบรรทัดที่แตกต่างกันให้ค้นหาทั้งสองรูปแบบ

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

หรือใช้สลับกัน

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

ในการรับบรรทัดถัดไปหลังจากรูปแบบคุณสามารถใช้ตัวเลือกบริบท

$ grep -A1 sweet file_type
This is a sweet
lemon.

แต่ถ้าคุณกำลังค้นหาอย่างชัดเจนสำหรับรูปแบบหลาย, นั่นเป็นเพราะหากินgrepคิดในสาย ... คุณ.*จะจับทุกอย่างระหว่าง "หวาน" และ "มะนาว" ในบรรทัด เราสามารถรับ "lemon" ในบรรทัดถัดไป-Pโดยใช้\nเพื่อให้ตรงกับ newline และโดยบอกว่าgrepไฟล์นั้นถูกคั่นด้วย-z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

หมายเหตุ:

  • -Eใช้นิพจน์ทั่วไปแบบขยาย (เพื่อใช้|อักขระสำหรับการสลับโดยไม่จำเป็นต้องหลบหนี)
  • -An พิมพ์บรรทัดเพิ่มเติมหลังจากรูปแบบโดยที่ n คือจำนวนของบรรทัดต่อท้ายที่จะพิมพ์
  • -Pใช้การแสดงออกปกติของ Perl สไตล์ ("ทดลอง" ในgrep- ติดตั้งpcregrepแทนเพื่อการสนับสนุนที่ดีกว่า perl regex)
  • -zใช้อักขระ null เป็นตัวคั่น (ทำท่าในกรณีนี้ แต่grepใช้คำพูดของเรา)
  • -o พิมพ์เฉพาะส่วนที่จับคู่

ในขณะที่grep -zPคำสั่งจะทำงานในกรณีเฉพาะนี้ (ไฟล์ที่ประกอบด้วยสองบรรทัด) โดยทั่วไปแล้วจะพิจารณาไฟล์ที่คั่นด้วย newline สามัญใด ๆ ที่จะเป็นบรรทัดเดียวดังนั้นการถ่ายโอนเนื้อหาไฟล์ทั้งหมด (ถ้ามีการแข่งขันที่ไหนสักแห่ง) หรือไม่มีอะไร มักที่ไม่ได้เป็นสิ่งที่ผู้คนใช้grepสำหรับ
Marc van Leeuwen

ใช่นี่เป็นประโยชน์กับ-o... แก้ไข ...
Zanna

ในกรณีที่มีการทดลองใช้ distros อื่น ๆ คุณอาจพบกับ: grep: The -P and -z options cannot be combined- เช่น grep (GNU grep) 2.5.1 บน RHEL
Jason Pyeron

6

แบบนี้:

grep "sweet\|lemon"

ขออภัย แต่สิ่งนี้จะตรงกับ "sweet | lemon" ที่แน่นอน
αғsнιη

4
@KasiyA บรรทัดนี้ทำงานได้ดี grepโดยผลงานที่เริ่มต้นในโหมด "มาตรฐาน" ที่ "ตัวอักษรพิเศษ" ชอบ|, +, *มีการตีความตามตัวอักษรเว้นแต่พวกเขากำลังสวมหน้ากากด้วยเครื่องหมายทับขวา ดูตัวอย่างคำตอบนี้ ในการใช้วิธีที่คุณอาจคุ้นเคยกับการที่ต้องสวมหน้ากาก "อักขระพิเศษ" เพื่อตีความอย่างแท้จริงคุณต้องเปลี่ยนไปใช้ "โหมดขยาย" ( grep -E) บางที madneon สามารถอธิบายเพิ่มเติมเกี่ยวกับคำตอบของเขาได้อีกเล็กน้อยตัวอย่างเช่น OP ที่ลองใช้จะจับคู่กันอย่างไร
Henning Kockerbeck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.