Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ awk บน Linux: คู่มือปฏิบัติพร้อมตัวอย่างจริง

คู่มือนี้แสดงวิธีใช้คำสั่ง awk ใน Linux พร้อมตัวอย่างที่มีประโยชน์สำหรับทุกวัน

AWK เป็นเครื่องมือและภาษาสำหรับค้นหาและจัดการข้อความ มีให้ Linux Operating System

คำสั่ง awk และภาษาสคริปต์ที่เกี่ยวข้อง ค้นหาไฟล์สำหรับข้อความที่กำหนดโดย pattern และดำเนินการ action เฉพาะกับข้อความที่ตรงกับ pattern

awk เป็นเครื่องมือที่มีประโยชน์สำหรับดึงข้อมูลและสร้างรายงานจากไฟล์ข้อความขนาดใหญ่ หรือไฟล์ข้อความจำนวนมาก – เช่น ประมวลผล logs หรือ output จากอุปกรณ์บันทึกข้อมูลเช่น temperature probes ที่เก็บข้อมูลมานาน มันยังใช้ได้กับ output จาก database queries

ไม่ต้องติดตั้ง awk; มันควรมีอยู่ใน Linux System ของคุณแล้ว

awk Syntax

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

awk [PROGRAM] [INPUT FILES]

โปรดทราบว่า:

  • [PROGRAM] คือ search pattern และ actions ที่จะทำ – คือโปรแกรมที่คุณต้องการให้ awk รันบนไฟล์ที่ให้
    • สามารถส่งเป็นไฟล์ข้อความแทน inline ได้โดยใช้ตัวเลือก -f
  • [INPUT FILES] คือไฟล์ที่คุณต้องการให้ awk ทำงาน – อาจเป็นหลายไฟล์คั่นด้วยช่องว่าง หรือ path ไปยังไดเรกทอรี หรือ pattern ของไฟล์ที่ต้องการจับคู่
    • หากไม่ระบุ input files awk จะทำงานกับ piped output จากคำสั่งอื่น

awk Options

ตัวเลือกต่อไปนี้สามารถส่งให้คำสั่ง awk ได้:

-f program-fileProgram text อ่านจากไฟล์แทน command-line สามารถใช้ -f หลายตัวได้
-F valueตั้งค่า field separator FS เป็น value
-v var=valueกำหนด value ให้ program variable var

สำหรับตัวเลือกเฉพาะ implementation ของ awk เวอร์ชันของคุณ สามารถดู manual ได้โดยรัน:

man awk

Program Actions & Variables

โปรแกรมที่คุณส่งให้ awk จะกำหนดว่ามันจะทำอะไรกับไฟล์ข้อความที่คุณส่ง โปรแกรม awk มีรูปแบบดังนี้:

CONDITION { ACTION } CONDITION { ACTION } ...

โดย CONDITION คือ pattern ข้อความที่จะจับคู่ และ ACTION คือการกระทำกับข้อความที่ตรง คุณสามารถมี conditions และ actions ได้เท่าไหร่ก็ได้

Actions

Actions ที่ส่งเป็นคำสั่งที่รวม calculation, variables และการเรียกฟังก์ชัน ฟังก์ชัน built-in บางตัวขึ้นอยู่กับ implementation ดีกว่า check manual สำหรับตัวเหล่านี้

Records

awk โดยทั่วไปถือว่าแต่ละบรรทัดใหม่ในไฟล์ข้อความเป็น record เว้นแต่จะระบุอื่นไปผ่าน OPTIONS

Fields

awk ใช้ whitespace (spaces, tabs) แสดง fields ใน record เว้นแต่จะระบุอื่นไปผ่าน OPTIONS

Variables

awk มี built-in variables มากมาย ที่คุณใช้ได้โดยไม่ต้อง define เอง ครอบคลุมสถานการณ์ทั่วไป:

Variableความหมาย
$0แทน record ทั้งหมด
$1, $2, $3 …Field variables – เก็บข้อความ/ค่าสำหรับ text fields แต่ละตัวใน record
NR / Number of Recordsจำนวน input records ที่อ่านไปแล้วจากทุกไฟล์
FNR / File Number of Recordsจำนวน input records ที่อ่านไปแล้วในไฟล์ปัจจุบัน – reset เป็นศูนย์อัตโนมัติทุกครั้งที่เริ่มไฟล์ใหม่
NF / Number of Fieldsจำนวน fields ใน current input record – field สุดท้ายอ้างอิงได้ด้วย $NF, field ตัวก่อนสุด $(NF-1) ฯลฯ
FILENAMEชื่อไฟล์ input ปัจจุบัน
FS / Field Separatorตัวอักษรที่แยก fields ใน record default รวม space และ tab
RS / Record Separatorตัวอักษรที่แยก records ในไฟล์ default new line
OFS / Output Field Separatorตัวอักษรแยก fields ใน Awk output default single space
ORS / Output Record Separatorตัวอักษรแยก records ใน Awk output default new line
OFMT / Output ForMaTFormat สำหรับ numeric output default “%.6g”

ตัวอย่างการใช้งาน awk

สำหรับตัวอย่างเหล่านี้ เราจะทำงานบนไฟล์ข้อความเดี่ยวชื่อ flowers.txt ซึ่งมีข้อความดังนี้:

red rose yellow daffodil pink flamingo white rose blue iris white lily red peony yellow orchid purple foxglove

พิมพ์เนื้อหาไฟล์

คำสั่ง awk ต่อไปจะ output เนื้อหาไฟล์ไปที่เทอร์มินัลด้วยฟังก์ชัน print ของ awk:

awk '{print}' flowers.txt

พิมพ์จำนวน Records (บรรทัด) ในไฟล์

awk 'END { print NR }' sample.txt

ตัวอย่างนี้จะ output จำนวนบรรทัดในไฟล์:

9

ค้นหาข้อความในไฟล์ด้วย Regular Expressions

คำสั่งต่อไปจะ output บรรทัดในไฟล์ที่อธิบายเฉพาะประเภท rose:

awk '/rose/' flowers.txt

หมายเหตุ REGEX (Regular Expressions) syntax ใช้กำหนดข้อความที่ค้นหา

คำสั่งนี้จะ output:

red rose white rose

Regex เพิ่มเติม

awk '/^p/' flowers.txt

คำสั่งนี้จะ output เฉพาะ records เริ่มต้นด้วย p:

pink flamingo purple foxglove

การใช้ Field Variables

ด้วย field Variables คุณสามารถ output เฉพาะ field แรกสำหรับ records เริ่มต้นด้วย p:

awk '/^p/ {print $1;}' flowers.txt

ซึ่งจะ output:

pink purple

ประมวลผล Output จากโปรแกรมอื่น

คุณสามารถ pipe output จากโปรแกรม Linux shell อื่นๆ เข้า awk เพื่อประมวลผล ตัวอย่างนี้รับ output จาก ls -l ซึ่ง list เนื้อหา current directory และคืนค่า field 5th (ขนาดไฟล์):

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

ซึ่งจะ output ประมาณ:

3104 3072 224 256

…(ขึ้นอยู่กับจำนวนไฟล์ใน current directory และขนาด)

ใช้ Built-In Variables

awk '{print NR "-" $2 }' flowers.txt

คำสั่งนี้จะพิมพ์ current record number (หมายเลขบรรทัดไฟล์) ตามด้วย field ที่สอง – ชื่อดอกไม้:

1-red rose 2-yellow daffodil 3-pink flamingo 4-white rose 5-blue iris 6-white lily 7-red peony 8-yellow orchid 9-purple foxglove

รวม Actions

Conditions และ actions สามารถรวมกันด้วย && คำสั่งนี้จะพิมพ์ records ทั้งหมดที่ field แรกมีข้อความ red และ field ที่สองมี น้อยกว่า 5 ตัวอักษร:

awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt

หมายเหตุ:

  • ใช้ $NF เพื่อเข้าถึง field ที่สองเป็นทางเลือกแทน $2 – ได้เพราะมันคือ field สุดท้าย จึงเท่ากับ NF (Number of Fields)
  • ฟังก์ชัน length() ใช้คำนวณความยาวของ field

ดังนั้นคืนค่า record เดียวที่ตรงจากไฟล์ตัวอย่าง:

red rose

สรุป

awk ถูกรวมอยู่ใน Linux แทบทุกตัวเพราะเหตุผล – มันเป็น staple tool สำหรับค้นหาและประมวลผลข้อความ ซึ่งคุณสามารถใช้หา log entries ด่วนหากมีปัญหาในระบบ หรือประมวลผลข้อมูลที่จับได้สำหรับการวิจัย

หากคุณเคยพยายามทำอะไรมากกว่า simple find/replace บนชุดไฟล์ข้อความขนาดใหญ่ คุณจะรู้คุณค่าในการทำ replacements หรือ updates แบบเฉพาะเจาะจงไปยังข้อความทั้งหมดของคุณแบบโปรแกรมเมติก โดยไม่ต้องรัน find/replace แยกต่างหาก

ดู Linux Tips อื่นๆ ของเรา!