คำสั่ง awk: การแสดงฟิลด์ ตัวคั่น -F และการใช้รูปแบบเงื่อนไข

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบเมื่อ 2026-10-29

คำสั่ง awk เป็นเครื่องมือ Linux ที่อ่านไฟล์ข้อความทีละบรรทัด แบ่งแต่ละบรรทัดเป็นฟิลด์ตามช่องว่างหรือตัวคั่นที่คุณกำหนด แล้วเลือกเฉพาะฟิลด์ของบรรทัดที่ตรงตามเงื่อนไขมาแสดงหรือคำนวณ บนเซิร์ฟเวอร์ AlmaLinux 9 เราได้นับจำนวนคำขอตาม IP และจำนวนตามรหัสสถานะจากไฟล์ตัวอย่างบันทึกการเข้าถึงของเว็บเซิร์ฟเวอร์ด้วยคำสั่งบรรทัดเดียวที่ต่อกับ sort ผ่านไปป์ พบว่าการตอบกลับ 404 ทั้งสามรายการจากสิบสองบรรทัดเป็นคำขอ wp-login.php และ .env จาก IP เดียวกัน

เอาต์พุตด้านล่างได้จากการรันด้วยบัญชี root ภายในโฟลเดอร์ทำงานบนเซิร์ฟเวอร์ AlmaLinux 9.8 บันทึกการเข้าถึง รายการบัญชี บันทึกการขาย และไฟล์คะแนนเป็นไฟล์ตัวอย่างที่สร้างขึ้นเพื่อการทดสอบ ที่อยู่ IP และชื่อบัญชีในไฟล์ก็เป็นค่าตัวอย่างเช่นกัน

1️⃣ วิธีใช้คำสั่ง awk เบื้องต้น

  • ↪️ หมายเลขฟิลด์และ print

awk แบ่งบรรทัดที่อ่านตามช่องว่าง แล้วให้หมายเลขฟิลด์จากด้านหน้าเป็น $1, $2, $3 เราตรวจสอบด้วย scores.txt ที่ชื่อ ผลลัพธ์ และคะแนนคั่นด้วยช่องว่าง

cat scores.txt
alice   pass  82
bob     fail  47
carol   pass  91
dave    pass  68
erin    fail  55

วงเล็บปีกกาในเครื่องหมายคำพูดเดี่ยวคือการทำงาน (แอ็กชัน) ที่รันกับทุกบรรทัด และเมื่อเรียงหมายเลขฟิลด์หลัง print โดยคั่นด้วยจุลภาค จะแสดงเฉพาะฟิลด์นั้น เมื่อแสดงฟิลด์ที่หนึ่งและสาม จะเหลือเพียงชื่อและคะแนน

awk '{print $1, $3}' scores.txt
alice 82
bob 47
carol 91
dave 68
erin 55

ถ้าเอาจุลภาคระหว่างฟิลด์ออกแล้วเขียน $1 $3 ค่าทั้งสองจะติดกันโดยไม่มีช่องว่าง จุลภาคของ print คือเครื่องหมายที่ใส่ตัวคั่นเอาต์พุต (ค่าเริ่มต้นคือช่องว่างหนึ่งตัว) ส่วนค่าที่เขียนเรียงกันโดยไม่มีจุลภาคจะต่อกันเป็นสตริงเดียว

awk '{print $1 $3}' scores.txt
alice82
bob47
carol91
dave68
erin55

NR คือหมายเลขบรรทัดที่อ่านมาถึงตอนนี้ NF คือจำนวนฟิลด์ของบรรทัดนั้น $NF หมายถึงฟิลด์สุดท้าย จึงเลือกคอลัมน์สุดท้ายได้แม้จำนวนฟิลด์ในแต่ละบรรทัดจะต่างกัน

awk '{print NR, NF, $NF}' scores.txt
1 3 82
2 3 47
3 3 91
4 3 68
5 3 55

บันทึกการเข้าถึงของเว็บเซิร์ฟเวอร์ก็คั่นด้วยช่องว่าง จึงเลือกฟิลด์ได้ด้วยวิธีเดียวกัน หมายเลขฟิลด์ของบรรทัดแรกในบันทึกทดสอบเป็นดังนี้

