ตัวอย่างการใช้งานคำสั่ง Linux grep

คำสั่ง Linux grep ใช้เป็นวิธีการกรองอินพุต GREP ย่อมาจาก Global Regular Expression Printer ดังนั้นเพื่อให้ใช้งานได้อย่างมีประสิทธิภาพ คุณควรมีความรู้เกี่ยวกับนิพจน์ทั่วไป

ในบทความนี้ คุณจะได้เรียนรู้ตัวอย่างมากมายที่จะช่วยให้คุณเข้าใจคำสั่ง grep

วิธีค้นหาสตริงในไฟล์โดยใช้ GREP

ภาพหน้าจอคู่มือ Linux grep Command

ลองนึกภาพคุณมีไฟล์ข้อความชื่อหนังสือที่มีชื่อหนังสือสำหรับเด็กดังต่อไปนี้:

  • โรบินฮู้ด
  • หนูน้อยหมวกแดง
  • ปีเตอร์แพน
  • โกลดิล็อคส์กับหมีสามตัว
  • สโนไวท์กับคนแคระทั้งเจ็ด
  • พินโนคิโอ
  • แมวนั้นอยู่ในหมวก
  • ลูกหมูสามตัว
  • The Gruffalo
  • ชาลีและโรงงานช็อกโกแลต

ในการค้นหาหนังสือทั้งหมดที่มีคำว่า "The" ในชื่อ คุณจะต้องใช้ไวยากรณ์ต่อไปนี้:

grep หนังสือ. 

ผลลัพธ์ต่อไปนี้จะถูกส่งกลับ:

โกลดิล็อคส์กับหมีสามตัว
สโนไวท์กับคนแคระทั้งเจ็ด
แมวนั้นอยู่ในหมวก
ลูกหมูสามตัว
The Gruffalo
ชาลีและโรงงานช็อกโกแลต.

ในแต่ละกรณี คำว่า "The" จะถูกเน้น

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

หากต้องการละเว้นกรณีนี้ คุณสามารถเพิ่มสวิตช์ต่อไปนี้:

grep หนังสือ --ignore-case.js 

คุณยังสามารถใช้สวิตช์ -i ได้ดังนี้:

grep -i หนังสือ 

ค้นหาสตริงในไฟล์โดยใช้นิพจน์ทั่วไป

คำสั่ง grep นั้นทรงพลังมาก คุณสามารถใช้เทคนิคการจับคู่รูปแบบที่หลากหลายเพื่อกรองผลลัพธ์

ในตัวอย่างนี้ เราจะแสดงวิธีค้นหาสตริงในไฟล์โดยใช้สัญลักษณ์แทน

ลองนึกภาพว่าคุณมีไฟล์ชื่อ places ซึ่งมีชื่อสถานที่ในสกอตแลนด์ดังต่อไปนี้:

อเบอร์ดีน
aberystwyth
aberlour
inverurie
อินเวอร์เนส
newburgh
กวางใหม่
ใหม่ galloway
กลาสโกว์
เอดินเบอระ

หากคุณต้องการค้นหาสถานที่ทั้งหมดที่มีชื่อผกผันให้ใช้ไวยากรณ์ต่อไปนี้:

grep inver* สถานที่ 

อักขระดอกจัน (*) ไม่ทำงานเหมือนใน Bash ปกติ ในบริบทของ grep ซึ่งเกี่ยวข้องกับนิพจน์ทั่วไป เครื่องหมายดอกจันจะทำงานต่างกัน แทนที่จะจับคู่อักขระใดๆ หรือไม่มีเลย เช่น Bash มันจะจับคู่กับรูปแบบที่ป้อน บวกกับการซ้ำซ้อนของรูปแบบนั้นในภายหลัง

ในตัวอย่างข้างต้น จะตรงกับ:

inverurie
อินเวอร์เนส

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

ซ้ำ inverinverinver. 

ไปที่รายการ ไม่ มันไม่สมเหตุสมผลเลย แต่มันจะแสดงให้เห็นว่าเครื่องหมายดอกจันทำงานอย่างไร ลองรันคำสั่งอีกครั้ง

grep inver* สถานที่

คุณเห็นบรรทัดใหม่หรือไม่? นั่นใช้ไม่ได้ใน Bash แต่ใช้งานได้ที่นี่

หากต้องการทำสิ่งที่แปลกใหม่ ให้รันคำสั่งโดยไม่มีเครื่องหมายดอกจัน

grep inver สถานที่ 

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

ตัวแทนอื่นที่คุณสามารถใช้ได้คือจุด (.) คุณสามารถใช้สิ่งนี้เพื่อจับคู่ตัวอักษรตัวเดียว

