บทช่วยสอนนิพจน์ทั่วไปของ Linux: ตัวอย่าง Grep Regex

⚡ สรุปอย่างชาญฉลาด

นิพจน์ปกติ (Regular Expression) ใน Linux คือลำดับอักขระพิเศษที่ใช้ค้นหาข้อมูลและจับคู่รูปแบบที่ซับซ้อนในเครื่องมือต่างๆ เช่น grep, sed และ vi โดยใช้รูปแบบพื้นฐาน ช่วงเวลา ขยาย และการขยายวงเล็บปีกกา เพื่อกรองข้อความได้อย่างแม่นยำ

  • 🔎 มันคืออะไร: นิพจน์ปกติ (Regular expressions) หรือเรียกย่อว่า regexp หรือ regex ใช้สำหรับอธิบายรูปแบบข้อความเพื่อใช้ในการค้นหาและจับคู่
  • 🧩 ชุดพื้นฐาน: สัญลักษณ์ต่างๆ เช่น . ^ $ * และ \ ใช้สำหรับกำหนดตำแหน่ง ทำซ้ำ และหลีกเลี่ยงอักขระในรูปแบบ
  • 🔢 ช่วงเวลา: วงเล็บปีกกา เช่น {n} และ {n,m} ใช้ควบคุมจำนวนครั้งที่อักขระที่อยู่ข้างหน้าจะซ้ำกัน
  • ขยาย: ด้วยคำสั่ง grep -E เครื่องหมาย \+ และ \? จะตรงกับอักขระที่ปรากฏหนึ่งครั้งขึ้นไป และศูนย์ครั้งหรือหนึ่งครั้งก็ได้
  • 🧵 การขยายอุปกรณ์พยุง: วงเล็บปีกกาใช้สร้างสตริงหลายรายการจากลำดับหรือรายการที่คั่นด้วยเครื่องหมายจุลภาค
  • 🛠️ ใช้ในสถานที่ใดบ้าง: เครื่องมือต่างๆ เช่น grep, sed, tr และ vi อาศัยนิพจน์ปกติ (regular expressions) ในการกรองข้อความ
  • 🤖 ความช่วยเหลือจาก AI: ผู้ช่วย AI และ GitHub Copilot สามารถสร้าง อธิบาย และแก้ไขข้อผิดพลาดของรูปแบบ regex ได้อย่างรวดเร็ว

นิพยามปกติ (Regular Expression) ใน Linux กับ grep — ตัวอย่างนิพยามปกติพื้นฐาน นิพยามปกติแบบช่วง และนิพยามปกติแบบขยาย

นิพจน์ปกติ (Regular expressions) เป็นหนึ่งในคุณสมบัติที่ทรงพลังที่สุดของ ลินุกซ์ เครื่องมือข้อความที่ช่วยให้คุณจับคู่ กรอง และแปลงข้อมูลด้วยรูปแบบที่กระชับ หน้านี้อธิบายรูปแบบพื้นฐาน รูปแบบช่วง และรูปแบบขยาย รวมถึงการขยายวงเล็บปีกกา พร้อมตัวอย่างการใช้งาน grep

นิพจน์ทั่วไปของ Linux คืออะไร

นิพยามปกติ (Regular Expression) ใน Linux คืออักขระพิเศษที่ช่วยในการค้นหาข้อมูลและจับคู่รูปแบบที่ซับซ้อน นิพยามปกติมักย่อว่า 'regexp' หรือ 'regex' มีการใช้งานในโปรแกรม Linux หลายโปรแกรม เช่น... grepรวมถึงคำสั่ง bash, rename, sed และอื่นๆ อีกมากมาย

ประเภทของนิพจน์ทั่วไป

เพื่อให้เข้าใจง่ายขึ้น เรามาเรียนรู้ประเภทต่างๆ ของนิพจน์ปกติทีละประเภทกัน หน้านี้จะกล่าวถึงนิพจน์ปกติพื้นฐาน นิพจน์ปกติแบบช่วง และนิพจน์ปกติแบบขยาย และปิดท้ายด้วยการขยายวงเล็บปีกกา

นิพจน์ทั่วไปพื้นฐาน

คำสั่งที่ใช้กันทั่วไปบางส่วนที่ทำงานร่วมกับนิพจน์ปกติ ได้แก่ tr, sed, viและ grep ตารางด้านล่างแสดงรายการนิพจน์ปกติพื้นฐานบางส่วน

สัญลักษณ์ Descriptไอออน
. แทนที่อักขระใดๆ
^ ตรงกับจุดเริ่มต้นของสตริง
$ ตรงกับส่วนท้ายของสตริง
* ตรงกับอักขระก่อนหน้าศูนย์ครั้งขึ้นไป
\ แทนอักขระพิเศษ
() จัดกลุ่มนิพจน์ทั่วไป
? ตรงกับอักขระหนึ่งตัวพอดี

