Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

วิธีใช้คำสั่ง awk ใน Linux [พร้อมตัวอย่าง]

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

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

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

อวก เป็นเครื่องมือที่มีประโยชน์สำหรับการดึงข้อมูลและสร้างรายงานจากไฟล์ข้อความขนาดใหญ่หรือไฟล์ข้อความจำนวนมาก เช่น บันทึกการประมวลผล หรือเอาต์พุตของอุปกรณ์บันทึกข้อมูล เช่น โพรบวัดอุณหภูมิ ซึ่งรวบรวมข้อมูลจำนวนมากในช่วงระยะเวลาหนึ่ง . นอกจากนี้ยังสามารถใช้กับผลลัพธ์จากการสืบค้นฐานข้อมูลได้

ไม่จำเป็นต้องติดตั้ง awk; ควรมีอยู่ในระบบ Linux ของคุณแล้ว

awk ไวยากรณ์

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

awk [PROGRAM] [INPUT FILES]

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

  • [โปรแกรม] คือรูปแบบการค้นหาและการดำเนินการ – เป็นโปรแกรมที่คุณต้องการให้ awk ทำงานบนไฟล์ที่ให้มา
    • ส่งเป็นไฟล์ข้อความแทนอินไลน์ได้โดยใช้ปุ่ม -f ตัวเลือก
  • [INPUT FILES] คือไฟล์ที่คุณต้องการให้ awk ทำงาน โดยอาจเป็นไฟล์หลายไฟล์ที่คั่นด้วยช่องว่าง หรือพาธไปยังไดเร็กทอรี หรือรูปแบบของไฟล์ที่จะจับคู่
    • หากไม่มีการระบุไฟล์อินพุต awk จะทำงานบนเอาต์พุตที่ไปป์จากคำสั่งอื่น

ตัวเลือก awk

อ็อพชันต่อไปนี้สามารถใช้ได้กับคำสั่ง awk:

-f โปรแกรมไฟล์ ข้อความโปรแกรมถูกอ่านจากไฟล์แทนที่จะอ่านจากบรรทัดคำสั่ง ยอมรับตัวเลือก -f หลายตัว
ค่า -F ตั้งค่าตัวคั่นฟิลด์ FS เป็นค่า
-v var=value กำหนดค่าให้กับตัวแปรโปรแกรม var.

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

man awk

การทำงานของโปรแกรมและตัวแปร

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

CONDITION { ACTION }
CONDITION { ACTION }
...

ที่ไหน สภาพ คือรูปแบบของข้อความให้ตรงกันและ ACTION คือการดำเนินการกับข้อความที่ตรงกัน คุณสามารถมีเงื่อนไขและการดำเนินการได้มากเท่าที่คุณต้องการ

การกระทำ

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

บันทึก

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

ฟิลด์

อวก จะใช้ช่องว่าง (ช่องว่าง แท็บ) เพื่อแสดงถึงช่อง ใน บันทึก เว้นแต่จะระบุไว้เป็นอย่างอื่นผ่าน OPTIONS .

ตัวแปร

อวก มีตัวแปรบิวท์อินมากมายที่คุณสามารถใช้ได้โดยไม่ต้องกำหนดเอง ซึ่งครอบคลุมสถานการณ์ทั่วไปบางประการ:

ตัวแปร ความหมาย
$0 แสดงถึงบันทึกทั้งหมด
$1, $2, $3 … ตัวแปรฟิลด์ – เก็บข้อความ/ค่าสำหรับฟิลด์ข้อความแต่ละรายการไว้ในบันทึก
NR / N จำนวน R บันทึก จำนวนบันทึกอินพุตที่อ่านจากไฟล์ทั้งหมดในปัจจุบัน
FNR / F ile N จำนวน R บันทึก จำนวนบันทึกอินพุตปัจจุบันที่อ่านในไฟล์ปัจจุบัน – รีเซ็ตเป็นศูนย์โดยอัตโนมัติทุกครั้งที่เริ่มไฟล์ใหม่
NF / ไม่มี จำนวน F ฟิลด์ จำนวนฟิลด์ในเร็กคอร์ดอินพุตปัจจุบัน – ฟิลด์สุดท้ายในเร็กคอร์ดสามารถอ้างอิงได้โดยใช้ $NF ฟิลด์ที่ 2 ถึงฟิลด์สุดท้ายโดยใช้ $(NF-1) เป็นต้น
FILENAME ชื่อของไฟล์อินพุตปัจจุบัน
FS / F ฟิลด์ S เครื่องแยกกาก อักขระที่ใช้แยกเขตข้อมูลในระเบียน โดยค่าเริ่มต้นจะรวมอักขระเว้นวรรคและแท็บ
RS / R บันทึก S เครื่องแยกกาก อักขระที่ใช้แยกระเบียนในไฟล์ ขึ้นบรรทัดใหม่โดยปริยาย
OFS / O เอาต์พุต F ฟิลด์ S เครื่องแยกกาก อักขระที่ใช้แยกฟิลด์ในเอาต์พุต Awk ค่าเริ่มต้นคือช่องว่างเดียว
ORS / O เอาต์พุต R บันทึก S เครื่องแยกกาก อักขระที่ใช้แยกฟิลด์ในเอาต์พุต Awk ค่าเริ่มต้นคือขึ้นบรรทัดใหม่
OFMT / O เอาต์พุต F หรือ รูปแบบสำหรับเอาต์พุตตัวเลข – รูปแบบเริ่มต้นคือ “%.6g”

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

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

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

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

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

awk '{print}' flowers.txt

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

awk 'END { print NR }' sample.txt

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

9

ค้นหาข้อความในไฟล์โดยใช้นิพจน์ทั่วไป

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

awk '/rose/' flowers.txt

โปรดทราบว่า REGEX ไวยากรณ์ (นิพจน์ทั่วไป) ใช้เพื่อกำหนดข้อความที่จะค้นหา

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

red rose
white rose

รีเจ็กซ์เพิ่มเติม

awk '/^p/' flowers.txt

คำสั่งนี้จะส่งออกเฉพาะระเบียนที่ขึ้นต้นด้วย p :

pink flamingo
purple foxglove

การใช้ตัวแปรฟิลด์

โดยใช้ ตัวแปรฟิลด์ คุณสามารถส่งออก เฉพาะช่องแรกสำหรับระเบียนที่ขึ้นต้นด้วย p :

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

ซึ่งจะส่งออก:

pink
purple

กำลังประมวลผลข้อมูลจากโปรแกรมอื่น

คุณสามารถไปป์ เอาต์พุตจากโปรแกรมเชลล์ Linux อื่นๆ ไปยัง awk สำหรับการประมวลผล ตัวอย่างนี้นำผลลัพธ์จาก ls -l คำสั่ง ซึ่งแสดงรายการเนื้อหาของไดเรกทอรีปัจจุบันและส่งคืนเนื้อหาของ 5 ฟิลด์ (ขนาดของไฟล์):

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

ซึ่งจะแสดงผลเช่น:

3104
3072
224
256

…(ขึ้นอยู่กับจำนวนไฟล์ในไดเร็กทอรีปัจจุบันและขนาดของไฟล์)

การใช้ตัวแปรบิวท์อิน

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

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

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

การรวมการกระทำ

เงื่อนไข และ การกระทำ สามารถรวมกันได้โดยใช้ && คำสั่งนี้จะพิมพ์ระเบียนทั้งหมดที่ช่องแรกมีข้อความ red และช่องที่ 2 มี น้อยกว่า 5 ตัวอักษร :

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

หมายเหตุ:

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

ดังนั้นจึงส่งกลับระเบียนที่ตรงกันเพียงรายการเดียวจากไฟล์ตัวอย่าง:

red rose

บทสรุป

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

หากคุณเคยพยายามทำอะไรที่มากกว่าการค้นหา/แทนที่ง่ายๆ ในคอลเล็กชันไฟล์ข้อความขนาดใหญ่ คุณจะทราบถึงคุณค่าของความสามารถในการเปลี่ยนหรืออัปเดตข้อความทั้งหมดของคุณแบบเป็นโปรแกรมโดยเฉพาะ โดยไม่ต้องเรียกใช้ คำสั่งค้นหา/แทนที่แต่ละรายการ

ดูเคล็ดลับ Linux อื่นๆ ของเรา!