ฟิลด์ค่าในบรรทัดแรกความหมาย
$1192.0.2.10IP ของไคลเอนต์
$4[29/Oct/2026:00:01:12วันที่และเวลาของคำขอ
$6"GETเมธอดของคำขอ (มีเครื่องหมายคำพูดคู่นำหน้า)
$7/index.htmlURL ของคำขอ
$9200รหัสสถานะ
$105120ไบต์ที่ส่ง
$11"-"หน้าก่อนหน้า (Referer)
$12~$15"Mozilla/5.0 (X11; Linux x86_64)"User agent (แยกทุกช่องว่าง)

เราเลือกแสดง $1, $7 และ $9 ซึ่งตรงกับ IP ของไคลเอนต์ URL ของคำขอ และรหัสสถานะ

awk '{print $1, $7, $9}' access.log
192.0.2.10 /index.html 200
198.51.100.7 /about.html 200
192.0.2.10 /images/logo.png 200
203.0.113.25 /wp-login.php 404
203.0.113.25 /wp-login.php 404
192.0.2.10 /contact.html 200
198.51.100.7 /old-page.html 301
203.0.113.25 /.env 404
192.0.2.44 /index.html 200
198.51.100.7 /api/search?q=awk 500
192.0.2.44 /images/logo.png 304
192.0.2.10 /index.html 200

คอลัมน์ที่ค่ามีช่องว่างอย่าง user agent จะแยกเป็นหลายฟิลด์ NF ของสามบรรทัดแรกเป็น 15 ทั้งหมด และ $NF คือส่วนสุดท้ายของ user agent

awk '{print NF, $NF}' access.log | head -3
15 x86_64)"
15 x86_64)"
15 x86_64)"

2️⃣ กำหนดตัวคั่นด้วย awk -F

  • ↪️ ตัวคั่นแบบทวิภาค จุลภาค และนิพจน์ทั่วไป

ไฟล์ที่คอลัมน์คั่นด้วยสัญลักษณ์อื่นที่ไม่ใช่ช่องว่าง ให้เขียนสัญลักษณ์นั้นหลัง -F เมื่อแสดง $1 โดยไม่ใช้ -F จากรายการบัญชี users.txt ที่สร้างในรูปแบบเดียวกับ /etc/passwd บรรทัดส่วนใหญ่แสดงออกมาทั้งบรรทัด

awk '{print $1}' users.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:65534:65534:Kernel
user:x:1000:1000:Example
deploy:x:1001:1001:Deploy
backup:x:1002:1002::/home/backup:/sbin/nologin

ตัวคั่นเริ่มต้นคือช่องว่าง บรรทัดที่เชื่อมด้วยทวิภาคอย่างเดียวจึงมีฟิลด์เดียว มีเพียงบรรทัด nobody, user และ deploy ที่มีช่องว่างในคอลัมน์คำอธิบายเท่านั้นที่ถูกตัดตรงช่องว่างนั้น

เมื่อกำหนดทวิภาคเป็นตัวคั่นด้วย -F: ชื่อบัญชี ($1) และเชลล์สำหรับล็อกอิน ($7) จะแยกจากกัน

awk -F: '{print $1, $7}' users.txt
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
nobody /sbin/nologin
user /bin/bash
deploy /bin/bash
backup /sbin/nologin

ไฟล์ CSV ที่คั่นด้วยจุลภาคแบ่งด้วย -F, เมื่อแสดงสินค้าและจำนวนจากบันทึกการขาย sales.csv หัวตารางในบรรทัดแรก (item qty) ก็ถูกแบ่งแบบเดียวกันและแสดงออกมาด้วย

awk -F, '{print $2, $3}' sales.csv
item qty
keyboard 2
mouse 5
monitor 1
keyboard 1
cable 10
mouse 2
monitor 2

-F, ไม่เหมาะกับ CSV ที่มีจุลภาคอยู่ในคอลัมน์ที่ครอบด้วยเครื่องหมายคำพูดคู่ ใน quoted.csv ที่มีจุลภาคในคอลัมน์สินค้า ฟิลด์จะถูกแบ่งตรงจุลภาคในเครื่องหมายคำพูดด้วย ทำให้ฟิลด์ที่สองเหลือเพียงส่วนต้นของชื่อสินค้า

awk -F, '{print $2}' quoted.csv
item
"cable
keyboard

คู่มือทางการของ GNU Awk แนะนำวิธีใช้ตัวแปร FPAT กับไฟล์แบบนี้ เมื่อเขียนรูปร่างของหนึ่งฟิลด์เป็นนิพจน์ทั่วไปแทนตัวคั่น คอลัมน์ที่ครอบด้วยเครื่องหมายคำพูดจะออกมาเป็นฟิลด์เดียว