มาดูตัวอย่างกัน ขั้นแรก รันคำสั่ง `cat sample` เพื่อแสดงเนื้อหาของไฟล์ที่มีอยู่ ดังที่แสดงด้านล่าง

ตัวอย่างคำสั่ง `cat` ที่แสดงเนื้อหาของไฟล์ที่มีอยู่แล้วในเทอร์มินัล

ถัดไป ให้ค้นหาเนื้อหาที่มีตัวอักษร 'a' ภาพหน้าจอด้านล่างแสดงให้เห็นว่า grep ค้นหาทุกบรรทัดที่มีตัวอักษร 'a'

ใช้คำสั่ง grep ค้นหาบรรทัดที่มีตัวอักษร a ในไฟล์ตัวอย่าง

เครื่องหมาย ^ ใช้สำหรับจับคู่กับจุดเริ่มต้นของสตริง ตัวอย่างด้านล่างนี้เป็นการค้นหาเนื้อหาที่ขึ้นต้นด้วยตัวอักษร 'a'

grep ที่มีเครื่องหมาย caret เป็นตัวช่วยในการจับคู่เฉพาะบรรทัดที่ขึ้นต้นด้วยตัวอักษร a

เฉพาะบรรทัดที่ขึ้นต้นด้วยอักขระดังกล่าวเท่านั้นที่จะถูกกรอง บรรทัดที่ไม่มีอักขระ 'a' อยู่ที่จุดเริ่มต้นจะถูกละเว้น

ลองดูตัวอย่างอื่นกันอีกครั้ง ภาพหน้าจอด้านล่างแสดงเนื้อหาไฟล์ตัวอย่างก่อนที่จะกรองโดยใช้การสิ้นสุดของบรรทัด

ตัวอย่างเนื้อหาไฟล์ที่แสดงก่อนการกรองบรรทัดที่ลงท้ายด้วยตัวอักษร t

เลือกเฉพาะบรรทัดที่ลงท้ายด้วยตัวอักษร 't' โดยใช้เครื่องหมาย '$' ดังแสดงด้านล่าง

ใช้คำสั่ง grep ที่มีเครื่องหมายดอลลาร์เป็นตัวกำหนดจุดยึด เพื่อเลือกเฉพาะบรรทัดที่ลงท้ายด้วยตัวอักษร t

นิพจน์ทั่วไปแบบช่วงเวลา

นิพจน์เหล่านี้ระบุจำนวนครั้งที่อักขระนั้นปรากฏในสตริง โดยมีรายการดังต่อไปนี้

การแสดงออก Descriptไอออน
{NS} จับคู่อักขระก่อนหน้าที่ปรากฏ 'n' เท่าทุกประการ
{น,ม} จับคู่อักขระก่อนหน้าที่ปรากฏ 'n' ครั้ง แต่ไม่เกิน m
{น, } จับคู่อักขระนำหน้าเฉพาะเมื่อปรากฏ 'n' ครั้งขึ้นไป

ตัวอย่างเช่น กรองบรรทัดทั้งหมดที่มีอักขระ 'p' ภาพหน้าจอด้านล่างแสดงบรรทัดที่ตรงกัน

ใช้คำสั่ง grep เพื่อกรองไฟล์ตัวอย่างหาบรรทัดที่มีอักขระ p

ทีนี้ลองตรวจสอบดูว่าตัวอักษร 'p' ปรากฏอยู่ในสตริงสองครั้งติดกันหรือไม่ โดยใช้ไวยากรณ์ดังนี้:

cat sample | grep -E p\{2}

ผลการแข่งขันแบบช่วงเวลาแสดงอยู่ด้านล่าง

grep -E แสดงนิพจน์ช่วงที่ตรงกับอักขระ p ที่ปรากฏสองครั้งพอดี

หมายเหตุ: คุณต้องเพิ่ม -E ด้วยนิพจน์ทั่วไปเหล่านี้

ขยายนิพจน์ทั่วไป

นิพจน์ปกติเหล่านี้เป็นการรวมนิพจน์มากกว่าหนึ่งนิพจน์เข้าด้วยกัน ตัวอย่างเช่น:

การแสดงออก Descriptไอออน
\+ จับคู่อักขระก่อนหน้าอย่างน้อยหนึ่งรายการ
\? จับคู่อักขระก่อนหน้าเป็นศูนย์หรือหนึ่งรายการ

ตัวอย่างเช่น ค้นหาตัวอักษร 't' ทั้งหมด ภาพหน้าจอด้านล่างแสดงผลลัพธ์

ใช้คำสั่ง grep ค้นหาในไฟล์ตัวอย่างเพื่อหาบรรทัดทั้งหมดที่มีอักขระ t

สมมติว่าคุณต้องการกรองบรรทัดที่ตัวอักษร 'a' อยู่หน้าตัวอักษร 't' คุณสามารถใช้คำสั่งดังต่อไปนี้:

cat sample|grep "a\+t"

ผลลัพธ์แสดงอยู่ในภาพหน้าจอต่อไปนี้

grep นิพจน์ขยายที่ตรงกับอักขระ a หนึ่งตัวขึ้นไปตามด้วย t

การขยายตัวของรั้ง

รูปแบบไวยากรณ์สำหรับการขยายวงเล็บปีกกาคือลำดับหรือรายการที่คั่นด้วยเครื่องหมายจุลภาคภายในวงเล็บปีกกา '{}' โดยรายการเริ่มต้นและรายการสุดท้ายในลำดับจะคั่นด้วยจุดสองจุด '..'

ตัวอย่างบางส่วนแสดงไว้ด้านล่าง

คำสั่ง echo ที่ใช้การขยายวงเล็บปีกกาเพื่อสร้างสตริงหลายรายการจากลำดับและรายการ

ในตัวอย่างข้างต้น คำสั่ง echo สร้างสตริงโดยใช้การขยายวงเล็บปีกกา ทำให้ได้สตริงหลายสตริงจากรูปแบบเดียว

คำถามที่พบบ่อย

โดยค่าเริ่มต้น grep จะใช้ regular expression พื้นฐาน egrep อนุญาตให้ใช้ regular expression แบบขยาย (เหมือนกับ grep -E) และ fgrep จะจับคู่สตริงคงที่ที่ไม่มี regular expression (grep -F) GNU grep รุ่นใหม่ระบุว่า egrep และ fgrep นั้นล้าสมัยแล้ว ดังนั้นควรใช้ grep -E และ grep -F แทน

คลาสของอักขระจะจับคู่กับหมวดหมู่ของอักขระ นิพจน์วงเล็บ เช่น [az] จะจับคู่กับช่วง ในขณะที่คลาส POSIX เช่น [[:alpha:]], [[:digit:]] และ [[:space:]] จะจับคู่กับตัวอักษร ตัวเลข และช่องว่าง คลาสเหล่านี้ช่วยให้รูปแบบอ่านง่ายและใช้งานได้ในภาษาต่างๆ

เพิ่มตัวเลือก -i เช่น grep -i “hello” sample ซึ่งจะตรงกับ Hello, HELLO และ hello เหมือนกัน หากไม่มีตัวเลือก -i นิพจน์ปกติจะคำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ดังนั้นตัวอักษรพิมพ์ใหญ่และตัวอักษรพิมพ์เล็กจะถูกมองว่าเป็นอักขระที่แตกต่างกันสองตัว

สัญลักษณ์ตัวแทน (globbing) ในเชลล์ใช้สำหรับขยายชื่อไฟล์ โดยที่ * หมายถึงอักขระใดๆ และ ? หมายถึงอักขระหนึ่งตัว ส่วนนิพจน์ปกติ (Regular expression) ใช้สำหรับจับคู่ข้อความภายในไฟล์ โดยที่ * หมายถึงอักขระที่อยู่ข้างหน้าตั้งแต่ศูนย์ตัวขึ้นไป สัญลักษณ์เดียวกันอาจมีความหมายต่างกันในแต่ละบริบท

ใช้ตัวเลือก -o เช่น grep -o “a\+t” sample แทนที่จะพิมพ์ทั้งบรรทัด grep จะพิมพ์เฉพาะส่วนที่ตรงกับรูปแบบเท่านั้น โดยจะพิมพ์หนึ่งรายการที่ตรงกันต่อหนึ่งบรรทัด มีประโยชน์สำหรับตัวอย่างเช่นtracค่าต่างๆ เช่น อีเมลหรือหมายเลขโทรศัพท์

ใช้การสลับคำสั่งด้วยสัญลักษณ์ไปป์ ในโหมดขยาย คำสั่ง grep -E “cat|dog” sample จะค้นหาบรรทัดที่มีคำว่า cat หรือ dog ในโหมดพื้นฐาน คุณต้องใช้เครื่องหมายหลีกเลี่ยงเป็น grep “cat\|dog” sample การสลับคำสั่งช่วยให้คำสั่งเดียวค้นหารูปแบบหลายรูปแบบพร้อมกันได้

ผู้ช่วย AI สามารถแปลงคำอธิบายภาษาอังกฤษธรรมดาให้เป็นนิพจน์ปกติ (regex) ที่ใช้งานได้ อธิบายว่ารูปแบบที่ซับซ้อนทำอะไร และแนะนำวิธีแก้ไขเมื่อการจับคู่ล้มเหลว เครื่องมือการเรียนรู้ของเครื่องยังสามารถตรวจจับรูปแบบที่เกิดขึ้นซ้ำๆ ในไฟล์บันทึกขนาดใหญ่ซึ่งการเขียนด้วยมือจะเป็นเรื่องยุ่งยาก

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

สรุปโพสต์นี้ด้วย: