awk, sed และ grep เป็นสามเครื่องมือที่ฉันโปรดปรานในบรรทัดคำสั่ง Linux หรือ UNIX พวกเขาทั้งหมดค่อนข้างทรงพลัง วันนี้เราจะมาดูวิธีถอดรหัสด้วย awk เพื่อช่วยให้คุณใช้งานได้ง่ายขึ้น จากนั้นเราจะดู awk one liners ที่มีประโยชน์เพื่อทำให้สิ่งต่าง ๆ สนุกขึ้นเล็กน้อยสำหรับคุณ
AWK เป็นภาษาโปรแกรมที่ออกแบบมาสำหรับการประมวลผลข้อมูลแบบข้อความ ทั้งในไฟล์หรือสตรีมข้อมูล มันถูกสร้างขึ้นที่ Bell Labs ในปี 1970 แม้ว่าจะค่อนข้างเก่า แต่อย่าหลงกลโดยอายุ มันมีประสิทธิภาพมากและมีประสิทธิภาพในสิ่งที่ทำ มาล้างมือกันเถอะ
ก่อนที่เราจะเจาะลึกการทำงานที่ซับซ้อนและการใช้งาน awk มาเริ่มกันที่พื้นฐานกันดีกว่า เราจะสร้างและใช้ไฟล์จำลองสำหรับแบบฝึกหัดนี้ คุณสามารถใช้ไฟล์ข้อความใดก็ได้ เช่น บันทึกจากระบบของคุณ ฉันจะใช้เอาต์พุตตัวอย่างจากเครื่องมือตรวจสอบระบบที่ฉันโปรดปราน - Dstat นี่คือผลลัพธ์:
คลิกเพื่อขยาย
นี่เป็นเอาต์พุตที่เหมาะสำหรับ awk ในการจัดการ awk นั้นยอดเยี่ยมด้วยเนื้อหาที่คั่นด้วยเครื่องหมายจุลภาคหรือแท็บ คุณจะเห็นว่าทำไมเร็ว ๆ นี้ ดังนั้นให้สร้างข้อมูลที่คล้ายกันหรือคัดลอกและวางตัวอย่างของฉันข้างต้นลงในไฟล์จำลองที่เรียกว่า test.txt เปิดหน้าต่างเทอร์มินัลบนคอมพิวเตอร์ Linux ของคุณ Linux เกือบทุกรสชาติมาพร้อมกับ awk ในกรณีที่คุณพบว่าไม่มีด้วยเหตุผลบางประการ โปรดติดตั้ง ในหน้าต่างเทอร์มินัล ให้พิมพ์สิ่งต่อไปนี้จากไดเร็กทอรีที่คุณจัดเก็บไฟล์ test.txt –
# awk {'print'} test.txt
ผลลัพธ์ควรมีเนื้อหาทั้งหมดของไฟล์ข้อความ มันสนุกตรงไหน
ตอนนี้เรามาดูกันว่าคุณจะเลือกคอลัมน์และพิมพ์คอลัมน์นั้นได้อย่างไร ดำเนินการคำสั่งต่อไปนี้:
# awk {'พิมพ์ $1'} test.txt
ตอนนี้เรากำลังขอให้ awk พิมพ์เฉพาะคอลัมน์แรกของไฟล์ข้อความ มันจะค้นหาโดยอัตโนมัติว่าไฟล์นั้นเป็นแท็บที่คั่นหนึ่งและพิมพ์เฉพาะคอลัมน์แรกของเนื้อหา คุณควรเห็นสิ่งนี้ในผลลัพธ์:
—-total-cpu-usage—-
usr
5
13
8
0
1
1
1
0
1
1
คุณสามารถทำเช่นเดียวกันกับคอลัมน์ใดก็ได้ที่คุณชอบ หากคุณต้องการให้ awk พิมพ์คำสั่งเปลี่ยนคอลัมน์ที่สามด้านบนคำสั่งที่แสดงไปที่:
# awk {'พิมพ์ $3'} test.txt
คุณยังสามารถพิมพ์ awk ได้หลายคอลัมน์ ดังนั้น หากคุณต้องการให้พิมพ์คอลัมน์ที่หนึ่ง สาม และเจ็ด ให้เพิ่มลงในคำสั่งที่คั่นด้วยเครื่องหมายจุลภาค
# awk {'พิมพ์ $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 ที่ข้อมูลถูกคั่นด้วยเครื่องหมายทวิภาคแทนที่จะเป็นช่องว่างหรือแท็บ awk จะไม่เลือกไฟล์นั้นโดยอัตโนมัติ ในกรณีเช่นนี้ คุณสามารถป้อน awk ด้วยตัวคั่นที่ถูกต้อง ใช้คำสั่งแบบนี้เพื่อพิมพ์คอลัมน์ที่สองของไฟล์:
# awk -F':' {'print $1'} /etc/passwd
คำสั่งนี้จะให้ผลลัพธ์ของชื่อผู้ใช้ของผู้ใช้ทั้งหมดในระบบของคุณ:
แอปเปิ้ล
มะม่วง
กล้วย
แตงโม
กีวี
ส้ม
คุณสามารถทำเช่นเดียวกันกับตัวคั่นประเภทอื่นๆ คุณยังสามารถใช้ awk เพื่อแยกวิเคราะห์ไฟล์บันทึกของคุณ ตัวอย่างเช่น หากคุณต้องการดูที่อยู่ IP ทั้งหมดและ URL ของเว็บที่เกี่ยวข้องที่มีการเข้าถึงบนเว็บเซิร์ฟเวอร์ของคุณ คุณสามารถใช้ awk เพื่อแยกวิเคราะห์บันทึกการเข้าใช้เว็บเซิร์ฟเวอร์ของคุณเพื่อรับข้อมูลนี้ ใช้คำสั่งต่อไปนี้:
# awk '$9 ==200 { พิมพ์ $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
การใช้การแยกวิเคราะห์ในลักษณะนี้ คุณจะทราบได้ว่ามีผู้เยี่ยมชมเว็บไซต์ของคุณเป็นจำนวนมากหรือไม่ เนื่องจากพวกเขาอาจกำลังขโมยข้อมูล คุณยังสามารถจัดเรียงข้อมูลนี้ได้ สมมติว่าคุณต้องการทราบว่าที่อยู่ IP หนึ่งๆ เข้าชมเว็บไซต์ของคุณกี่ครั้ง
# awk '$9 ==200 { พิมพ์ $1}' access.log | เรียงลำดับ | 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