วิธีใช้ Awk และนิพจน์ทั่วไปเพื่อกรองข้อความหรือสตริงในไฟล์
เมื่อเรารันคำสั่งบางอย่างใน Unix/Linux เพื่ออ่านหรือแก้ไขข้อความจากสตริงหรือไฟล์ โดยส่วนใหญ่แล้วเราจะพยายามกรองเอาต์พุตไปยังส่วนที่สนใจ นี่คือจุดที่การใช้นิพจน์ทั่วไปมีประโยชน์
อ่านเพิ่มเติม: 10 ตัวดำเนินการ Linux Chaining ที่มีประโยชน์พร้อมตัวอย่างที่ใช้งานได้จริง
นิพจน์ทั่วไปคืออะไร?
นิพจน์ทั่วไปสามารถกำหนดเป็นสตริงที่แสดงถึงลำดับอักขระหลายตัว สิ่งที่สำคัญที่สุดอย่างหนึ่งเกี่ยวกับนิพจน์ทั่วไปคือช่วยให้คุณสามารถกรองเอาต์พุตของคำสั่งหรือไฟล์ แก้ไขส่วนของข้อความหรือไฟล์การกำหนดค่า และอื่นๆ ได้
คุณสมบัติของนิพจน์ทั่วไป
นิพจน์ทั่วไปประกอบด้วย:
- อักขระธรรมดา เช่น ช่องว่าง ขีดล่าง (_) A-Z a-z 0-9
อักขระ Meta ที่ขยายเป็นอักขระธรรมดา ได้แก่:
(.)
จะจับคู่อักขระเดี่ยวใดๆ ยกเว้นขึ้นบรรทัดใหม่
(*)
มันจับคู่การมีอยู่ของอักขระที่อยู่ข้างหน้าเป็นศูนย์หรือมากกว่านั้น[ character(s) ]
จะตรงกับอักขระตัวใดตัวหนึ่งที่ระบุในอักขระ นอกจากนี้ยังสามารถใช้เครื่องหมายยัติภังค์(-)
เพื่อหมายถึงช่วงของอักขระดังกล่าว เป็น[a-f]
,[1-5]
และอื่นๆ^
มันตรงกับจุดเริ่มต้นของบรรทัดในไฟล์$
ตรงกับส่วนท้ายของบรรทัดในไฟล์\
เป็นอักขระหลีก
ในการกรองข้อความ เราต้องใช้เครื่องมือกรองข้อความ เช่น awk คุณสามารถนึกถึง awk เป็นภาษาโปรแกรมของมันเองได้ แต่สำหรับขอบเขตของคู่มือการใช้ awk เราจะกล่าวถึงในฐานะเครื่องมือกรองบรรทัดคำสั่งง่ายๆ
ไวยากรณ์ทั่วไปของ awk คือ:
awk 'script' filename
โดยที่ 'script'
คือชุดคำสั่งที่ awk เข้าใจและดำเนินการกับไฟล์ ชื่อไฟล์
มันทำงานโดยการอ่านบรรทัดที่กำหนดในไฟล์ ทำสำเนาของบรรทัด จากนั้นจึงรันสคริปต์บนบรรทัด ทำซ้ำในทุกบรรทัดในไฟล์
'script'
อยู่ในรูปแบบ '/pattern/ action'
โดยที่ รูปแบบ เป็นนิพจน์ทั่วไปและ การกระทำ คือสิ่งที่ awk จะทำเมื่อพบรูปแบบที่กำหนดในบรรทัด
วิธีใช้เครื่องมือกรอง Awk ใน Linux
ในตัวอย่างต่อไปนี้ เราจะมุ่งเน้นไปที่อักขระเมตาที่เรากล่าวถึงข้างต้นภายใต้คุณสมบัติของ awk
ตัวอย่างง่ายๆ ของการใช้ awk:
ตัวอย่างด้านล่างจะพิมพ์ทุกบรรทัดในไฟล์ /etc/hosts เนื่องจากไม่มีการกำหนดรูปแบบ
awk '//{print}'/etc/hosts
ใช้ Awk กับรูปแบบ:
ในตัวอย่างด้านล่าง มีการกำหนดรูปแบบ localhost
ดังนั้น awk จะจับคู่บรรทัดที่มี localhost ในไฟล์ /etc/hosts
awk '/localhost/{print}' /etc/hosts
การใช้ Awk กับ (.) ไวด์การ์ดในรูปแบบ
(.)
จะจับคู่สตริงที่มี loc, localhost, localnet ในตัวอย่างด้านล่าง
กล่าวคือ * l some_single_Character c *
awk '/l.c/{print}' /etc/hosts
การใช้ Awk กับ (*) อักขระในรูปแบบ
มันจะจับคู่สตริงที่มี localhost, localnet, เส้น, ความสามารถ ดังตัวอย่างด้านล่าง:
awk '/l*c/{print}' /etc/localhost
คุณจะรู้ด้วยว่า (*)
พยายามให้คุณจับคู่ที่ยาวที่สุดเท่าที่จะตรวจพบได้
ลองดูกรณีที่แสดงให้เห็นนี้ ให้ใช้นิพจน์ทั่วไป t*t
ซึ่งหมายถึงการจับคู่สตริงที่ขึ้นต้นด้วยตัวอักษร t
และลงท้ายด้วย t
ในบรรทัดด้านล่าง:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
คุณจะได้รับความเป็นไปได้ดังต่อไปนี้เมื่อคุณใช้รูปแบบ /t*t/
:
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
และ (*)
ใน /t*t/
อักขระไวด์การ์ดอนุญาตให้ awk เลือกตัวเลือกสุดท้าย:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
การใช้ Awk กับชุด [ ตัวละคร ]
ยกตัวอย่างชุด [al1]
โดยในที่นี้ awk จะจับคู่สตริงทั้งหมดที่มีอักขระ a
หรือ l
หรือ 1
ในบรรทัดในไฟล์ /etc/hosts
awk '/[al1]/{print}' /etc/hosts
ตัวอย่างถัดไปจะจับคู่สตริงที่ขึ้นต้นด้วย K
หรือ k
ตามด้วย T
:
awk '/[Kk]T/{print}' /etc/hosts
การระบุอักขระในช่วง
ทำความเข้าใจกับตัวละครด้วย awk:
[0-9]
หมายถึงตัวเลขตัวเดียว[a-z]
หมายถึงจับคู่อักษรตัวพิมพ์เล็กตัวเดียว[A-Z]
หมายถึงการจับคู่อักษรตัวพิมพ์ใหญ่ตัวเดียว[a-zA-Z]
หมายถึงการจับคู่ตัวอักษรตัวเดียว[a-zA-Z 0-9]
หมายถึงจับคู่ตัวอักษรหรือตัวเลขตัวเดียว
ลองดูตัวอย่างด้านล่าง:
awk '/[0-9]/{print}' /etc/hosts
บรรทัดทั้งหมดจากไฟล์ /etc/hosts มีตัวเลขอย่างน้อยเพียงตัวเดียว [0-9]
ในตัวอย่างข้างต้น
ใช้ Awk กับ (^) อักขระ Meta
โดยจะจับคู่ทุกบรรทัดที่ขึ้นต้นด้วยรูปแบบที่ให้ไว้ตามตัวอย่างด้านล่าง:
awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts
ใช้ Awk กับอักขระ Meta ($)
โดยจะจับคู่ทุกบรรทัดที่ลงท้ายด้วยรูปแบบที่ให้ไว้:
awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
ใช้ Awk กับ (\) Escape Character
ช่วยให้คุณสามารถใช้อักขระที่ตามมาเป็นตัวอักษรซึ่งก็คือการพิจารณาตามที่เป็นอยู่
ในตัวอย่างด้านล่าง คำสั่งแรกพิมพ์ทุกบรรทัดในไฟล์ คำสั่งที่สองไม่พิมพ์อะไรเลยเพราะฉันต้องการจับคู่บรรทัดที่มี $25.00 แต่ไม่มีการใช้อักขระหลีก
คำสั่งที่สามถูกต้องเนื่องจากมีการใช้อักขระ Escape เพื่ออ่าน $ เหมือนเดิม
awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
สรุป
นั่นไม่ใช่ทั้งหมดด้วยเครื่องมือกรองบรรทัดคำสั่ง awk ซึ่งเป็นตัวอย่างที่อยู่เหนือการดำเนินการพื้นฐานของ awk ในส่วนต่อไป เราจะมาพูดถึงวิธีใช้ฟีเจอร์ที่ซับซ้อนของ awk กัน ขอขอบคุณที่อ่านและหากต้องการข้อมูลเพิ่มเติมหรือคำชี้แจง โปรดแสดงความคิดเห็นในส่วนความเห็น