สถานที่ grep inver.r 

คำสั่งข้างต้นจะค้นหาสถานที่ที่เรียกว่า inverurie และ inverary แต่จะไม่พบ invereerie เนื่องจากมีอักขระตัวแทนเพียงตัวเดียวระหว่างสอง r ตามที่แสดงโดยจุดเดียว

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

ตัวอย่างเช่น ดูรายชื่อโดเมนนี้

  • linux.lifewire.com
  • pcsupport.lifewire.com
  • mp3.lifewire.com
  • minecraft.lifewire.com
  • androidgames.lifewire.com
  • netforbeginners.lifewire.com
  • dailylinuxuser.com
  • google.co.uk
  • google.au
  • direct.gov.uk
  • fakesite.lifewire1com.com

หากต้องการค้นหา URL ของ lifewire.com ทั้งหมด คุณสามารถค้นหาโดยใช้ไวยากรณ์ต่อไปนี้:

grep .com ชื่อโดเมน 

คำสั่งดังกล่าวจะล้มลงหากรายการมีชื่อต่อไปนี้:

dailylinuxuser.com ทุกวัน 

ดังนั้น คุณสามารถลองใช้ไวยากรณ์ต่อไปนี้:

ชื่อโดเมน grep lifewire.com 

สิ่งนี้จะใช้ได้เว้นแต่จะมีโดเมนที่มีชื่อต่อไปนี้:

fakesite.lifewire1com.com. 

หากต้องการค้นหาคำว่า lifewire.com จริงๆ คุณจะต้องหลีกเลี่ยงจุดดังนี้:

grep lifewire\\.com ชื่อโดเมน 

สัญลักษณ์ตัวแทนสุดท้ายที่จะแสดงให้คุณเห็นคือเครื่องหมายคำถามซึ่งหมายถึงศูนย์หรืออักขระหนึ่งตัว

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

grep -E ?ber ชื่อสถานที่ 

คำสั่งดังกล่าวจะคืนค่า aberdeen, aberystwyth หรือแม้แต่ berwick หากอยู่ในรายการ สังเกตแฟล็ก '-E' พิเศษด้วย Grep จะไม่รู้จัก? อักขระโดยไม่ได้เปิดใช้งานการสนับสนุนนิพจน์ทั่วไปแบบขยาย

ค้นหาสตริงที่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัดโดยใช้ grep

สัญลักษณ์กะรัต (^) และดอลลาร์ ($) ช่วยให้คุณค้นหารูปแบบที่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัด

ลองนึกภาพคุณมีไฟล์ชื่อ football โดยมีชื่อทีมดังต่อไปนี้:

  • แบล็คพูล
  • ลิเวอร์พูล
  • เมืองแมนเชสเตอร์
  • เลสเตอร์ ซิตี้
  • แมนเชสเตอร์ยูไนเต็ด
  • นิวคาสเซิ่ล ยูไนเต็ด
  • เอฟซี ยูไนเต็ด ออฟ แมนเชสเตอร์

หากคุณต้องการค้นหาทีมทั้งหมดที่เริ่มต้นด้วยแมนเชสเตอร์ คุณจะใช้ไวยากรณ์ต่อไปนี้:

grep ^ทีมแมนเชสเตอร์ 

คำสั่งข้างต้นจะส่งกลับแมนเชสเตอร์ซิตี้และแมนเชสเตอร์ยูไนเต็ด แต่ไม่ใช่เอฟซียูไนเต็ดออฟแมนเชสเตอร์

หรือคุณสามารถค้นหาทีมทั้งหมดที่ลงท้ายด้วย United โดยใช้ไวยากรณ์ต่อไปนี้:

ทีม grep United$ 

คำสั่งดังกล่าวจะส่งกลับไปยังแมนเชสเตอร์ยูไนเต็ดและนิวคาสเซิลยูไนเต็ด แต่ไม่ใช่เอฟซียูไนเต็ดออฟแมนเชสเตอร์

การนับจำนวนการแข่งขันโดยใช้ grep

หากคุณไม่ต้องการส่งคืนบรรทัดจริงที่ตรงกับรูปแบบโดยใช้ grep แต่คุณแค่ต้องการทราบว่ามีกี่บรรทัดที่คุณสามารถใช้ไวยากรณ์ต่อไปนี้:

grep -c รูปแบบอินพุตไฟล์ 

หากรูปแบบถูกจับคู่สองครั้งก็จะส่งคืนหมายเลข 2

การค้นหาคำที่ไม่ตรงกันทั้งหมดโดยใช้ grep