awk -v FPAT='([^,]*)|("[^"]*")' '{print $2}' quoted.csv
item
"cable, usb"
keyboard

ถ้าต้องการใช้ตัวคั่นหลายตัว ให้เขียนเป็นนิพจน์ทั่วไปในวงเล็บเหลี่ยม เมื่อกำหนดทั้งทวิภาคและเครื่องหมายทับเป็นตัวคั่น $NF จะเป็นชื่อสุดท้ายของพาธเชลล์สำหรับล็อกอิน (bash, nologin)

awk -F'[:/]' '{print $1, $NF}' users.txt
root bash
bin nologin
daemon nologin
nobody nologin
user bash
deploy bash
backup nologin

3️⃣ รูปแบบเงื่อนไขของคำสั่ง awk

  • ↪️ นิพจน์ทั่วไป การเปรียบเทียบ และ NR

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

awk '/wp-login/' access.log
203.0.113.25 - - [29/Oct/2026:00:04:51 +0000] "POST /wp-login.php HTTP/1.1" 404 196 "-" "Mozilla/5.0 (X11; Linux x86_64)"
203.0.113.25 - - [29/Oct/2026:00:04:52 +0000] "POST /wp-login.php HTTP/1.1" 404 196 "-" "Mozilla/5.0 (X11; Linux x86_64)"

ผลการเลือกบรรทัดเหมือนกับ คำสั่ง grepและ awk ยังเลือกฟิลด์จากบรรทัดที่เลือกแล้วแสดงได้ทันที เมื่อส่งสองบรรทัดเดียวกันที่เลือกด้วย grep ไปยัง awk ผ่านไปป์ จะเหลือเพียง IP และรหัสสถานะ

grep wp-login access.log | awk '{print $1, $9}'
203.0.113.25 404
203.0.113.25 404

ค่าฟิลด์เปรียบเทียบด้วย ==, !=, >, >=, <, <= เราเลือกเฉพาะบรรทัดที่รหัสสถานะ ($9) เป็น 404 แล้วแสดง IP และ URL ของคำขอ

awk '$9 == 404 {print $1, $7}' access.log
203.0.113.25 /wp-login.php
203.0.113.25 /wp-login.php
203.0.113.25 /.env

เมื่อเปรียบเทียบกับสตริง ให้ครอบค่าด้วยเครื่องหมายคำพูดคู่ เราเลือกเฉพาะชื่อที่ฟิลด์ที่สองเป็น pass

awk '$2 == "pass" {print $1}' scores.txt
alice
carol
dave

การเปรียบเทียบตัวเลขใช้เลือกตามช่วง เช่น หมายเลขบัญชี (UID) เมื่อเลือกบัญชีที่ UID ตั้งแต่ 1000 ขึ้นไป จะได้บัญชีทั่วไปพร้อมกับ nobody ที่ UID เป็น 65534

awk -F: '$3 >= 1000 {print $1, $3}' users.txt
nobody 65534
user 1000
deploy 1001
backup 1002

เงื่อนไขสองข้อเชื่อมด้วย && เมื่อเพิ่มเงื่อนไขน้อยกว่า 65534 nobody จะหายไป เหลือเพียงบัญชีทั่วไปสามบัญชีและโฟลเดอร์โฮม

awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $6}' users.txt
user /home/user
deploy /home/deploy
backup /home/backup

[~] ตรวจว่าฟิลด์ตรงกับนิพจน์ทั่วไปหรือไม่ ส่วน [!~] ตรวจว่าไม่ตรง เมื่อเลือกบัญชีที่เชลล์สำหรับล็อกอิน ($7) ลงท้ายด้วย bash และบัญชีที่ไม่ใช่ nologin ตามลำดับ จะได้สามบัญชีเดียวกัน

awk -F: '$7 ~ /bash$/ {print $1}' users.txt
root
user
deploy
awk -F: '$7 !~ /nologin/ {print $1, $7}' users.txt
root /bin/bash
user /bin/bash
deploy /bin/bash

เงื่อนไข NR เลือกตามหมายเลขบรรทัด เมื่อตัดบรรทัดหัวตารางของ CSV ด้วย NR > 1 จะเหลือเฉพาะบันทึกการขาย

