ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk
ควบคุมตัวคั่นฟิลด์ขาเข้าและขาออก เพื่อแบ่งบรรทัด CSV, TSV และบันทึกเป็นคอลัมน์ที่เป็นระเบียบ
ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk เป็นบทเรียน DevOps Bootcamp ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน DevOps Bootcamp และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส DevOps Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
ระเบียนและฟิลด์ใน awk คืออะไร
awk อ่านข้อมูลเข้าทีละบรรทัด แต่ละบรรทัดเรียกว่า ระเบียน และแต่ละส่วนที่คั่นด้วยช่องว่างภายในบรรทัดนั้นเรียกว่า ฟิลด์
$0— ระเบียนปัจจุบันทั้งหมด (ทั้งบรรทัด)$1— ฟิลด์แรก$2— ฟิลด์ที่สอง$NF— ฟิลด์สุดท้าย (NF= จำนวนฟิลด์)
ตามค่าเริ่มต้น awk จะแยกฟิลด์เมื่อพบช่องว่างต่อเนื่องทุกชนิด (ช่องว่างหรือแท็บ) จึงเหมาะสำหรับการแยกวิเคราะห์บันทึก การประมวลผลผลลัพธ์จากคำสั่ง และข้อมูลที่คั่นด้วยช่องว่างได้ทันที
#!/usr/bin/env bash
# Show how awk sees records and fields
echo 'alice 30 engineer' | awk '{ print "Name:", $1, "Age:", $2, "Role:", $3 }'
# $NF is always the last field — regardless of how many there are
echo 'one two three four five' | awk '{ print "Last field:", $NF }'ตัวคั่นฟิลด์ข้อมูลเข้า: FS
ตัวแปรในตัวของ FS (ตัวคั่นฟิลด์ข้อมูลเข้า) จะบอก awk ว่าต้องแยกแต่ละระเบียนออกเป็นฟิลด์อย่างไร ค่าเริ่มต้นคือช่องว่างหนึ่งช่อง ซึ่งจะเปิดโหมดแยกด้วยช่องว่าง
คุณกำหนดค่า FS ได้สองวิธี:
- ใช้แฟล็ก
-Fในบรรทัดคำสั่ง:awk -F':' - ภายในบล็อก
BEGIN:BEGIN { FS = ":" }
ทั้งสองวิธีให้ผลเหมือนกัน วิธีใช้บล็อก BEGIN เหมาะกว่าสำหรับสคริปต์ขนาดยาว เพราะทำให้การกำหนดค่าอยู่ภายในสคริปต์เอง อ่านง่ายและย้ายไปใช้ที่อื่นได้
#!/usr/bin/env bash
# Parse /etc/passwd using ':' as the field separator
# Field 1 = username, field 3 = UID, field 7 = shell
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin' \
| awk -F':' '{ print $1, "UID="$3, "shell="$7 }'การกำหนดค่า FS ในบล็อก BEGIN
สำหรับสคริปต์ที่ยาวกว่าคำสั่งบรรทัดเดียว การวาง FS ไว้ในบล็อก BEGIN ถือเป็นแนวปฏิบัติมาตรฐาน บล็อก BEGIN จะทำงาน ก่อนที่ awk จะอ่านข้อมูลเข้าใด ๆ ดังนั้นตัวคั่นจึงพร้อมใช้งานกับระเบียนแรก
รูปแบบนี้ยังช่วยให้คุณกำหนดค่าตัวแปรหลายตัวพร้อมกัน เพิ่มคำอธิบาย และเก็บตรรกะทั้งหมดไว้ภายในสคริปต์ไฟล์เดียว
ตัวคั่นที่พบบ่อยในการใช้งานจริง:
- โคลอน
:—/etc/passwd,/etc/shadow - แท็บ
\t— ข้อมูลส่งออกแบบ TSV ผลลัพธ์จากคอมไพเลอร์ - จุลภาค
,— ไฟล์ CSV (แบบง่าย ไม่มีฟิลด์ที่ใส่เครื่องหมายคำพูด) - ไปป์
|— รูปแบบบันทึกบางชนิด ข้อมูลส่งออกจากฐานข้อมูล
#!/usr/bin/env bash
# awk script using BEGIN to set FS for TSV input
printf 'alice\t30\tengineer\nbob\t25\tdesigner\ncarol\t35\tmanager\n' \
| awk 'BEGIN { FS = "\t" } { printf "%-10s age=%-3s role=%s\n", $1, $2, $3 }'การแยกวิเคราะห์ไฟล์ CSV ด้วย awk
CSV (ค่าที่คั่นด้วยจุลภาค) เป็นหนึ่งในรูปแบบข้อมูลที่พบบ่อยที่สุดในงานวิศวกรรมเชลล์ การกำหนด FS="," ทำให้ awk ใช้จุลภาคเป็นตัวคั่น
ข้อควรระวังสำคัญ: การจัดการ CSV ในตัวของ awk ไม่รองรับฟิลด์ที่มีเครื่องหมายคำพูดและมีจุลภาคอยู่ภายใน เช่น "Smith, John" วิธีนี้ทำงานได้สมบูรณ์กับ CSV แบบง่ายที่ไม่มีจุลภาคในฟิลด์ที่ใส่เครื่องหมายคำพูด แต่สำหรับ CSV ที่สอดคล้องกับ RFC 4180 และมีฟิลด์ลักษณะดังกล่าว ให้ใช้ตัวแยกวิเคราะห์ CSV โดยเฉพาะ หรือใช้ miller/csvkit
งานที่พบได้บ่อยในโลกจริงคือการดึงคอลัมน์ที่ต้องการและกรองแถวตามค่า ซึ่งทำได้ง่ายด้วย awk เมื่อกำหนด FS แล้ว
#!/usr/bin/env bash
# Simple CSV: extract name and salary columns, filter salary > 50000
data='name,department,salary
alice,engineering,95000
bob,marketing,48000
carol,engineering,112000
dave,hr,45000'
echo "$data" | awk -F',' '
NR == 1 { next } # skip header row
$3 > 50000 { print $1, "earns", $3 }
'ตัวคั่นฟิลด์หลายอักขระและนิพจน์ปกติ
FS ของ awk ไม่ได้จำกัดอยู่ที่อักขระเดียว แต่สามารถเป็น นิพจน์ปกติได้ ซึ่งมีประโยชน์อย่างมากกับรูปแบบบันทึกจริงที่ฟิลด์ถูกคั่นด้วยตัวคั่นที่มีความยาวไม่แน่นอน
ตัวอย่างตัวคั่นแบบนิพจน์ปกติ:
FS = "[,;]"— แยกเมื่อพบจุลภาคหรืออัฒภาคFS = "[ \t]+"— แยกเมื่อพบช่องว่างหรือแท็บอย่างน้อยหนึ่งตัว (เหมือนค่าเริ่มต้นแต่ระบุอย่างชัดเจน)FS = "::"— แยกเมื่อพบโคลอนคู่ตามตัวอักษรFS = "\\|"— แยกเมื่อพบอักขระไปป์ (ต้องทำการหลีกอักขระ)
เมื่อ FS เป็นนิพจน์ปกติ awk (gawk) จะปฏิบัติต่อค่านี้เป็นรูปแบบ ไม่ใช่สตริงตามตัวอักษร
#!/usr/bin/env bash
# Log lines with mixed delimiters: split on " | " or "::" or ","
# Here we split on one or more spaces or pipe characters
printf '2024-01-15 | ERROR | disk full | /dev/sda1\n2024-01-15 | INFO | startup ok | main\n' \
| awk -F' \\| ' '{ printf "date=%-12s level=%-6s msg=%s\n", $1, $2, $3 }'
# Split on multiple possible delimiters using character class
echo 'alpha,beta;gamma,delta;epsilon' \
| awk -F'[,;]' '{ for(i=1; i<=NF; i++) print i": "$i }'ตัวคั่นฟิลด์ข้อมูลออก: OFS
OFS (ตัวคั่นฟิลด์ข้อมูลออก) ควบคุมสิ่งที่ awk ใส่ไว้ระหว่างฟิลด์เมื่อคุณประกอบระเบียนขึ้นใหม่ด้วย print ค่าเริ่มต้นคือช่องว่างหนึ่งช่อง
ประเด็นสำคัญคือ OFS จะถูกแทรกระหว่างฟิลด์เฉพาะเมื่อใช้ไวยากรณ์ จุลภาคใน print หรือเมื่อกำหนดค่าให้ฟิลด์แล้ว awk สร้าง $0 ขึ้นใหม่ หากคุณต่อสตริงโดยใส่ช่องว่างในโค้ดต้นฉบับ จะไม่ใช้ OFS
print $1, $2, $3— จุลภาคจะทำให้แทรก OFS ระหว่างฟิลด์print $1 " " $2— ใช้ช่องว่างที่ระบุโดยตรง จึงไม่สนใจ OFS
รูปแบบที่พบบ่อยคือ อ่าน CSV แปลงข้อมูล แล้วเขียนเป็น TSV โดยกำหนด FS="," และ OFS="\t"
#!/usr/bin/env bash
# Convert CSV to TSV using FS and OFS
data='alice,30,engineer
bob,25,designer
carol,35,manager'
echo "$data" | awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2, $3 }'
echo '---'
# OFS also applies when you modify a field — awk rebuilds $0 with OFS
echo 'alice,30,engineer' | awk 'BEGIN { FS=","; OFS=" | " } { $1=$1; print $0 }'บังคับให้ awk สร้าง $0 ใหม่ด้วย OFS
มีเทคนิคหนึ่งที่ละเอียดอ่อนแต่สำคัญ: การกำหนดค่าให้ฟิลด์ใด ๆ (แม้แต่การกำหนดฟิลด์ให้ตัวมันเองด้วย $1=$1) จะบังคับให้ awk สร้าง $0 ขึ้นใหม่ โดยนำฟิลด์ทั้งหมดมาต่อกันด้วย OFS
นี่คือวิธีมาตรฐานในการจัดรูปแบบตัวคั่นของระเบียนใหม่ โดยไม่ต้องแสดงผลทุกฟิลด์ด้วยตนเอง:
- กำหนด
FSให้เป็นตัวคั่นข้อมูลเข้า - กำหนด
OFSให้เป็นตัวคั่นข้อมูลออกที่ต้องการ - บังคับให้สร้างใหม่ด้วย
$1=$1 - แสดงผล
$0
วิธีนี้รองรับฟิลด์จำนวนเท่าใดก็ได้ และหลีกเลี่ยงการเขียน $1, $2, $3, ... แบบตายตัว
#!/usr/bin/env bash
# Reformat a pipe-delimited file to comma-separated WITHOUT listing every field
printf 'alice|30|engineer|london\nbob|25|designer|paris\ncarol|35|manager|berlin\n' \
| awk 'BEGIN { FS="|"; OFS="," } { $1=$1; print $0 }'
# Useful when you don't know how many fields there are:
printf 'a|b|c|d|e|f|g\n1|2|3|4|5|6|7\n' \
| awk 'BEGIN { FS="|"; OFS="\t" } { $1=$1; print $0 }'ตัวคั่นระเบียน: RS
เช่นเดียวกับที่ FS ใช้แยกฟิลด์ภายในระเบียน RS (ตัวคั่นระเบียน) จะกำหนดสิ่งที่ใช้แยกระเบียนออกจากกัน โดยค่าเริ่มต้น RS คือ newline ดังนั้น awk จึงประมวลผลทีละบรรทัด
การเปลี่ยนค่า RS ช่วยให้ประมวลผลระเบียนหลายบรรทัดได้อย่างมีประสิทธิภาพ:
RS=""— โหมดย่อหน้า: บรรทัดว่างใช้แยกระเบียน (ฟิลด์สามารถครอบคลุมหลายบรรทัดได้)RS=";"— แยกด้วยเครื่องหมายอัฒภาค (มีประโยชน์สำหรับข้อมูลส่งออกจาก SQL)RS="\n"— newline แบบระบุอย่างชัดเจน (ค่าเริ่มต้น)
ในโหมดย่อหน้า (RS="") ยังคงใช้ FS เพื่อแยกฟิลด์ภายในระเบียนหลายบรรทัด และ newline ภายในระเบียนจะถูกถือเป็นตัวคั่นฟิลด์โดยอัตโนมัติด้วย
#!/usr/bin/env bash
# Paragraph mode: each blank-line-separated block is one record
# Useful for processing structured text blocks (e.g., stanzas, config sections)
data='Name: Alice
Role: Engineer
City: London
Name: Bob
Role: Designer
City: Paris'
echo "$data" | awk 'BEGIN { RS=""; FS="\n" } {
print "Record", NR":"
for (i=1; i<=NF; i++) print " ", $i
print ""
}'ตัวคั่นระเบียนผลลัพธ์: ORS
ORS (ตัวคั่นระเบียนผลลัพธ์) จะถูกพิมพ์ต่อท้ายคำสั่ง print แต่ละคำสั่ง โดยค่าเริ่มต้นคือ newline (\n) ซึ่งเป็นเหตุผลที่ print แต่ละครั้งขึ้นบรรทัดใหม่
การเปลี่ยนค่า ORS ช่วยให้คุณทำสิ่งต่อไปนี้ได้:
- รวมระเบียนไว้ในบรรทัดเดียว:
ORS=" " - เพิ่มบรรทัดว่างระหว่างระเบียนผลลัพธ์:
ORS="\n\n" - สร้างรูปแบบผลลัพธ์แบบกำหนดเอง เช่น ส่วนประกอบของ JSON หรือ XML
โปรดทราบว่า printf จะไม่ใช้ ORS — ORS มีผลเฉพาะกับคำสั่ง print แบบเดี่ยวเท่านั้น ให้ใช้ printf เมื่อต้องการควบคุมการจัดรูปแบบอย่างละเอียด
#!/usr/bin/env bash
# Join all matching lines onto one line by setting ORS to a space
printf 'apple\nbanana\ncherry\ndate\n' | awk '{ ORS=" " } { print $0 }'
echo # final newline
# Add a blank line after every output record for readability
printf 'alice 30 engineer\nbob 25 designer\ncarol 35 manager\n' \
| awk 'BEGIN { ORS="\n\n" } { print $1, "is a", $3 }'ตัวอย่างเชิงปฏิบัติ: การแยกวิเคราะห์บันทึกการเข้าถึงของ Apache
บันทึกการเข้าถึงของ Apache/nginx มีรูปแบบที่เป็นที่รู้จัก โดยฟิลด์คั่นด้วยช่องว่าง ฟิลด์บางรายการ (เช่น การประทับเวลา) มีช่องว่างอยู่ภายในและถูกครอบด้วยวงเล็บเหลี่ยมหรือเครื่องหมายคำพูด ทำให้การแยกฟิลด์โดยตรงด้วย awk ทำได้ยุ่งยาก
แนวทางเชิงปฏิบัติคือใช้ FS แบบนิพจน์ทั่วไปที่สอดคล้องกับโครงสร้าง หรือดึงฟิลด์เฉพาะตามตำแหน่งโดยอาศัยความรู้เกี่ยวกับรูปแบบที่แน่นอน
ฟิลด์ในรูปแบบบันทึกแบบรวมมีโดยประมาณดังนี้:
- IP ของไคลเอนต์
- ข้อมูลระบุตัวตน (โดยปกติคือ
-) - ผู้ใช้ที่ผ่านการยืนยันตัวตน (โดยปกติคือ
-) - การประทับเวลา (อยู่ในวงเล็บเหลี่ยมและนับเป็นโทเค็นเดียว)
- เมธอด+เส้นทาง+โพรโทคอลของคำขอ (อยู่ในเครื่องหมายคำพูด)
- รหัสสถานะ HTTP
- จำนวนไบต์ของการตอบกลับ
#!/usr/bin/env bash
# Parse a simulated Apache Combined Log Format line
# Extract: IP, status code, bytes, and request path
logs='192.168.1.10 - alice [15/Jan/2024:10:23:45 +0000] "GET /api/users HTTP/1.1" 200 1523
10.0.0.5 - - [15/Jan/2024:10:23:46 +0000] "POST /login HTTP/1.1" 401 89
172.16.0.3 - bob [15/Jan/2024:10:23:47 +0000] "GET /dashboard HTTP/1.1" 200 8741'
echo "$logs" | awk '{
ip = $1
status = $9
bytes = $10
# Extract the request path from the quoted string in field 7
split($7, parts, "/")
path = "/" parts[2]
printf "ip=%-15s status=%s bytes=%-6s endpoint=%s\n", ip, status, bytes, path
}'การรวม FS, OFS, RS และ ORS ในไปป์ไลน์
ในการพัฒนาสคริปต์เชลล์จริง คุณแทบไม่ใช้ตัวคั่นเหล่านี้แยกกัน รูปแบบไปป์ไลน์ที่พบได้บ่อยคือใช้ awk เป็น ตัวแปลงรูปแบบ ตรงกลางไปป์ไลน์ เพื่อแปลงรูปแบบที่มีโครงสร้างหนึ่งไปเป็นอีกรูปแบบหนึ่ง
ประเด็นสำคัญในการรวมตัวคั่นมีดังนี้:
- กำหนด
FSและOFSพร้อมกันในBEGINเสมอเมื่อแปลงรูปแบบ - ใช้
$1=$1เพื่อเรียกให้สร้าง$0ใหม่ เมื่อต้องการจัดรูปแบบฟิลด์ทั้งหมดใหม่โดยไม่ต้องระบุทีละฟิลด์ - เปลี่ยน
RSเฉพาะเมื่อระเบียนของคุณครอบคลุมหลายบรรทัดจริง ๆ - ใช้
ORSเพื่อควบคุมช่องว่างระหว่างระเบียนผลลัพธ์ - เลือกใช้
printfเมื่อต้องการจัดรูปแบบอย่างแม่นยำ และใช้printเมื่อการเติมตัวปิดท้ายอัตโนมัติด้วยORSสะดวกกว่า
#!/usr/bin/env bash
# Full pipeline: read a colon-delimited file,
# filter rows where field 3 (UID) >= 1000 (real users),
# then output as tab-separated: username, UID, home dir
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1001:1001:Alice:/home/alice:/bin/bash
bob:x:1002:1002:Bob:/home/bob:/bin/zsh
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin' \
| awk 'BEGIN { FS=":"; OFS="\t" } $3 >= 1000 { print $1, $3, $6 }'ตรวจสอบความรู้: OFS และการสร้างฟิลด์ใหม่
ทดสอบความเข้าใจของคุณเกี่ยวกับการทำงานร่วมกันระหว่าง OFS กับการกำหนดค่าฟิลด์ใน awk
สรุปบทเรียน: ระเบียน ฟิลด์ และตัวคั่น
ขณะนี้คุณควบคุมวิธีที่ awk อ่านและเขียนข้อมูลที่มีโครงสร้างได้อย่างเต็มที่ ต่อไปนี้คือสรุปตัวแปรตัวคั่นทั้งสี่รายการ:
FS— ตัวคั่นฟิลด์ขาเข้า กำหนดด้วย-FหรือในBEGINอาจเป็นอักขระ สตริง หรือนิพจน์ทั่วไปก็ได้ ค่าเริ่มต้นคือช่องว่างOFS— ตัวคั่นฟิลด์ขาออก แทรกไว้ระหว่างฟิลด์ในการเรียกใช้print $1, $2และเมื่อ awk สร้าง$0ใหม่หลังการกำหนดค่าฟิลด์ ค่าเริ่มต้นคือช่องว่างหนึ่งช่องRS— ตัวคั่นระเบียนขาเข้า กำหนดสิ่งที่ใช้แยกระเบียน (บรรทัด) ค่าเริ่มต้นคือ newline หากตั้งเป็นสตริงว่างจะเข้าสู่โหมดย่อหน้าORS— ตัวคั่นระเบียนขาออก เติมต่อท้ายหลังprintทุกครั้ง ค่าเริ่มต้นคือ newline เปลี่ยนค่าเพื่อรวมบรรทัดหรือเพิ่มช่องว่างได้
รูปแบบสำคัญที่สุดที่ควรจำคือ กำหนดทั้ง FS และ OFS ใน BEGIN จากนั้นใช้ $1=$1 เพื่อสร้าง $0 ใหม่ เมื่อต้องการจัดรูปแบบตัวคั่นในทุกฟิลด์ใหม่โดยไม่กำหนดตำแหน่งฟิลด์แบบตายตัว รูปแบบนี้ใช้ได้กับไฟล์ที่มีจำนวนคอลัมน์เท่าใดก็ได้ และเป็นพื้นฐานของไปป์ไลน์แปลงรูปแบบที่ใช้ awk
คำถามที่พบบ่อย
บทเรียน “ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส DevOps Bootcamp ให้อัปเกรดเป็น CoddyKit PRO คอร์ส DevOps Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk”
ควบคุมตัวคั่นฟิลด์ขาเข้าและขาออก เพื่อแบ่งบรรทัด CSV, TSV และบันทึกเป็นคอลัมน์ที่เป็นระเบียบ คุณปฏิบัติ DevOps Bootcamp ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน DevOps Bootcamp หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน DevOps Bootcamp บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน DevOps Bootcamp นี้ได้ไหม
ได้ บทเรียน DevOps Bootcamp ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ระเบียน ฟิลด์ และตัวคั่นแบบกำหนดเองใน awk
- รูปแบบ ช่วง และบล็อก BEGIN/END
- การรวมข้อมูลด้วยอาร์เรย์และการจัดกลุ่มใน awk
- ฟังก์ชัน awk การจัดรูปแบบด้วย printf และการสร้างรายงาน