ลองนึกภาพว่าคุณมีรายชื่อสถานที่ของประเทศต่างๆ ดังต่อไปนี้:

  • อเบอร์ดีนสกอตแลนด์
  • กลาสโกว์สกอตแลนด์
  • ลิเวอร์พูล อังกฤษ
  • โคลวินเบย์
  • ลอนดอน, อังกฤษ

คุณอาจสังเกตเห็นว่าอ่าวโคลวินไม่มีประเทศที่เกี่ยวข้อง

ในการค้นหาสถานที่ทั้งหมดที่มีประเทศ คุณสามารถใช้ไวยากรณ์ต่อไปนี้:

สถานที่ grep land$ 

ผลลัพธ์ที่ได้จะอยู่ที่ทุกแห่งยกเว้นอ่าวโคลวิน

เห็นได้ชัดว่าสิ่งนี้ใช้ได้กับสถานที่ที่สิ้นสุดในแผ่นดินเท่านั้น (แทบจะไม่เป็นวิทยาศาสตร์)

คุณสามารถกลับรายการที่เลือกได้โดยใช้ไวยากรณ์ต่อไปนี้:

grep -v ที่ดิน$ สถานที่ 

นี้จะพบทุกที่ที่ไม่ได้ลงเอยด้วยที่ดิน

วิธีค้นหาบรรทัดว่างในไฟล์โดยใช้ grep

ลองนึกภาพคุณมีไฟล์อินพุตซึ่งใช้โดยแอปพลิเคชันบุคคลที่สามซึ่งหยุดอ่านไฟล์เมื่อพบบรรทัดว่างดังนี้:

  • อเบอร์ดีนสกอตแลนด์
  • อินเวอร์เนสก็อตแลนด์
  • ลิเวอร์พูล ประเทศอังกฤษ
  • โคลวิน เบย์ เวลส์

เมื่อใบสมัครถึงเส้นหลังลิเวอร์พูลจะหยุดอ่านหมายความว่าจะพลาดอ่าว colwyn ทั้งหมด

คุณสามารถใช้ grep เพื่อค้นหาบรรทัดว่างด้วยไวยากรณ์ต่อไปนี้:

grep ^$ สถานที่ 

สิ่งนี้ไม่มีประโยชน์อย่างยิ่งเพราะจะส่งคืนบรรทัดว่าง

แน่นอน คุณสามารถนับจำนวนบรรทัดว่างเพื่อตรวจสอบเพื่อดูว่าไฟล์นั้นถูกต้องหรือไม่ ดังนี้:

grep -c ^$ ตำแหน่ง 

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

grep -n ^$ สถานที่ 

วิธีค้นหาสตริงของอักขระตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กโดยใช้ grep

การใช้ grep คุณสามารถกำหนดได้ว่าบรรทัดใดในไฟล์ที่มีอักขระตัวพิมพ์ใหญ่โดยใช้ไวยากรณ์ต่อไปนี้:

ชื่อไฟล์ grep '[A-Z]' 

วงเล็บเหลี่ยม [] ให้คุณกำหนดช่วงของอักขระได้ ในตัวอย่างข้างต้น จะจับคู่อักขระใดๆ ที่อยู่ระหว่าง A และ Z

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

grep '[a-z]' ชื่อไฟล์ 

หากคุณต้องการจับคู่เฉพาะตัวอักษร ไม่ใช่ตัวเลขหรือสัญลักษณ์อื่นๆ คุณสามารถใช้ไวยากรณ์ต่อไปนี้:

grep '[a-zA-Z]' ชื่อไฟล์ 

คุณสามารถทำเช่นเดียวกันกับตัวเลขดังต่อไปนี้:

grep '[0-9]' ชื่อไฟล์ 

ค้นหารูปแบบการทำซ้ำโดยใช้ 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 ครั้ง แต่สามารถมากกว่า นั่น.

การใช้เอาต์พุตจากคำสั่งอื่นโดยใช้ grep

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

ตัวอย่างที่ดีของสิ่งนี้คือการใช้คำสั่ง ps ซึ่งแสดงรายการกระบวนการที่ทำงานอยู่

ตัวอย่างเช่น รันคำสั่งต่อไปนี้:

ป.ล. -ef 

กระบวนการทำงานทั้งหมดบนระบบของคุณจะปรากฏขึ้น

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

ps -ef | grep firefox. 

สรุป

คำสั่ง grep เป็นคำสั่งพื้นฐาน ลินุกซ์ คำสั่งและเป็นสิ่งที่ควรค่าแก่การเรียนรู้เพราะจะทำให้ชีวิตของคุณง่ายขึ้นมากเมื่อค้นหาไฟล์และประมวลผลเมื่อใช้เทอร์มินัล