วิธีใช้คำสั่ง grep บน Linux

เผยแพร่แล้ว: 2022-01-29
พร้อมท์เทอร์มินัลบนพีซี Linux
Fatmawati Achmad Zaenuri/Shutterstock

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

เรื่องราวเบื้องหลัง grep

คำสั่ง grep มีชื่อเสียงในแวดวง Linux และ Unix ด้วยเหตุผลสามประการ ประการแรกมันมีประโยชน์อย่างมาก ประการที่สอง ความมั่งคั่งของตัวเลือกสามารถครอบงำได้ ประการที่สาม มันถูกเขียนขึ้นในชั่วข้ามคืนเพื่อตอบสนองความต้องการเฉพาะ สองคนแรกถูกกระแทก ที่สามปิดเล็กน้อย

Ken Thompson ได้ดึงความสามารถในการค้นหานิพจน์ทั่วไปออกจากตัวแก้ไข ed (ออกเสียงว่า ee-dee) และสร้างโปรแกรมเล็กๆ ขึ้นมาเพื่อใช้งานเอง เพื่อค้นหาไฟล์ข้อความ Doug McMahon หัวหน้าแผนกของเขาที่ Bell Labs ได้ติดต่อ Thompson และอธิบายปัญหาที่ Lee McMahon เพื่อนร่วมงานของเขากำลังเผชิญอยู่

คำสั่ง Linux พื้นฐาน 10 คำสั่งสำหรับผู้เริ่มต้น
คำสั่ง Linux พื้นฐาน 10 คำสั่ง ที่เกี่ยวข้อง สำหรับผู้เริ่มต้น

แมคมาฮอนพยายามระบุผู้เขียนบทความของ Federalist ผ่านการวิเคราะห์ข้อความ เขาต้องการเครื่องมือที่สามารถค้นหาวลีและสตริงในไฟล์ข้อความได้ ทอมป์สันใช้เวลาประมาณหนึ่งชั่วโมงในเย็นวันนั้นเพื่อทำให้เครื่องมือของเขาเป็นยูทิลิตี้ทั่วไปที่ผู้อื่นสามารถใช้และเปลี่ยนชื่อเป็น grep เขาใช้ชื่อจากสตริงคำสั่ง ed g/re/p ซึ่งแปลว่า "การค้นหานิพจน์ทั่วไปทั่วโลก"

คุณสามารถรับชม Thompson พูดคุยกับ Brian Kernighan เกี่ยวกับการกำเนิดของ grep

การค้นหาอย่างง่ายด้วย grep

ในการค้นหาสตริงภายในไฟล์ ให้ส่งคำค้นหาและชื่อไฟล์บนบรรทัดคำสั่ง:

grep dave /etc/password ในเทอร์มินัล widnow
โฆษณา

เส้นที่ตรงกันจะปรากฏขึ้น ในกรณีนี้จะเป็นบรรทัดเดียว ข้อความที่ตรงกันจะถูกเน้น นี่เป็นเพราะการแจกแจงส่วนใหญ่ grep มีนามแฝงว่า:

 นามแฝง grep='grep --colour=auto'

ลองดูผลลัพธ์ที่มีหลายบรรทัดที่ตรงกัน เราจะมองหาคำว่า “เฉลี่ย” ในไฟล์บันทึกของแอปพลิเคชัน เนื่องจากเราจำไม่ได้ว่าคำนั้นอยู่ในไฟล์บันทึกหรือไม่ เราจะใช้ตัวเลือก -i (ละเว้นตัวพิมพ์เล็ก):

 grep -i เฉลี่ย geek-1.log 

ทุกบรรทัดที่ตรงกันจะปรากฏขึ้น โดยเน้นข้อความที่ตรงกันในแต่ละบรรทัด

เราสามารถแสดงบรรทัดที่ไม่ตรงกันโดยใช้ตัวเลือก -v (กลับด้าน)

 grep -v Mem geek-1.log 

ไม่มีการเน้นเนื่องจากเป็นบรรทัดที่ไม่ตรงกัน

โฆษณา

