Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Linux

วิธีเขียนคำสั่งและสคริปต์ AWK

คำสั่ง awk เป็นวิธีที่ทรงพลังสำหรับการประมวลผลหรือวิเคราะห์ไฟล์ข้อความ โดยเฉพาะ มันวิเคราะห์ไฟล์ข้อมูลที่จัดระเบียบโดยบรรทัด (rows) และคอลัมน์ คำสั่ง awk เรียบง่ายสามารถรันจากบรรทัดคำสั่ง งานที่ซับซ้อนกว่าควรเขียนเป็น awk programs (เรียกว่า awk scripts) ลงในไฟล์

วิธีเขียนคำสั่งและสคริปต์ AWK

พื้นฐาน AWK

รูปแบบพื้นฐานของคำสั่ง awk เป็นดังนี้:

awk 'pattern {action}' input-file > output-file

นี่หมายถึง: นำแต่ละบรรทัดของ input file มา ถ้าบรรทัดนั้นมี pattern ให้ apply action กับบรรทัดนั้น และเขียนบรรทัดที่ได้ไปยัง output file หาก pattern ถูกละเว้น action จะถูกนำไปใช้กับทุกบรรทัด ตัวอย่างเช่น:

awk '{ print $5 }' table1.txt > output1.txt

คำสั่งข้างต้นจะนำ element ของคอลัมน์ที่ 5 ของแต่ละบรรทัด เขียนเป็นบรรทัดใน output file "output.txt" ตัวแปร '$4' หมายถึงคอลัมน์ที่ 4 เช่นเดียวกัน คุณสามารถเข้าถึงคอลัมน์ที่ 1, 2, 3 ได้ด้วย $1, $2, $3 เป็นต้น โดยค่าเริ่มต้น คอลัมน์ถือว่าคั่นด้วยช่องว่างหรือแท็บ (ที่เรียกว่า white space) ดังนั้น หาก input file "table1.txt" มีบรรทัดเหล่านี้:

1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50

คำสั่งจะเขียนบรรทัดต่อไปนี้ลงใน output file "output1.txt":

545,
723,
610,
118,
482,
335,
271,
373,

หากคอลัมน์คั่นด้วยสิ่งอื่นนอกจากช่องว่างหรือแท็บ เช่น คอมมา คุณสามารถระบุได้ในคำสั่ง awk ดังนี้:

awk -F, '{ print $3 }' table1.txt > output1.txt

นี่จะเลือก element จากคอลัมน์ที่ 3 ของแต่ละบรรทัด หากคอลัมน์ถือว่าคั่นด้วยคอมมา ดังนั้น output ในกรณีนี้จะเป็น:

Title 545
Title 723
Title 610
Title 118
Title 482
Title 335
Title 271
Title 373

Conditional Expressions ใน AWK

รายการคำสั่งภายใน curly brackets ('{','}') เรียกว่า block หากคุณวาง conditional expression หน้าบล็อก คำสั่งภายในบล็อกจะถูก execute ก็ต่อเมื่อเงื่อนไขเป็นจริง

awk '$7=="\$7.30" { print $3 }' table1.txt

ในกรณีนี้ เงื่อนไขคือ $7=="\$7.30" ซึ่งหมายถึง element ในคอลัมน์ที่ 7 เท่ากับ $7.30 backslash หน้าตัว $ ใช้เพื่อป้องกันไม่ให้ระบบตีความ $7 เป็นตัวแปร แต่นำตัว $ มันเองในความหมายตัวอักษร

ดังนั้น คำสั่ง awk นี้จะพิมพ์ element ที่คอลัมน์ที่ 3 ของแต่ละบรรทัดที่มี "$7.30" ในคอลัมน์ที่ 7

คุณยังสามารถใช้ regular expressions เป็นเงื่อนไขได้ ตัวอย่างเช่น:

awk '/30/ { print $3 }' table1.txt

สตริงระหว่างสอง slash ('/') คือ regular expression ในกรณีนี้คือแค่สตริง "30" หมายถึง หากบรรทัดใดมีสตริง "30" ระบบจะพิมพ์ element ที่คอลัมน์ที่ 3 ของบรรทัดนั้น Output ในตัวอย่างข้างต้นจะเป็น:

Timberlake,
Gaga,
Presley,

ทำการคำนวณใน AWK

หาก element ในตารางเป็นตัวเลข awk สามารถรันการคำนวณได้ ตัวอย่างเช่น:

awk '{ print ($2 * $3) + $7 }'

นอกจากตัวแปรที่เข้าถึง element ของแถวปัจจุบัน ($1, $2, เป็นต้น) ยังมีตัวแปร $0 ซึ่งหมายถึงแถวทั้งหมด (whole line) และตัวแปร NF ซึ่งเก็บจำนวนฟิลด์

คุณยังสามารถกำหนดตัวแปรใหม่ได้ ตัวอย่างเช่น:

awk '{ sum=0; for (col=1; col<=NF; col++) sum += $col; print sum; }'

นี่จะคำนวณและพิมพ์ผลรวมของ element ทั้งหมดของแต่ละแถว

คำสั่ง Awk มักถูกรวมกับคำสั่ง sed