awk -F, 'NR > 1 {print $2, $3}' sales.csv
keyboard 2
mouse 5
monitor 1
keyboard 1
cable 10
mouse 2
monitor 2

เอาต์พุตของคำสั่งอื่นก็ส่งผ่านไปป์แล้วแบ่งแบบเดียวกันได้ เมื่อเลือกขนาดไฟล์ ($5) และชื่อ ($9) จากเอาต์พุตของ ls -l บรรทัดแรกออกมาว่าง เพราะบรรทัดแรกของ ls -l คือ [total 24] ไม่มีฟิลด์ที่ห้าและเก้า

ls -l | awk '{print $5, $9}'

1567 access.log
79 quoted.csv
207 sales.csv
85 scores-copy.txt
85 scores.txt
315 users.txt

เมื่อใส่ NR > 1 บรรทัดแรกจะหายไป เหลือเฉพาะขนาดและชื่อไฟล์

ls -l | awk 'NR > 1 {print $5, $9}'
1567 access.log
79 quoted.csv
207 sales.csv
85 scores-copy.txt
85 scores.txt
315 users.txt

4️⃣ awk BEGIN END ผลรวมและค่าเฉลี่ย

  • ↪️ ตัวแปรและรูปแบบเอาต์พุตของ printf

บล็อก BEGIN ทำงานหนึ่งครั้งก่อนอ่านบรรทัดแรก ส่วนบล็อก END ทำงานหนึ่งครั้งหลังประมวลผลบรรทัดสุดท้าย ผลรวมทำได้โดยบวกเข้าตัวแปรทุกบรรทัดแล้วแสดงใน END แผนภาพด้านล่างแสดงลำดับที่ awk ทำในแต่ละบรรทัดเมื่อหาผลรวมของยอดเงินในบันทึกการขาย

🔁 ลำดับที่ awk ประมวลผล sales.csv ทีละบรรทัด
แผนภาพอธิบาย
🔁 ลำดับการประมวลผล
$ awk -F, 'NR > 1 {t += $3 * $4} END {printf "total %.2f\n", t}' sales.csv
① บรรทัดที่อ่านNR = 1date,item,qty,priceNR = 22026-10-01,keyboard,2,45.00NR = 32026-10-01,mouse,5,19.90NR = 82026-10-04,monitor,2,189.00ไม่มีบรรทัดให้อ่านแล้วบรรทัดที่ 8 เป็นบรรทัดสุดท้าย
② แบ่งฟิลด์ (-F,)$1date$2item$3qty$4priceบรรทัดหัวตารางก็แบ่งแบบเดียวกัน$12026-10-01$2keyboard$32$445.00$3 จำนวน, $4 ราคาต่อหน่วย$12026-10-01$2mouse$35$419.90$3 จำนวน, $4 ราคาต่อหน่วย$12026-10-04$2monitor$32$4189.00$3 จำนวน, $4 ราคาต่อหน่วยไม่มีบรรทัดให้แบ่งบล็อก END ไม่อ่านบรรทัด
③ รูปแบบและแอ็กชันNR > 1 เท็จข้ามแอ็กชันt = (ค่าว่าง)NR > 1 จริงt += 2 * 45.00t = 90NR > 1 จริงt += 5 * 19.90t = 189.5NR > 1 จริงt += 2 * 189.00t = 886.3รัน ENDtotal 886.30printf แสดง t ถึงทศนิยมสองตำแหน่ง
บรรทัดแรกเป็นหัวตาราง NR > 1 จึงเป็นเท็จ และไปบรรทัดถัดไปโดยไม่มีแอ็กชัน
ตั้งแต่บรรทัดที่สองรูปแบบเป็นจริง และ 90 ซึ่งเป็นผลคูณของจำนวนกับราคาต่อหน่วยจะถูกบวกเข้าตัวแปร t
ตัวแปร t คงค่าไว้แม้เปลี่ยนบรรทัด ผลรวมถึงบรรทัดที่สามจึงเป็น 189.5
บรรทัดที่ 4-7 ทำตามลำดับเดียวกัน และเมื่อถึงบรรทัดสุดท้ายคือบรรทัดที่ 8 ค่า t เป็น 886.3
หลังประมวลผลบรรทัดสุดท้าย บล็อก END ทำงานหนึ่งครั้ง และ printf แสดง total 886.30

ผลรวมของไบต์ที่ส่ง ($10) ทั้งหมดในบันทึกการเข้าถึงคือ 41298 ไบต์ ตัวแปรที่ใช้ครั้งแรกเริ่มจากค่าว่าง (เป็นตัวเลขคือ 0) จึงไม่ต้องใส่ 0 เอง

