คู่มือนี้แสดงวิธีใช้คำสั่ง awk ใน Linux พร้อมตัวอย่างที่มีประโยชน์สำหรับทุกวัน
AWK เป็นเครื่องมือและภาษาสำหรับค้นหาและจัดการข้อความ มีให้ Linux Operating System
คำสั่ง awk และภาษาสคริปต์ที่เกี่ยวข้อง ค้นหาไฟล์สำหรับข้อความที่กำหนดโดย pattern และดำเนินการ action เฉพาะกับข้อความที่ตรงกับ pattern
awk เป็นเครื่องมือที่มีประโยชน์สำหรับดึงข้อมูลและสร้างรายงานจากไฟล์ข้อความขนาดใหญ่ หรือไฟล์ข้อความจำนวนมาก – เช่น ประมวลผล logs หรือ output จากอุปกรณ์บันทึกข้อมูลเช่น temperature probes ที่เก็บข้อมูลมานาน มันยังใช้ได้กับ output จาก database queries
ไม่ต้องติดตั้ง awk; มันควรมีอยู่ใน Linux System ของคุณแล้ว
awk Syntax
ไวยากรณ์สำหรับใช้คำสั่ง awk ในเทอร์มินัล มีดังนี้:
awk [PROGRAM] [INPUT FILES]
โปรดทราบว่า:
- [PROGRAM] คือ search pattern และ actions ที่จะทำ – คือโปรแกรมที่คุณต้องการให้ awk รันบนไฟล์ที่ให้
- สามารถส่งเป็นไฟล์ข้อความแทน inline ได้โดยใช้ตัวเลือก -f
- [INPUT FILES] คือไฟล์ที่คุณต้องการให้ awk ทำงาน – อาจเป็นหลายไฟล์คั่นด้วยช่องว่าง หรือ path ไปยังไดเรกทอรี หรือ pattern ของไฟล์ที่ต้องการจับคู่
- หากไม่ระบุ input files awk จะทำงานกับ piped output จากคำสั่งอื่น
awk Options
ตัวเลือกต่อไปนี้สามารถส่งให้คำสั่ง awk ได้:
| -f program-file | Program text อ่านจากไฟล์แทน command-line สามารถใช้ -f หลายตัวได้ |
| -F value | ตั้งค่า field separator FS เป็น value |
| -v var=value | กำหนด value ให้ program variable var |
สำหรับตัวเลือกเฉพาะ implementation ของ awk เวอร์ชันของคุณ สามารถดู manual ได้โดยรัน:
man awk
Program Actions & Variables
โปรแกรมที่คุณส่งให้ awk จะกำหนดว่ามันจะทำอะไรกับไฟล์ข้อความที่คุณส่ง โปรแกรม awk มีรูปแบบดังนี้:
CONDITION { ACTION } CONDITION { ACTION } ...
โดย CONDITION คือ pattern ข้อความที่จะจับคู่ และ ACTION คือการกระทำกับข้อความที่ตรง คุณสามารถมี conditions และ actions ได้เท่าไหร่ก็ได้
Actions
Actions ที่ส่งเป็นคำสั่งที่รวม calculation, variables และการเรียกฟังก์ชัน ฟังก์ชัน built-in บางตัวขึ้นอยู่กับ implementation ดีกว่า check manual สำหรับตัวเหล่านี้
Records
awk โดยทั่วไปถือว่าแต่ละบรรทัดใหม่ในไฟล์ข้อความเป็น record เว้นแต่จะระบุอื่นไปผ่าน OPTIONS
Fields
awk ใช้ whitespace (spaces, tabs) แสดง fields ใน record เว้นแต่จะระบุอื่นไปผ่าน OPTIONS
Variables
awk มี built-in variables มากมาย ที่คุณใช้ได้โดยไม่ต้อง define เอง ครอบคลุมสถานการณ์ทั่วไป:
| Variable | ความหมาย |
|---|---|
| $0 | แทน record ทั้งหมด |
| $1, $2, $3 … | Field variables – เก็บข้อความ/ค่าสำหรับ text fields แต่ละตัวใน record |
| NR / Number of Records | จำนวน input records ที่อ่านไปแล้วจากทุกไฟล์ |
| FNR / File Number of Records | จำนวน input records ที่อ่านไปแล้วในไฟล์ปัจจุบัน – reset เป็นศูนย์อัตโนมัติทุกครั้งที่เริ่มไฟล์ใหม่ |
| NF / Number of Fields | จำนวน fields ใน current input record – field สุดท้ายอ้างอิงได้ด้วย $NF, field ตัวก่อนสุด $(NF-1) ฯลฯ |
| FILENAME | ชื่อไฟล์ input ปัจจุบัน |
| FS / Field Separator | ตัวอักษรที่แยก fields ใน record default รวม space และ tab |
| RS / Record Separator | ตัวอักษรที่แยก records ในไฟล์ default new line |
| OFS / Output Field Separator | ตัวอักษรแยก fields ใน Awk output default single space |
| ORS / Output Record Separator | ตัวอักษรแยก records ใน Awk output default new line |
| OFMT / Output ForMaT | Format สำหรับ numeric output default “%.6g” |
ตัวอย่างการใช้งาน awk
สำหรับตัวอย่างเหล่านี้ เราจะทำงานบนไฟล์ข้อความเดี่ยวชื่อ flowers.txt ซึ่งมีข้อความดังนี้:
red rose yellow daffodil pink flamingo white rose blue iris white lily red peony yellow orchid purple foxglove
พิมพ์เนื้อหาไฟล์
คำสั่ง awk ต่อไปจะ output เนื้อหาไฟล์ไปที่เทอร์มินัลด้วยฟังก์ชัน print ของ awk:
awk '{print}' flowers.txt
พิมพ์จำนวน Records (บรรทัด) ในไฟล์
awk 'END { print NR }' sample.txt
ตัวอย่างนี้จะ output จำนวนบรรทัดในไฟล์:
9
ค้นหาข้อความในไฟล์ด้วย Regular Expressions
คำสั่งต่อไปจะ output บรรทัดในไฟล์ที่อธิบายเฉพาะประเภท rose:
awk '/rose/' flowers.txt
หมายเหตุ REGEX (Regular Expressions) syntax ใช้กำหนดข้อความที่ค้นหา
คำสั่งนี้จะ output:
red rose white rose
Regex เพิ่มเติม
awk '/^p/' flowers.txt
คำสั่งนี้จะ output เฉพาะ records เริ่มต้นด้วย p:
pink flamingo purple foxglove
การใช้ Field Variables
ด้วย field Variables คุณสามารถ output เฉพาะ field แรกสำหรับ records เริ่มต้นด้วย p:
awk '/^p/ {print $1;}' flowers.txt
ซึ่งจะ output:
pink purple
ประมวลผล Output จากโปรแกรมอื่น
คุณสามารถ pipe output จากโปรแกรม Linux shell อื่นๆ เข้า awk เพื่อประมวลผล ตัวอย่างนี้รับ output จาก ls -l ซึ่ง list เนื้อหา current directory และคืนค่า field 5th (ขนาดไฟล์):
ls -l | awk '{print $5}'
ซึ่งจะ output ประมาณ:
3104 3072 224 256
…(ขึ้นอยู่กับจำนวนไฟล์ใน current directory และขนาด)
ใช้ Built-In Variables
awk '{print NR "-" $2 }' flowers.txt
คำสั่งนี้จะพิมพ์ current record number (หมายเลขบรรทัดไฟล์) ตามด้วย field ที่สอง – ชื่อดอกไม้:
1-red rose 2-yellow daffodil 3-pink flamingo 4-white rose 5-blue iris 6-white lily 7-red peony 8-yellow orchid 9-purple foxglove
รวม Actions
Conditions และ actions สามารถรวมกันด้วย && คำสั่งนี้จะพิมพ์ records ทั้งหมดที่ field แรกมีข้อความ red และ field ที่สองมี น้อยกว่า 5 ตัวอักษร:
awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt
หมายเหตุ:
- ใช้ $NF เพื่อเข้าถึง field ที่สองเป็นทางเลือกแทน $2 – ได้เพราะมันคือ field สุดท้าย จึงเท่ากับ NF (Number of Fields)
- ฟังก์ชัน length() ใช้คำนวณความยาวของ field
ดังนั้นคืนค่า record เดียวที่ตรงจากไฟล์ตัวอย่าง:
red rose
สรุป
awk ถูกรวมอยู่ใน Linux แทบทุกตัวเพราะเหตุผล – มันเป็น staple tool สำหรับค้นหาและประมวลผลข้อความ ซึ่งคุณสามารถใช้หา log entries ด่วนหากมีปัญหาในระบบ หรือประมวลผลข้อมูลที่จับได้สำหรับการวิจัย
หากคุณเคยพยายามทำอะไรมากกว่า simple find/replace บนชุดไฟล์ข้อความขนาดใหญ่ คุณจะรู้คุณค่าในการทำ replacements หรือ updates แบบเฉพาะเจาะจงไปยังข้อความทั้งหมดของคุณแบบโปรแกรมเมติก โดยไม่ต้องรัน find/replace แยกต่างหาก
ดู Linux Tips อื่นๆ ของเรา!