ค้นหาเว็บไซต์

วิธีใช้ Awk และนิพจน์ทั่วไปเพื่อกรองข้อความหรือสตริงในไฟล์


เมื่อเรารันคำสั่งบางอย่างใน Unix/Linux เพื่ออ่านหรือแก้ไขข้อความจากสตริงหรือไฟล์ โดยส่วนใหญ่แล้วเราจะพยายามกรองเอาต์พุตไปยังส่วนที่สนใจ นี่คือจุดที่การใช้นิพจน์ทั่วไปมีประโยชน์

อ่านเพิ่มเติม: 10 ตัวดำเนินการ Linux Chaining ที่มีประโยชน์พร้อมตัวอย่างที่ใช้งานได้จริง

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

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

คุณสมบัติของนิพจน์ทั่วไป

นิพจน์ทั่วไปประกอบด้วย:

  1. อักขระธรรมดา เช่น ช่องว่าง ขีดล่าง (_) A-Z a-z 0-9
  2. อักขระ Meta ที่ขยายเป็นอักขระธรรมดา ได้แก่:

    1. (.) จะจับคู่อักขระเดี่ยวใดๆ ยกเว้นขึ้นบรรทัดใหม่
    2. (*) มันจับคู่การมีอยู่ของอักขระที่อยู่ข้างหน้าเป็นศูนย์หรือมากกว่านั้น
    3. [ character(s) ] จะตรงกับอักขระตัวใดตัวหนึ่งที่ระบุในอักขระ นอกจากนี้ยังสามารถใช้เครื่องหมายยัติภังค์ (-) เพื่อหมายถึงช่วงของอักขระดังกล่าว เป็น [a-f], [1-5] และอื่นๆ
    4. ^ มันตรงกับจุดเริ่มต้นของบรรทัดในไฟล์
    5. $ ตรงกับส่วนท้ายของบรรทัดในไฟล์
    6. \ เป็นอักขระหลีก

ในการกรองข้อความ เราต้องใช้เครื่องมือกรองข้อความ เช่น 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:

  1. [0-9] หมายถึงตัวเลขตัวเดียว
  2. [a-z] หมายถึงจับคู่อักษรตัวพิมพ์เล็กตัวเดียว
  3. [A-Z] หมายถึงการจับคู่อักษรตัวพิมพ์ใหญ่ตัวเดียว
  4. [a-zA-Z] หมายถึงการจับคู่ตัวอักษรตัวเดียว
  5. [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 กัน ขอขอบคุณที่อ่านและหากต้องการข้อมูลเพิ่มเติมหรือคำชี้แจง โปรดแสดงความคิดเห็นในส่วนความเห็น