awk '{sum += $10} END {print sum}' access.log
41298

ถ้าแสดงผลรวมในแอ็กชันที่รันทุกบรรทัดแทน END จะเห็นยอดสะสมทุกครั้งที่อ่านบรรทัด เมื่อแสดงหมายเลขบรรทัดและ t ทุกครั้งที่บวกผลคูณของจำนวนกับราคาเข้า t จะได้เจ็ดบรรทัดโดยไม่รวมหัวตาราง และ 886.3 ในบรรทัดสุดท้ายคือผลรวมทั้งหมด

awk -F, 'NR > 1 {t += $3 * $4; print NR, t}' sales.csv
2 90
3 189.5
4 378.5
5 423.5
6 468.5
7 508.3
8 886.3

ค่าเฉลี่ยหาได้ใน END โดยนำผลรวมหารด้วยจำนวนบรรทัด คะแนนห้าค่ารวมกันได้ 343 และค่าเฉลี่ยคือ 68.6

awk '{total += $3; n++} END {print total, n, total / n}' scores.txt
343 5 68.6

BEGIN ใช้แสดงบรรทัดหัวตารางหนึ่งครั้งเหนือผลลัพธ์ เหนือสินค้าและยอดเงิน (จำนวน × ราคาต่อหน่วย) จะมีบรรทัด item total เพียงครั้งเดียว

awk -F, 'BEGIN {print "item", "total"} NR > 1 {print $2, $3 * $4}' sales.csv
item total
keyboard 90
mouse 99.5
monitor 189
keyboard 45
cable 45
mouse 39.8
monitor 378

ตัวคั่นเอาต์พุตเปลี่ยนได้ด้วยตัวแปร OFS ใน BEGIN เมื่อตั้ง OFS เป็นจุลภาค ตำแหน่งจุลภาคของ print จะเป็นจุลภาคแทนช่องว่าง และรายการบัญชีจะออกมาในรูปแบบ CSV

awk 'BEGIN {FS = ":"; OFS = ","} {print $1, $3, $7}' users.txt
root,0,/bin/bash
bin,1,/sbin/nologin
daemon,2,/sbin/nologin
nobody,65534,/sbin/nologin
user,1000,/bin/bash
deploy,1001,/bin/bash
backup,1002,/sbin/nologin

ถ้าต้องการจัดแนวคอลัมน์ให้ใช้ printf %-10s คือสตริงชิดซ้าย 10 ช่อง %3d คือจำนวนเต็ม 3 ช่อง และ %8.2f คือตัวเลข 8 ช่องที่มีทศนิยมสองตำแหน่ง

awk -F, 'NR > 1 {printf "%-10s %8.2f\n", $2, $3, $3 * $4}' sales.csv
keyboard     2    90.00
mouse        5    99.50
monitor      1   189.00
keyboard     1    45.00
cable       10    45.00
mouse        2    39.80
monitor      2   378.00

printf ต่างจาก print ตรงที่ไม่ขึ้นบรรทัดใหม่ จึงต้องเขียน [\n] ท้ายรูปแบบ ถ้ารันโดยไม่มี [\n] ชื่อสินค้าจะต่อกันเป็นบรรทัดเดียว

awk -F, 'NR > 1 {printf "%s ", $2}' sales.csv
keyboard mouse monitor keyboard cable mouse monitor

5️⃣ การวิเคราะห์บันทึกและตัวเลือกของคำสั่ง awk

  • ↪️ การนับ IP ของไคลเอนต์และรหัสสถานะ สรุปตัวเลือก

🔲 การวิเคราะห์บันทึก

การบวกเข้าตัวแปรเดียวได้ผลรวมเดียว ถ้าต้องการนับแยกตาม IP หรือรหัสสถานะ ให้รวบรวมค่าในอาร์เรย์ n[$1]++ บวก 1 เข้าช่องอาร์เรย์ที่ใช้ IP เป็นคีย์ และ for (ip in n) ใน END จะดึงช่องที่รวบรวมไว้ออกมาทีละช่อง

awk '{n[$1]++} END {for (ip in n) print n[ip], ip}' access.log | sort -rn
4 192.0.2.10
3 203.0.113.25
3 198.51.100.7
2 192.0.2.44