เราสามารถทำให้ grep เงียบสนิทได้ ผลลัพธ์ถูกส่งไปยังเชลล์เป็นค่าส่งคืนจาก grep ผลลัพธ์ของศูนย์หมายถึงพบสตริง และผลลัพธ์ของหนึ่งหมายความ ว่าไม่ พบ สตริง เราสามารถตรวจสอบรหัสส่งคืนโดยใช้ $? พารามิเตอร์พิเศษ:

 grep -q เฉลี่ย geek-1.log
 เสียงสะท้อน $?
 grep -q howtogeek geek-1.log
 เสียงสะท้อน $? 

การค้นหาแบบเรียกซ้ำด้วย grep

หากต้องการค้นหาผ่านไดเร็กทอรีที่ซ้อนกันและไดเร็กทอรีย่อย ให้ใช้ตัวเลือก -r (แบบเรียกซ้ำ) โปรดทราบว่าคุณไม่ได้ระบุชื่อไฟล์ในบรรทัดคำสั่ง คุณต้องระบุเส้นทาง เรากำลังค้นหาในไดเร็กทอรีปัจจุบัน “.” และไดเร็กทอรีย่อยใดๆ:

 grep -r -i memfree 

ผลลัพธ์รวมถึงไดเร็กทอรีและชื่อไฟล์ของแต่ละบรรทัดที่ตรงกัน

เราสามารถทำให้ grep ติดตามลิงก์สัญลักษณ์ได้โดยใช้ตัวเลือก -R (recursive dereference) เรามีลิงก์สัญลักษณ์ในไดเร็กทอรีนี้ เรียกว่า logs-folder มันชี้ไปที่ /home/dave/logs

 ls -l บันทึกโฟลเดอร์ 

ลองทำการค้นหาครั้งล่าสุดของเราซ้ำด้วยตัวเลือก -R (recursive dereference):

 grep -R -i memfree 

ตามลิงค์สัญลักษณ์และไดเรกทอรีที่ชี้ไปจะถูกค้นหาโดย grep ด้วย

ค้นหาทั้งคำ

โดยค่าเริ่มต้น grep จะจับคู่บรรทัดหากเป้าหมายการค้นหาปรากฏที่ใดก็ได้ในบรรทัดนั้น รวมถึงภายในสตริงอื่นด้วย ดูตัวอย่างนี้ เราจะค้นหาคำว่า "ฟรี"

 grep -i ฟรี geek-1.log 

โฆษณา

ผลลัพธ์คือบรรทัดที่มีสตริง "free" อยู่ในนั้น แต่ไม่ใช่คำที่แยกจากกัน พวกเขาเป็นส่วนหนึ่งของสตริง "MemFree"

หากต้องการบังคับให้ grep จับคู่เฉพาะ "คำ" ให้ใช้ตัวเลือก -w (word regexp)

 grep -w -i ฟรี geek-1.log
 เสียงสะท้อน $? 

คราวนี้ไม่มีผลลัพธ์เนื่องจากคำค้นหา "ฟรี" ไม่ปรากฏในไฟล์เป็นคำที่แยกจากกัน

การใช้คำค้นหาหลายคำ

ตัวเลือก -E (extended regexp) ช่วยให้คุณค้นหาคำได้หลายคำ (ตัวเลือก -E แทนที่ grep เวอร์ชัน egrep ที่เลิกใช้แล้ว)

คำสั่งนี้จะค้นหาคำค้นหาสองคำคือ "ค่าเฉลี่ย" และ "memfree"

 grep -E -w -i "average|memfree" geek-1.log 

โฆษณา

บรรทัดที่ตรงกันทั้งหมดจะแสดงขึ้นสำหรับคำค้นหาแต่ละคำ

คุณยังสามารถค้นหาคำหลายคำที่ไม่จำเป็นต้องเป็นทั้งคำ แต่ก็สามารถเป็นทั้งคำได้เช่นกัน

ตัวเลือก -e (รูปแบบ) ช่วยให้คุณใช้คำค้นหาหลายคำในบรรทัดคำสั่งได้ เรากำลังใช้ประโยชน์จากคุณสมบัติวงเล็บนิพจน์ทั่วไปเพื่อสร้างรูปแบบการค้นหา มันบอกให้ grep จับคู่อักขระตัวใดตัวหนึ่งที่อยู่ในวงเล็บ "[]" ซึ่งหมายความว่า grep จะจับคู่ "kB" หรือ "KB" ขณะที่ค้นหา

สตริงทั้งสองตรงกัน และที่จริงแล้ว บางบรรทัดมีทั้งสองสตริง

จับคู่เส้นตรงทั้งหมด

-x (line regexp) จะจับคู่เฉพาะบรรทัดที่ ทั้งบรรทัด ตรงกับข้อความค้นหา มาค้นหาตราประทับวันที่และเวลาที่เราทราบว่าปรากฏเพียงครั้งเดียวในไฟล์บันทึก:

 grep -x "20-Jan--06 15:24:35" geek-1.log 

พบและแสดงบรรทัดเดียวที่ตรงกัน

ตรงกันข้ามคือแสดงเฉพาะบรรทัดที่ ไม่ ตรงกัน สิ่งนี้มีประโยชน์เมื่อคุณดูไฟล์การกำหนดค่า ความคิดเห็นนั้นยอดเยี่ยม แต่บางครั้งก็ยากที่จะระบุการตั้งค่าจริงจากทั้งหมด นี่คือไฟล์ /etc/sudoers :

โฆษณา

เราสามารถกรองบรรทัดความคิดเห็นได้อย่างมีประสิทธิภาพดังนี้:

 sudo grep -v "#" /etc/sudoers 

แยกวิเคราะห์ง่ายกว่ามาก

แสดงเฉพาะข้อความที่ตรงกัน

อาจมีบางครั้งที่คุณไม่ต้องการเห็นบรรทัดที่ตรงกันทั้งหมด เพียงแต่ข้อความที่ตรงกัน ตัวเลือก -o (จับคู่เท่านั้น) ทำเช่นนั้น

 grep -o MemFree geek-1.log 

การแสดงผลถูกย่อให้แสดงเฉพาะข้อความที่ตรงกับคำค้นหา แทนที่จะแสดงทั้งบรรทัดที่ตรงกัน

นับด้วย grep

grep ไม่ได้เป็นเพียงเกี่ยวกับข้อความเท่านั้น แต่ยังสามารถให้ข้อมูลที่เป็นตัวเลขได้อีกด้วย เราสามารถนับ grep ให้เราได้หลายวิธี หากเราต้องการทราบจำนวนครั้งที่ข้อความค้นหาปรากฏในไฟล์ เราสามารถใช้ตัวเลือก -c (นับ)

 grep -c เฉลี่ย geek-1.log 

grep รายงานว่าข้อความค้นหาปรากฏขึ้น 240 ครั้งในไฟล์นี้

คุณสามารถทำให้ grep แสดงหมายเลขบรรทัดสำหรับแต่ละบรรทัดที่ตรงกันโดยใช้ตัวเลือก -n (หมายเลขบรรทัด)

 grep -n Jan geek-1.log 

โฆษณา

หมายเลขบรรทัดสำหรับแต่ละบรรทัดที่ตรงกันจะแสดงที่จุดเริ่มต้นของบรรทัด

หากต้องการลดจำนวนผลลัพธ์ที่แสดง ให้ใช้ตัวเลือก -m (จำนวนสูงสุด) เราจะจำกัดเอาต์พุตไว้ที่ห้าบรรทัดที่ตรงกัน:

 grep -m5 -n ม.ค. geek-1.log 

การเพิ่มบริบท

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

หากต้องการแสดงบางบรรทัดหลังบรรทัดที่ตรงกัน ให้ใช้ตัวเลือก -A (หลังบริบท) เราขอสามบรรทัดในตัวอย่างนี้:

 grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log 

หากต้องการดูบางบรรทัดก่อนถึงบรรทัดที่ตรงกัน ให้ใช้ตัวเลือก -B (บริบทก่อน)

 grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log 

และหากต้องการรวมบรรทัดก่อนและหลังบรรทัดที่ตรงกัน ให้ใช้ตัวเลือก -C (บริบท)

 grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log 

กำลังแสดงไฟล์ที่ตรงกัน

หากต้องการดูชื่อไฟล์ที่มีคำค้นหา ให้ใช้ตัวเลือก -l (ไฟล์ที่ตรงกัน) หากต้องการค้นหาว่าไฟล์ซอร์สโค้ด C ใดมีการอ้างอิงไปยังไฟล์ส่วนหัว sl.h ให้ใช้คำสั่งนี้:

 grep -l "sl.h" *.c 

ชื่อไฟล์อยู่ในรายการ ไม่ใช่บรรทัดที่ตรงกัน

โฆษณา

