
นี่คือบทความแรกในซีรีส์บทเรียน awk ใหม่ เราจะโพสต์บทความหลายๆ บทความเกี่ยวกับ awk ในสัปดาห์หน้าที่จะครอบคลุมคุณสมบัติทั้งหมดของ awk พร้อมตัวอย่างปฏิบัติจริง
ในบทความนี้ เราจะทบทวนหลักการทำงานพื้นฐานของ awk พร้อม 7 ตัวอย่างคำสั่ง print แบบปฏิบัติจริง
หมายเหตุ: โปรดทบทวนซีรีส์บทเรียน Sed ของเราก่อนหน้านี้
บทนำ Awk และการดำเนินการพิมพ์
Awk เป็นภาษาโปรแกรมมิ่งที่ช่วยให้จัดการข้อมูลที่มีโครงสร้างและสร้างรายงานที่จัดรูปแบบได้ง่าย Awk ย่อมาจากชื่อผู้เขียน "Aho, Weinberger, และ Kernighan"
Awk ใช้ส่วนใหญ่สำหรับการสแกนรูปแบบและประมวลผล มันค้นหาในไฟล์หนึ่งหรือหลายไฟล์ เพื่อดูว่ามีบรรทัดที่ตรงกับรูปแบบที่ระบุหรือไม่ จากนั้นดำเนินการที่เกี่ยวข้อง
คุณสมบัติหลักของ Awk มีดังนี้:
- Awk มองไฟล์ข้อความเป็นเรคคอร์ดและฟิลด์
- เหมือนภาษาโปรแกรมมิ่งทั่วไป Awk มีตัวแปร เงื่อนไข และลูป
- Awk มีออปเกอเรเตอร์เลขคณิตและสตริง
- Awk สามารถสร้างรายงานที่จัดรูปแบบได้
Awk อ่านจากไฟล์หรือ standard input และส่งออกไปที่ standard output Awk ไม่ทำงานกับไฟล์ที่ไม่ใช่ข้อความ
Syntax: awk '/search pattern1/ {Actions} /search pattern2/ {Actions}' file
ใน syntax awk ข้างต้น:
- search pattern เป็น regular expression
- Actions – คำสั่งที่จะดำเนินการ
- สามารถมี patterns และ actions หลายชุดใน Awk
- file – ไฟล์อินพุต
- เครื่องหมายคำพูดเดี่ยวรอบโปรแกรม เพื่อไม่ให้ shell ตีความอักขระพิเศษของมัน
หลักการทำงานของ Awk
- Awk อ่านไฟล์อินพุททีละบรรทัด
- สำหรับแต่ละบรรทัด จะจับคู่กับรูปแบบที่กำหนดตามลำดับ หากตรง จะดำเนินการที่เกี่ยวข้อง
- หากไม่มีรูปแบบตรง ไม่มีการดำเนินการ
- ใน syntax ข้างต้น search pattern หรือ action เป็น optional แต่ไม่ใช่ทั้งคู่
- หากไม่ให้ search pattern Awk จะดำเนินการ actions ที่กำหนดสำหรับทุกบรรทัดของอินพุต
- หากไม่ให้ action ให้พิมพ์บรรทัดทั้งหมดที่ตรงกับรูปแบบ ซึ่งเป็น default action
- วงเล็บปีกกาที่ว่างเปล่าทำให้ไม่ทำงานอะไรเลย จะไม่ทำ default printing
- แต่ละคำสั่งใน Actions คั่นด้วย semicolon
มาสร้างไฟล์ employee.txt ซึ่งมีเนื้อหาดังนี้ ซึ่งจะใช้ในตัวอย่างด้านล่าง
$cat employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
ตัวอย่าง Awk ที่ 1: พฤติกรรมเริ่มต้นของ Awk
โดยค่าเริ่มต้น Awk พิมพ์ทุกบรรทัดจากไฟล์
$ awk '{print;}' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
ในตัวอย่างข้างต้น pattern ไม่ได้กำหนด ดังนั้น actions จะใช้กับทุกบรรทัด
Action print โดยไม่มีอาร์กิวเมนต์ จะพิมพ์ทั้งบรรทัดโดยค่าเริ่มต้น ดังนั้นพิมพ์ทุกบรรทัดของไฟล์ Actions ต้องอยู่ในวงเล็บปีกกา
ตัวอย่าง Awk ที่ 2: พิมพ์บรรทัดที่ตรงกับรูปแบบ
$ awk '/Thomas/ > /Nisha/' employee.txt 100 Thomas Manager Sales $5,000 400 Nisha Manager Marketing $9,500
ในตัวอย่างข้างต้น พิมพ์ทุกบรรทัดที่ตรงกับ 'Thomas' หรือ 'Nisha' มีสองรูปแบบ Awk ยอมรับ patterns ได้ไม่จำกัด แต่แต่ละชุด (patterns และ actions ที่เกี่ยวข้อง) ต้องคั่นด้วย newline
ตัวอย่าง Awk ที่ 3: พิมพ์เฉพาะฟิลด์ที่ต้องการ
Awk มีตัวแปร built-in หลายตัว สำหรับแต่ละเรคคอร์ด (บรรทัด) จะแยกเรคคอร์ดโดย whitespace character โดยค่าเริ่มต้น และเก็บในตัวแปร $n หากบรรทัดมี 4 คำ จะเก็บใน $1, $2, $3 และ $4 $0 แทนบรรทัดทั้งหมด NF เป็นตัวแปร built-in แทนจำนวนฟิลด์ทั้งหมดในเรคคอร์ด
$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
ในตัวอย่างข้างต้น $2 และ $5 แทน Name และ Salary ตามลำดับ เราสามารถได้ Salary ด้วย $NF ได้เช่นกัน โดย $NF แทนฟิลด์สุดท้าย ในคำสั่ง print ',' เป็นตัวเชื่อม
ตัวอย่าง Awk ที่ 4: การเริ่มต้นและการดำเนินการสุดท้าย
Awk มีรูปแบบสำคัญสองแบบที่ระบุด้วยคีย์เวิร์ด BEGIN และ END
Syntax: BEGIN { Actions} {ACTION} # Action for everyline in a file
END { Actions } # คือ comments ใน Awk
Actions ที่ระบุในส่วน BEGIN จะถูกดำเนินการก่อนเริ่มอ่านบรรทัดจากอินพุต
END actions จะดำเนินการหลังจากอ่านและประมวลผลบรรทัดจากอินพุตเสร็จ
$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------"; }' employee.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
--------------
ในตัวอย่างข้างต้น พิมพ์หัวเรื่องและท้ายไฟล์สำหรับรายงาน
ตัวอย่าง Awk ที่ 5: หาพนักงานที่มี employee id มากกว่า 200
$ awk '$1 >200' employee.txt 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
ในตัวอย่างข้างต้น ฟิลด์แรก ($1) คือ employee id ดังนั้นถ้า $1 มากกว่า 200 ให้ทำ default print action เพื่อพิมพ์ทั้งบรรทัด
ตัวอย่าง Awk ที่ 6: พิมพ์รายชื่อพนักงานในแผนก Technology
ตอนนี้ชื่อแผนกมีเป็นฟิลด์ที่สี่ ต้องตรวจสอบว่า $4 ตรงกับสตริง "Technology" หรือไม่ ถ้าใช่ให้พิมพ์บรรทัด
$ awk '$4 ~/Technology/' employee.txt 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 500 Randy DBA Technology $6,000
Operator ~ ใช้สำหรับเปรียบเทียบกับ regular expressions หากตรง default action คือพิมพ์ทั้งบรรทัด จะถูกดำเนินการ
ตัวอย่าง Awk ที่ 7: พิมพ์จำนวนพนักงานในแผนก Technology
ตัวอย่างด้านล่าง ตรวจสอบว่าแผนกเป็น Technology ถ้าใช่ ใน Action ให้เพิ่มตัวแปร count ซึ่งเริ่มต้นเป็นศูนย์ในส่วน BEGIN
$ awk 'BEGIN { count=0;} $4 ~ /Technology/ { count++; } END { print "Number of employees in Technology Dept =",count;}' employee.txt
Number of employees in Tehcnology Dept = 3
แล้วในตอนท้ายของกระบวนการ ให้พิมพ์ค่า count ซึ่งให้จำนวนพนักงานในแผนก Technology
หนังสือแนะนำ
Sed and Awk 101 Hacks, by Ramesh Natarajan ผมใช้เวลาหลายชั่วโมงต่อวันในสภาพแวดล้อม UNIX / Linux จัดการไฟล์ข้อความ (ข้อมูล config และ log files) ผมใช้ Sed และ Awk สำหรับงานจัดการข้อความทั้งหมด จากประสบการณ์ Sed และ Awk ผมเขียน eBook Sed and Awk 101 Hacks ที่มี 101 ตัวอย่างปฏิบัติจริงเกี่ยวกับคุณสมบัติขั้นสูงของ Sed และ Awk ที่จะเพิ่มประสิทธิภาพชีวิต UNIX / Linux ของคุณ แม้คุณใช้ Sed และ Awk มาหลายปีและยังไม่ได้อ่านหนังสือเล่มนี้ โปรดทำความดีใจตัวเองและอ่าน จะประหลาดใจกับความสามารถของ Sed และ Awk utilities
บทความ Awk เพิ่มเติม
- Awk User-defined Variables with 3 Practical Examples
- 8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
- 7 Powerful Awk Operators Examples (Unary, Binary, Arithmetic, String, Assignment, Conditional, Reg-Ex Awk Operators)
- 4 Awk If Statement Examples ( if, if else, if else if, : ? )
- Caught In the Loop? Awk While, Do While, For Loop, Break, Continue, Exit Examples