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

ลองนึกภาพคุณมีไฟล์ข้อความชื่อหนังสือที่มีชื่อหนังสือสำหรับเด็กดังต่อไปนี้:
- โรบินฮู้ด
- หนูน้อยหมวกแดง
- ปีเตอร์แพน
- โกลดิล็อคส์กับหมีสามตัว
- สโนไวท์กับคนแคระทั้งเจ็ด
- พินโนคิโอ
- แมวนั้นอยู่ในหมวก
- ลูกหมูสามตัว
- 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 เป็นคำสั่งพื้นฐาน ลินุกซ์ คำสั่งและเป็นสิ่งที่ควรค่าแก่การเรียนรู้เพราะจะทำให้ชีวิตของคุณง่ายขึ้นมากเมื่อค้นหาไฟล์และประมวลผลเมื่อใช้เทอร์มินัล