บทนำ
คำสั่ง grep Linux ใช้เป็นวิธีการกรองข้อมูลเข้า
GREP ย่อมาจาก Global Regular Expression Printer และดังนั้นเพื่อที่จะใช้งานได้อย่างมีประสิทธิภาพคุณควรมีความรู้เกี่ยวกับการแสดงออกปกติ
ในบทความนี้ฉันจะแสดงตัวอย่างซึ่งจะช่วยให้คุณเข้าใจคำสั่ง grep
01 จาก 09
วิธีค้นหาสตริงในไฟล์โดยใช้ GREP
ลองนึกภาพคุณมีไฟล์ข้อความที่เรียกว่าหนังสือที่มีชื่อหนังสือเด็ก ๆ ต่อไปนี้:
- โรบินฮู้ด
- หนูน้อยหมวกแดง
- ปีเตอร์แพน
- Goldilocks และสามหมี
- สโนไวท์กับคนแคระทั้งเจ็ด
- Pinnochio
- แมวนั้นอยู่ในหมวก
- ลูกหมูสามตัว
- The Gruffalo
- ชาลีและโรงงานช็อกโกแลต
หากต้องการค้นหาหนังสือทั้งหมดที่มีคำว่า "The" ในชื่อหนังสือคุณจะต้องใช้ไวยากรณ์ต่อไปนี้:
grep หนังสือ
ผลลัพธ์ต่อไปนี้จะได้รับการคืน:
- Goldilocks และสามหมี
- สโนไวท์กับคนแคระทั้งเจ็ด
- แมวนั้นอยู่ในหมวก
- ลูกหมูสามตัว
- The Gruffalo
- ชาลีและโรงงานช็อกโกแลต
ในแต่ละกรณีคำว่า "The" จะถูกเน้น
โปรดทราบว่าการค้นหาเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ดังนั้นถ้าหนึ่งในชื่อมี "the" แทน "The" แล้วจะไม่มีการส่งคืน
หากไม่สนใจกรณีที่คุณสามารถเพิ่มสวิตช์ต่อไปนี้:
grep หนังสือ - กรณีที่ได้รับอนุมัติ
นอกจากนี้คุณยังสามารถใช้สวิตช์ -i ดังนี้:
grep -i หนังสือ
02 จาก 09
ค้นหาสตริงในไฟล์ที่ใช้สัญลักษณ์แทน
คำสั่ง grep มีประสิทธิภาพมาก คุณสามารถใช้เทคนิคการจับคู่รูปแบบต่างๆเพื่อกรองผลลัพธ์
ในตัวอย่างนี้เราจะแสดงวิธีค้นหาสตริงในไฟล์โดยใช้ สัญลักษณ์แทน
ลองนึกภาพคุณมีไฟล์ที่เรียกว่าสถานที่ที่มีชื่อสถานที่สกอตแลนด์ต่อไปนี้:
อเบอร์ดีน
Aberystwyth
Aberlour
Inverurie
อินเวอร์เนส
นิว
กวางตัวใหม่
Galloway ใหม่
กลาสโกว์
เอดินเบอระ
ถ้าคุณต้องการหาสถานที่ทั้งหมดที่มี inver ในชื่อใช้ไวยากรณ์ต่อไปนี้:
grep inver * places
เครื่องหมายดอกจัน (*) หมายถึง 0 หรือหลาย ดังนั้นถ้าคุณมีที่เรียกว่า inver หรือที่เรียกว่า inverness แล้วทั้งสองจะถูกส่งกลับ
สัญลักษณ์ตัวแทนอื่นที่คุณสามารถใช้คือช่วง (.) คุณสามารถใช้ตัวเลือกนี้เพื่อให้ตรงกับตัวอักษรตัวเดียว
สถานที่ inver.r grep
คำสั่งข้างต้นจะหาสถานที่ที่เรียกว่า inverurie และ inverary แต่จะไม่พบความเป็นตัวตนเพราะมีเพียงสัญลักษณ์เดียวระหว่าง r สองเท่าที่ระบุไว้ในช่วงเวลาเดียว
สัญลักษณ์ประจำงวดเป็นประโยชน์ แต่อาจทำให้เกิดปัญหาได้หากคุณมีข้อความค้นหาเป็นส่วนหนึ่งของข้อความที่คุณกำลังค้นหา
ตัวอย่างเช่นดูที่รายการชื่อโดเมนนี้
- linux.about.com
- pcsupport.about.com
- mp3.about.com
- minecraft.about.com
- androidgames.about.com
- netforbeginners.about.com
- everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
หากต้องการค้นหา about.com ทั้งหมดทั้งหมดที่คุณสามารถค้นหาโดยใช้ไวยากรณ์ต่อไปนี้:
grep * เกี่ยวกับ * domainnames
คำสั่งดังกล่าวจะล้มลงถ้ารายการมีชื่อต่อไปนี้:
- everydaylinuxuser.com/about.html
คุณสามารถลองใช้ไวยากรณ์ต่อไปนี้:
grep * about.com domainnames
นี้จะทำงานได้จนกว่าจะมีโดเมนที่มีชื่อต่อไปนี้:
aboutycom.com
ในการค้นหาคำ about.com โดยประมาณคุณจะต้องหลีกเลี่ยงจุดดังนี้:
grep * เกี่ยวกับ \ .com domainnames
สัญลักษณ์แทนสุดท้ายที่จะแสดงให้คุณเห็นคือเครื่องหมายคำถามซึ่งหมายถึงอักขระ 0 หรืออักขระหนึ่งตัว
ตัวอย่างเช่น:
grep? ber placenames
คำสั่งดังกล่าวจะกลับคืนมาเป็นปกติ aberthent หรือ berwick
03 จาก 09
ค้นหาสตริงที่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัดโดยใช้ grep
สัญลักษณ์กะรัต (^) และดอลลาร์ ($) ช่วยให้คุณค้นหารูปแบบที่จุดเริ่มต้นและจุดสิ้นสุดของเส้น
ลองนึกภาพคุณมีไฟล์ชื่อฟุตบอลที่มีชื่อทีมต่อไปนี้:
- แบล็คพูล
- ลิเวอร์พูล
- เมืองแมนเชสเตอร์
- เลสเตอร์ซิตี้
- แมนเชสเตอร์ยูไนเต็ด
- Newcastle United
- เอฟซียูไนเต็ดแมนเชสเตอร์
ถ้าคุณต้องการหาทีมงานทั้งหมดที่ขึ้นต้นด้วยแมนเชสเตอร์คุณจะใช้ไวยากรณ์ต่อไปนี้:
grep ^ ทีมแมนเชสเตอร์
คำสั่งดังกล่าวจะส่งผลให้ Manchester City และ Manchester United ไม่ได้เป็น FC United Of Manchester
หรือคุณสามารถหาทีมงานทั้งหมดที่ลงท้ายด้วย United โดยใช้ไวยากรณ์ต่อไปนี้:
grep United $ teams
คำสั่งดังกล่าวจะส่งผลให้ Manchester United และ Newcastle United ไม่ได้เป็น FC United Of Manchester
04 จาก 09
การนับจำนวนการจับคู่โดยใช้ grep
ถ้าคุณไม่ต้องการส่งคืนบรรทัดจริงที่ตรงกับรูปแบบโดยใช้ grep แต่คุณเพียงแค่ต้องการทราบว่ามีกี่วิธีที่คุณสามารถใช้ไวยากรณ์ต่อไปนี้:
grep -c pattern inputfile
หากรูปแบบถูกจับคู่กันสองครั้งจะมีการส่งคืนหมายเลข 2
05 จาก 09
ค้นหาข้อกำหนดทั้งหมดที่ไม่ตรงกันโดยใช้ grep
ลองนึกภาพคุณมีรายชื่อสถานที่กับประเทศที่ระบุไว้ดังนี้:
- aberdeen scotland
- glasgow scotland
- liverpool england
- อ่าว Colwyn
- ลอนดอน, อังกฤษ
คุณอาจสังเกตเห็นว่าอ่าว colwyn ไม่มีประเทศที่เกี่ยวข้อง
หากต้องการค้นหาสถานที่ทั้งหมดในประเทศที่คุณสามารถใช้ไวยากรณ์ต่อไปนี้:
grep land $ places
ผลลัพธ์ที่ได้จะเป็นทุกสถานที่ยกเว้น colwyn bay
สิ่งนี้เห็นได้ชัดว่าใช้ได้เฉพาะกับสถานที่ที่ลงท้ายด้วยที่ดิน (ไม่ค่อยวิทยาศาสตร์)
คุณสามารถกลับไปเลือกใช้ไวยากรณ์ต่อไปนี้:
grep -v ที่ดิน $ places
นี้จะหาสถานที่ทั้งหมดที่ไม่ได้จบลงด้วยที่ดิน
06 จาก 09
วิธีการค้นหาบรรทัดว่างในไฟล์โดยใช้ grep
ลองนึกภาพคุณมีไฟล์ข้อมูลที่ใช้โดยแอพพลิเคชั่นของบุคคลที่สามซึ่งจะหยุดอ่านไฟล์เมื่อพบบรรทัดว่างดังต่อไปนี้:
- aberdeen scotland
- inverness สก๊อตแลนด์
- liverpool england
- อ่าว Colwyn Bay
เมื่อแอพพลิเคชันไปที่บรรทัดหลังจากที่ liverpool มันจะหยุดอ่าน colwyn bay ความหมายจะพลาดอย่างสิ้นเชิง
คุณสามารถใช้ grep เพื่อค้นหาบรรทัดว่างด้วยไวยากรณ์ต่อไปนี้:
สถานที่ grep ^ $
แต่น่าเสียดายที่นี่ไม่ได้เป็นประโยชน์เพราะมันจะส่งกลับค่าว่างเปล่า
แน่นอนคุณสามารถนับจำนวนบรรทัดว่างเป็นเช็คเพื่อดูว่าไฟล์ถูกต้องหรือไม่ดังนี้
สถานที่ grep -c ^ $
อย่างไรก็ตามคุณควรทราบหมายเลขบรรทัดที่มีบรรทัดว่างเปล่าเพื่อให้คุณสามารถแทนที่ได้ คุณสามารถทำได้โดยใช้คำสั่งต่อไปนี้:
สถานที่ grep-n ^ $
07 จาก 09
วิธีการค้นหาสตริงของอักขระตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กโดยใช้ grep
ใช้ grep คุณสามารถกำหนดว่าบรรทัดใดในไฟล์มีอักขระตัวพิมพ์ใหญ่โดยใช้ไวยากรณ์ต่อไปนี้:
grep '[AZ]' ชื่อไฟล์
วงเล็บเหลี่ยม [] ช่วยให้คุณสามารถกำหนดช่วงของอักขระได้ ในตัวอย่างข้างต้นจะตรงกับตัวอักษรที่อยู่ระหว่าง A และ Z
ดังนั้นเพื่อให้ตรงกับตัวพิมพ์เล็กคุณสามารถใช้ไวยากรณ์ต่อไปนี้:
grep 'ชื่อไฟล์ [az]'
ถ้าคุณต้องการให้ตรงกับตัวอักษรเท่านั้นไม่ใช่ตัวเลขหรือสัญลักษณ์อื่น ๆ คุณสามารถใช้ไวยากรณ์ต่อไปนี้:
grep '[a-zA-Z]' ชื่อไฟล์
คุณสามารถทำเช่นเดียวกันกับตัวเลขดังนี้:
grep '[0-9]' ชื่อไฟล์
08 จาก 09
กำลังมองหารูปแบบการทำซ้ำโดยใช้ grep
คุณสามารถใช้วงเล็บปีกกา {} เพื่อค้นหารูปแบบการทำซ้ำ
ลองนึกภาพคุณมีไฟล์ที่มีหมายเลขโทรศัพท์ดังนี้:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x44-1234
คุณรู้ว่าส่วนแรกของตัวเลขต้องเป็นตัวเลขสามหลักและคุณต้องการหาเส้นที่ไม่ตรงกับรูปแบบนี้
จากตัวอย่างก่อนหน้านี้คุณรู้ว่า [0-9] จะส่งคืนตัวเลขทั้งหมดในไฟล์
ในกรณีนี้เราต้องการให้บรรทัดที่เริ่มต้นด้วยตัวเลขสามตัวตามด้วยยัติภังค์ (-) คุณสามารถดำเนินการดังกล่าวด้วยไวยากรณ์ต่อไปนี้:
grep "^ [0-9] [0-9] [0-9] -" ตัวเลข
ดังที่เราทราบจากตัวอย่างก่อนหน้ากะรัต (^) หมายความว่าบรรทัดต้องเริ่มต้นด้วยรูปแบบต่อไปนี้
[0-9] จะค้นหาหมายเลขใด ๆ ระหว่าง 0 ถึง 9 เนื่องจากเป็นการรวมสามครั้งที่ตรงกับ 3 หมายเลข ในที่สุดมียัติภังค์เพื่อแสดงว่ายัติภังค์ต้องประสบความสำเร็จสามหมายเลข
การใช้วงเล็บปีกกาช่วยให้การค้นหามีขนาดเล็กลงดังนี้
grep "^ [0-9] \ {3 \} -" ตัวเลข
เครื่องหมายสแลชจะหนีออกจาก {วงเล็บเพื่อให้ทำงานได้เป็นส่วนหนึ่งของนิพจน์ทั่วไป แต่ในสาระสำคัญว่านี่คืออะไร [0-9] {3} ซึ่งหมายถึงตัวเลขระหว่าง 0 ถึง 9 สามครั้ง
วงเล็บปีกกายังสามารถใช้เป็นดังนี้:
{5,10}
{5}
อักขระ {5,10} หมายความว่าตัวอักษรที่ถูกค้นหาต้องทำซ้ำอย่างน้อย 5 ครั้ง แต่ไม่เกิน 10 ในขณะที่ {5} หมายถึงต้องทำซ้ำตัวอักษรอย่างน้อย 5 ครั้ง แต่อาจมากกว่าอักขระนั้น
09 จาก 09
ใช้ผลลัพธ์จากคำสั่งอื่น ๆ โดยใช้ grep
จนถึงปัจจุบันเราได้ตรวจสอบรูปแบบการจับคู่ภายในไฟล์แต่ละไฟล์ แต่ grep สามารถใช้เอาต์พุตจากคำสั่งอื่น ๆ เป็น input สำหรับการจับคู่รูปแบบ
ตัวอย่างที่ดีของเรื่องนี้คือใช้คำสั่ง ps ที่แสดงกระบวนการที่ใช้งานอยู่
เช่นเรียกใช้คำสั่งต่อไปนี้:
ps -ef
กระบวนการทำงานทั้งหมดในระบบของคุณจะปรากฏขึ้น
คุณสามารถใช้ grep เพื่อค้นหากระบวนการทำงานที่เฉพาะเจาะจงดังต่อไปนี้
ps -ef | grep firefox