ลำดับที่ for (ip in n) ดึงออกมาไม่แน่นอน (ตามคู่มือ GNU Awk) เราจึงเรียงตามจำนวนคำขอด้วย sort -rn โดย 192.0.2.10 มากที่สุดที่ 4 รายการ

จำนวนตามรหัสสถานะนับด้วยวิธีเดียวกัน มี 404 จำนวน 3 รายการ และ 500 จำนวน 1 รายการ

awk '{n[$9]++} END {for (s in n) print s, n[s]}' access.log | sort
200 6
301 1
304 1
404 3
500 1

ถ้าดึงเฉพาะรหัสสถานะแล้วส่งให้ sort และ uniq -c ก็ได้จำนวนเท่ากัน

awk '{print $9}' access.log | sort | uniq -c
      6 200
      1 301
      1 304
      3 404
      1 500

ถ้าต้องการดูเฉพาะการตอบกลับที่ผิดพลาด ให้ตั้งเงื่อนไขที่รหัสสถานะ บรรทัดที่ตั้งแต่ 400 ขึ้นไปคือคำขอค้นหา wp-login.php และ .env สามรายการ และข้อผิดพลาด 500 หนึ่งรายการ

awk '$9 >= 400 {print $9, $1, $7}' access.log
404 203.0.113.25 /wp-login.php
404 203.0.113.25 /wp-login.php
404 203.0.113.25 /.env
500 198.51.100.7 /api/search?q=awk

ผลรวมไบต์ที่ส่งตาม IP ก็หาได้โดยบวกเข้าอาร์เรย์ 192.0.2.10 ได้รับมากที่สุดที่ 31340 ไบต์

awk '{b[$1] += $10} END {for (ip in b) print b[ip], ip}' access.log | sort -rn
31340 192.0.2.10
5120 192.0.2.44
4250 198.51.100.7
588 203.0.113.25

ฟิลด์เวลา ($4) เปรียบเทียบเป็นสตริงได้ ในบรรทัดที่วันที่และรูปแบบเหมือนกัน ลำดับสตริงตรงกับลำดับเวลา เราจึงเลือกเฉพาะคำขอสี่รายการตั้งแต่ 00:05 จนถึงก่อน 00:10

