Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เรียนรู้ Grep: ค้นหาคำ หลายสตริง และรูปแบบได้อย่างง่ายดาย

คู่มือนี้อธิบายวิธีใช้ยูทิลิตี้ grep สำหรับค้นหา คำ, สตริง, และ รูปแบบ หลายรายการ คุณสามารถหาตัวอย่างเต็มรูปแบบของคำสั่งที่ใช้ทำสิ่งนี้ได้ด้านล่าง

Grep คืออะไร?

เมื่อเราพูดถึง grep เราหมายถึง ฟังก์ชันบรรทัดคำสั่ง Grep ย่อมาจาก Global Regular Expression Print ในเบื้องต้น มันจะค้นหาไฟล์อินพุทเพื่อหาบรรทัดที่ตรงกับนิพจน์ปกติ (regular expression) บางอย่าง จากนั้นคืนค่าผลลัพธ์โดยเขียนแต่ละบรรทัดสำหรับ standard output

ยูทิลิตี้ grep เหมาะสำหรับไวยากรณ์นิพจน์สามแบบ สามารถระบุเป็น Basic, Extended หรือ Perl-compatible หากไม่มีการระบุไวยากรณ์นิพจน์ปกติ grep จะตั้งค่ารูปแบบการค้นหาเป็น basic expressions

Grep สำหรับรูปแบบหลายรูปแบบ

หากคุณต้องการค้นหาแม่แบบหลายแบบ คุณสามารถใช้ตัวดำเนินการ OR ซึ่งเรียกว่า alternation operator ตัวดำเนินการ/pipe นี้มีลักษณะดังนี้: |

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

$ grep 'first pattern\|second pattern' filename

('first pattern' และ 'second pattern') จะถูกแทนที่ด้วยแม่แบบที่คุณค้นหา นิพจน์ปกตินี้ – 'first pattern\|second pattern' – ควรอยู่ในเครื่องหมายคำพูดเดี่ยวเสมอ สัญลักษณ์ pipe ไม่ได้รับการรองรับเป็น alternation operator และตัวอักษร escape (backslash) จึงจำเป็นเพื่อบอก grep ให้จัดการ pipe อย่างแตกต่าง

เพื่อระบุแม่แบบที่ตั้งใจเป็น extended regular expression สามารถใช้ '-e' หรือ '—extended-regexp' ตัวอย่างเช่น:

$ grep -E 'first pattern|second pattern' filename

ใน extended regex คุณไม่จำเป็นต้อง escape pipe

คุณสามารถค้นหาโดยไฟล์ ดังนั้น การค้นหารูปแบบใน presentation.txt อาจมีลักษณะดังนี้:

$ grep -E 'first pattern|second pattern' presentation.txt

เอาต์พุทจะแสดงสตริงที่คุณต้องการ grep ไฮไลท์

หากไฟล์ที่คุณค้นหาอยู่ในไดเรกทอรีอื่น คุณจะต้องสั่ง grep ให้ค้นหาในไดเรกทอรีเฉพาะนั้นโดยใช้เส้นทางไฟล์เต็ม ตัวอย่างเช่น:

$ grep -E 'first pattern|second pattern' /home/presentation.txt

Grep สำหรับสตริงหลายสตริง

รูปแบบพื้นฐานที่สุดคือสตริงตัวต่อตัว เพื่อค้นหาสตริงหลายสตริง คุณจะใส่หลังคำสั่ง grep สมมติเรากำลังค้นหา 'one', 'two', และ 'three' อาจมีลักษณะดังนี้:

$ grep 'one\|two\|three'

ตามด้วย คำสั่ง พร้อมไฟล์ที่คุณค้นหา หากคุณค้นหาโดยใช้ extended regular expression คุณก็แค่เอา '\' ออก ตัวอย่างเช่น:

$ grep -E 'one|two|three'

ไม่สนใจตัวพิมพ์เล็ก/ใหญ่

คำสั่ง 'grep' คำนึงถึงตัวพิมพ์เล็ก/ใหญ่ เพื่อไม่สนใจตัวพิมพ์ ให้เรียกใช้กับตัวเลือก '-i' หรือ '—ignore-case' ตัวอย่างเช่น:

$ grep -i 'one\|two\|three'

แสดงจำนวนการจับคู่หลายรายการ

หากคุณอยู่ในไฟล์ล็อกและต้องการทราบว่าจำนวนข้อความเตือนและข้อผิดพลาดเพิ่มขึ้นหรือไม่ แต่โดยไม่ดูผลลัพธ์โดยละเอียด คุณสามารถใช้ '-c' เพื่อนับการจับคู่หลายรายการภายในไฟล์ myapp.log อาจมีลักษณะดังนี้:

grep -c 'one\|two\|three' /var/log/myapp.log

Grep แม่แบบหลายแบบในประเภทไฟล์เฉพาะ

สตริงหลายสตริงสามารถค้นหาในประเภทไฟล์เฉพาะได้ นี่ช่วยให้คุณค้นหา ตัวอย่างเช่น ไฟล์ข้อความทั้งหมด หรือไฟล์ล็อกทั้งหมดภายในไดเรกทอรี การใช้ asterisk กับนามสกุลไฟล์แทนชื่อไฟล์จะสั่งให้ grep ทำงาน การใช้ตัวอย่างข้างต้นสำหรับข้อความข้อผิดพลาด การค้นหาผ่านไฟล์ล็อกทั้งหมดอาจมีลักษณะดังนี้:

grep -c 'one\|two\|three' /var/log/*.log

ค้นหาแบบ Recursive สำหรับการจับคู่หลายรายการ

การใช้ grep จะค้นหาเฉพาะในไดเรกทอรีปัจจุบันกับ asterisk ที่ใช้ หากคุณต้องการรวมไดเรกทอรีย่อยทั้งหมด สามารถใช้ตัวเลือก '-R':

grep -R 'one\|two\|three' /var/log/*.log

นี่จะคืนค่าผลลัพธ์สำหรับไฟล์ทั้งหมดที่พบภายในไดเรกทอรี var/log/ ที่ระบุและไดเรกทอรีย่อย

ใช้ grep สำหรับการจับคู่ที่แม่นยำ

คำสั่ง 'grep' จะแสดงผลลัพธ์ทั้งหมดที่สตริงถูกฝังอยู่ด้วย ไม่ใช่แค่การจับคู่ที่แม่นยำ ตัวอย่างเช่น เมื่อค้นหา 'value' มันจะพิมพ์บรรทัดที่รวม 'values' และ 'valued' ด้วย หากคุณต้องการคืนค่าบรรทัดที่มีการจับคู่คำเต็มรูปแบบเท่านั้น คุณสามารถใช้ '-w' หรือ '—word-regexp' นี่อาจมีลักษณะดังนี้หากคุณค้นหาการจับคู่ที่แม่นยำของ 'one', 'two', และ 'three':

$ grep -w 'one\|two\|three'

ตัวอักษรคำรวมถึง alphanumeric ดังนั้น 0-9 และ a-z รวมถึงตัวอักษร underscore ตัวอักษรอื่นๆ ถือว่าเป็น non-word characters