และแน่นอน เราสามารถค้นหาไฟล์ที่ไม่มีคำค้นหาได้ ตัวเลือก -L (ไฟล์ที่ไม่ตรงกัน) ทำได้แค่นั้น

 grep -L "sl.h" *.c 

จุดเริ่มต้นและจุดสิ้นสุดของบรรทัด

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

 grep "^ " geek-1.log 

บรรทัดที่มีช่องว่างเป็นอักขระตัวแรก—ที่ต้นบรรทัด—จะแสดงขึ้น

เพื่อให้ตรงกับส่วนท้ายของบรรทัด ให้ใช้ตัวดำเนินการนิพจน์ทั่วไป “$” เราจะค้นหาบรรทัดที่ลงท้ายด้วย “00”

 grep "00$" geek-1.log 

หน้าจอแสดงบรรทัดที่มี “00” เป็นอักขระสุดท้าย

การใช้ท่อกับ grep

แน่นอน คุณสามารถไพพ์อินพุตไปที่ grep เอาต์พุตจาก grep ไปยังโปรแกรมอื่น และให้ grep อยู่ตรงกลางของไพพ์เชน

โฆษณา

สมมติว่าเราต้องการเห็นการเกิดขึ้นทั้งหมดของสตริง “ExtractParameters” ในไฟล์ซอร์สโค้ด C ของเรา เรารู้ว่าจะมีค่อนข้างน้อย ดังนั้นเราจึงไพพ์เอาต์พุตเป็น less :

 grep "ExtractParameters" *.c | น้อย 

ผลลัพธ์ถูกนำเสนอใน less

ซึ่งจะทำให้คุณสามารถเลื่อนดูรายการไฟล์และใช้สิ่งอำนวยความสะดวกในการค้นหา less's

หากเราไพพ์เอาต์พุตจาก grep ไปที่ wc และใช้ตัวเลือก -l (บรรทัด) เราสามารถนับจำนวนบรรทัดในไฟล์ซอร์สโค้ดที่มี "ExtractParameters" (เราสามารถทำได้โดยใช้ตัวเลือก grep -c (count) แต่นี่เป็นวิธีที่เรียบร้อยในการสาธิตการวางท่อ grep )

 grep "ExtractParameters" *.c | wc -l 

ด้วยคำสั่งถัดไป เรากำลังไพพ์เอาต์พุตจาก ls ไปที่ grep และไพพ์เอาต์พุตจาก grep ไปเป็น sort เรากำลังแสดงรายการไฟล์ในไดเร็กทอรีปัจจุบัน เลือกไฟล์ที่มีสตริง "Aug" และจัดเรียงตามขนาดไฟล์:

 ls -l | grep "ส.ค." | เรียงลำดับ +4n 

มาทำลายมันกันเถอะ:

  • ls -l : ทำการแสดงรายการไฟล์ในรูปแบบยาวโดยใช้ ls
  • grep “Aug” : เลือกบรรทัดจากรายการ ls ที่มี “Aug” อยู่ในนั้น โปรดทราบว่าการดำเนินการนี้จะพบไฟล์ที่มีชื่อ "Aug" ด้วย
  • sort +4n : เรียงลำดับผลลัพธ์จาก grep ในคอลัมน์ที่สี่ (ขนาดไฟล์)

เราได้รับรายการเรียงของไฟล์ทั้งหมดที่แก้ไขในเดือนสิงหาคม (โดยไม่คำนึงถึงปี) โดยเรียงจากน้อยไปมากของขนาดไฟล์

ที่เกี่ยวข้อง: วิธีใช้ท่อบน Linux

grep: ออกคำสั่งน้อยลง เป็นพันธมิตรมากขึ้น

grep เป็นเครื่องมือที่ยอดเยี่ยมสำหรับคุณ มีมาตั้งแต่ปี 1974 และยังคงแข็งแกร่งเพราะเราต้องการในสิ่งที่ทำ และไม่มีอะไรดีขึ้น

การจับคู่ grep กับนิพจน์ทั่วไปบางตัว fu นำไปสู่ระดับต่อไปจริงๆ

ที่เกี่ยวข้อง: วิธีใช้นิพจน์ทั่วไปพื้นฐานเพื่อค้นหาได้ดีขึ้นและประหยัดเวลา

ที่เกี่ยวข้อง: แล็ปท็อป Linux ที่ดีที่สุดสำหรับนักพัฒนาและผู้ที่ชื่นชอบ