awk '$4 >= "[29/Oct/2026:00:05" && $4 < "[29/Oct/2026:00:10" {print $4, $7}' access.log
[29/Oct/2026:00:05:30 /contact.html
[29/Oct/2026:00:07:02 /old-page.html
[29/Oct/2026:00:07:15 /.env
[29/Oct/2026:00:09:48 /index.html

🔲 ตัวเลือกของคำสั่ง awk

📌 ตัวเลือกหลัก: ผลที่รันในบทความนี้

ตัวเลือกหน้าที่ผลที่เห็นในบทความนี้
-F fsกำหนดตัวคั่นฟิลด์อินพุต-F: แยกชื่อบัญชี ($1) และเชลล์สำหรับล็อกอิน ($7) ของ users.txt ส่วน -F, แสดงสินค้าและจำนวนของ sales.csv พร้อมหัวตาราง (item qty)
-v var=valกำหนดค่าให้ตัวแปรก่อนรันโปรแกรมส่งตัวแปรเชลล์ min ด้วย -v min=$min จะแสดงหกบรรทัดที่ไบต์ที่ส่งตั้งแต่ 1000 ขึ้นไป ส่วน -v FPAT=… ทำให้คอลัมน์ที่ครอบด้วยเครื่องหมายคำพูดใน quoted.csv เป็นฟิลด์เดียว
-i inplaceบันทึกเอาต์พุตลงไฟล์เดิมแทนการแสดงบนหน้าจอหลังรัน gawk -i inplace ไม่มีอะไรแสดงบนหน้าจอ และสำเนา scores.txt เปลี่ยนเป็นสองคอลัมน์คือชื่อและคะแนน ถ้าใส่ -v inplace::suffix=.bak ด้วย เนื้อหาก่อนเปลี่ยนจะเหลือในไฟล์ .bak
--versionแสดงข้อมูลเวอร์ชันบรรทัดแรกของ [awk --version] แสดงเวอร์ชัน GNU Awk 5

📎 ตัวเลือกอื่น: ตามคู่มือทางการ

ตัวเลือกหน้าที่
-f program-fileอ่านโปรแกรม AWK จากไฟล์แทนอาร์กิวเมนต์แรกของบรรทัดคำสั่ง ระบุ -f ได้หลายครั้ง
-e program-textใช้ข้อความในบรรทัดคำสั่งเป็นซอร์สโปรแกรม AWK ใช้ร่วมกับฟังก์ชันไลบรารีที่โหลดด้วย -f หรือ --include ได้
-E fileคล้าย -f แต่ถูกประมวลผลท้ายสุดและป้องกันการกำหนดตัวแปรทางบรรทัดคำสั่ง สำหรับสคริปต์ #!
--traditionalรันในโหมดเข้ากันได้ ไม่รู้จักส่วนขยายของ GNU
--posixเปิดโหมดเข้ากันได้และเพิ่มข้อจำกัด เช่น ไม่รู้จัก func ซึ่งเป็นคำพ้องของ function
--lintเตือนโครงสร้างที่น่าสงสัยหรือย้ายไปใช้กับ AWK อื่นได้ยาก ถ้าใช้ --lint=fatal คำเตือนจะกลายเป็นข้อผิดพลาดร้ายแรง
--dump-variablesเขียนรายการตัวแปรส่วนกลางพร้อมชนิดและค่าสุดท้ายแบบเรียงลำดับลงไฟล์ ถ้าไม่ระบุไฟล์จะเป็น awkvars.out

🔲 ตัวจำลองคำสั่ง awk

ในตัวจำลองด้านล่าง คุณสามารถพิมพ์คำสั่ง awk กับไฟล์ทดสอบชุดเดียวกันได้เอง

ตัวจำลองคำสั่ง awkGNU Awk 5
[root@server work]#
ตัวแปลภาษา awk ขนาดเล็กที่ทำงานในเบราว์เซอร์ของคุณเท่านั้น ไฟล์ทดสอบสี่ไฟล์เป็นไฟล์เดียวกับที่ใช้วัดจริง และใช้ ↑↓ เรียกคำสั่งก่อนหน้ากลับมาได้

🔢 FAQ & เนื้อหาแนะนำ

$min ในเครื่องหมายคำพูดเดี่ยวจะไม่ถูกเชลล์แทนค่าและส่งถึง awk ตามเดิม จึงต้องส่งด้วยตัวเลือก -v เมื่อใส่ 1000 ในตัวแปรเชลล์ min แล้วส่งด้วย -v min=$min จะได้หกบรรทัดที่ไบต์ที่ส่งตั้งแต่ 1000 ขึ้นไป ถ้าครอบโปรแกรม awk ด้วยเครื่องหมายคำพูดคู่ เชลล์จะแทน $1 ของ [print $1] ด้วยค่าว่างก่อน และแสดงทั้งบรรทัด

GNU Awk เมื่อใส่ -i inplace จะบันทึกเอาต์พุตลงไฟล์เดิมแทนหน้าจอ เมื่อรันโปรแกรมที่แสดงฟิลด์ที่หนึ่งและสามกับสำเนา scores.txt ด้วย gawk -i inplace ไม่มีอะไรแสดงบนหน้าจอ และไฟล์เปลี่ยนเป็นสองคอลัมน์คือชื่อและคะแนน เนื่องจากเขียนทับไฟล์เดิมทันที การใส่ -v inplace::suffix=.bak ด้วยจะเก็บเนื้อหาก่อนเปลี่ยนไว้ในไฟล์ .bak

บนเซิร์ฟเวอร์ AlmaLinux 9 /usr/bin/awk เป็นลิงก์สัญลักษณ์ไปยัง gawk และบรรทัดแรกของ [awk --version] แสดงเวอร์ชัน GNU Awk 5 บนเซิร์ฟเวอร์นี้ทั้งสองชื่อรันโปรแกรมเดียวกัน ก่อนใช้ความสามารถของ GNU Awk อย่าง -i inplace หรือ FPAT ให้ตรวจด้วย [awk --version] ว่าเป็น GNU Awk

🔗 เนื้อหาแนะนำ
บันทึก · ระบบ บันทึกระบบ Linux: ความหมายและการจัดประเภท บทความจัดประเภทว่าการทำงานของระบบ ข้อผิดพลาด และเหตุการณ์ด้านความปลอดภัยถูกบันทึกในไฟล์ใด ช่วยให้ตรวจตำแหน่งและชนิดของบันทึกที่จะวิเคราะห์ด้วย awk ได้ อ่านบทความ → แผนที่ต้นไม้ของบันทึกระบบ Linux

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 1   +   9   =