awk, sed, และ grep เป็นเครื่องมือ 3 ตัวที่ชอบบนบรรทัดคำสั่ง Linux หรือ UNIX พวกมันทุกตัวทรงพลัง วันนี้เราจะดูวิธีเริ่มต้นใช้ awk เพื่อช่วยให้คุณเข้าใจง่ายขึ้น จากนั้นจะดู one-liners ของ awk ที่มีประโยชน์เพื่อให้สนุกขึ้น
AWK เป็นภาษาโปรแกรมมิ่งที่ออกแบบมาเพื่อประมวลผลข้อมูลแบบข้อความ ไม่ว่าจะอยู่ในไฟล์หรือสตรีมข้อมูล สร้างที่ Bell Labs ในทศวรรษ 1970s แม้จะค่อนข้างเก่า อย่าให้อายุหลอกลวง มันทรงพลังและมีประสิทธิภาพสูงในสิ่งที่มันทำ มาลุยมือกันเลย
ก่อนจะเจาะลึกการทำงานและการใช้งาน awk ที่ซับซ้อน มาเริ่มต้นพื้นฐานก่อน เราจะสร้างและใช้ไฟล์จำลอง (dummy file) สำหรับการฝึกนี้ คุณสามารถใช้ไฟล์ข้อความใดๆ เช่น log จากระบบของคุณ ผมจะใช้ตัวอย่างเอาต์พุตจากเครื่องมือตรวจสอบระบบโปรดของผม — Dstat นี่คือเอาต์พุต:

คลิกเพื่อขยาย
นี่คือเอาต์พุตที่เหมาะสมสำหรับ awk awk เก่งกับเนื้อหาที่คั่นด้วย comma หรือ tab คุณจะเห็นเหตุผลเร็วๆ นี้ ดังนั้น สร้างข้อมูลคล้ายกันหรือคัดลอกและวางตัวอย่างข้างต้นลงในไฟล์จำลองชื่อว่าอะไรก็ได้ เช่น test.txt เปิดหน้าต่างเทอร์มินัลบนคอมพิวเตอร์ Linux เกือบทุก distro ของ Linux มาพร้อม awk หากคุณพบ distro ใดที่ไม่มีมันด้วยเหตุผลใดเหตุผลหนึ่ง กรุณาติดตั้งมัน บนหน้าต่างเทอร์มินัล พิมพ์คำสั่งต่อไปนี้จากไดเรกทอรีที่เก็บ test.txt ไว้ —
# awk {'print'} test.txt
เอาต์พุทควรจะมีเนื้อหาทั้งหมดของไฟล์ข้อความ นั่นสนุกไง
ตอนนี้ลองดูว่าสามารถเลือกคอลัมน์และพิมพ์แค่คอลัมน์นั้นได้อย่างไร รันคำสั่งต่อไปนี้:
# awk {'print $1'} test.txt
ตอนนี้เราขอให้ awk พิมพ์แค่คอลัมน์แรกของไฟล์ข้อความ มันจะคำนวณเองโดยอัตโนมัติว่าไฟล์เป็น tab-separated และพิมพ์แค่คอลัมน์แรกของเนื้อหา คุณควรเห็นอย่างนี้ในเอาต์พุท:
—-total-cpu-usage—-
usr
5
13
8
0
1
1
1
0
1
1
คุณสามารถทำเช่นเดียวกันกับคอลัมน์ไหนก็ได้ หากต้องการให้ awk พิมพ์คอลัมน์ที่สาม ให้เปลี่ยนคำสั่งข้างต้นเป็น:
# awk {'print $3'} test.txt
คุณยังสามารถให้ awk พิมพ์หลายคอลัมน์ได้ หากต้องการพิมพ์คอลัมน์ที่ 1, 3, และ 7 ให้เพิ่มพวกมันในคำสั่ง คั่นด้วย comma
# awk {'print $1, $3, $7'} test.txt
จะทำงานให้คุณ:
—-total-cpu-usage—- -net/total-
usr idl read
5 93 154k
13 87 0
8 92 0
0 99 0
1 97 0
1 98 0
1 99 0
0 99 0
1 99 0
1 100 0
หากคุณมีไฟล์ที่ซับซ้อนกว่า เช่น /etc/password ที่ข้อมูลคั่นด้วย colon แทนที่จะเป็น space หรือ tab awk ไม่รับรู้อัตโนมัติ ในกรณีเช่นนี้ คุณสามารถส่ง separator ที่ถูกต้องให้ awk ใช้คำสั่งแบบนี้เพื่อพิมพ์คอลัมน์ที่สองของไฟล์:
# awk -F':' {'print $1'} /etc/passwd
คำสั่งนี้จะให้เอาต์พุทเป็น username ของผู้ใช้ทั้งหมดบนระบบของคุณ:
apple
mango
banana
watermelon
kiwi
orange
คุณสามารถทำเช่นเดียวกับ separator ประเภทอื่นๆ ได้ คุณยังสามารถใช้ awk เพื่อ parse ไฟล์ log ของคุณได้ ตัวอย่างเช่น หากต้องการดูที่อยู่ IP ทั้งหมดและ URL เว็บที่เกี่ยวข้องซึ่งถูกเข้าถึงบนเว็บเซิร์ฟเวอร์ของคุณ คุณสามารถใช้ awk เพื่อ parse access log ของเว็บเซิร์ฟเวอร์เพื่อรับข้อมูลนี้ ใช้คำสั่งต่อไปนี้:
# awk '$9 == 200 { print $1, $7}' access.log
199.63.142.250 /2008/10/my-5-favourite-hangouts/
220.180.94.221 /2009/02/querious-a-mysql-client-for-the-mac/
67.190.114.46 /2009/05/
173.234.43.110 /2009/01/bicycle-rental/
173.234.38.110 /wp-comments-post.php
การ parse แบบนี้ช่วยให้คุณ 알아차ราว่าใครเข้ามาที่เว็บไซต์มากเกินไป เพราะอาจกำลังขโมยข้อมูล คุณยังสามารถเรียงลำดับข้อมูลนี้ได้ สมมติอยากทราบว่าที่อยู่ IP เฉพาะเข้ามาที่เว็บไซต์กี่ครั้ง
# awk '$9 == 200 { print $1}' access.log | sort | uniq -c | sort -nr
46 122.248.161.1
35 122.248.161.2
26 65.202.21.10
24 67.195.111.46
19 144.36.231.111
18 59.183.121.71