awk хуваарилагч
awk бол түүнийг бүтээсэн Aho, Weinberger, Kernighan нарын нэрийн эхний үсгүүдийг нэгтгэсэн нэр юм. grep нь мөр олдог, sed нь текст солидог бол awk нь баганаар ажилладаг — CSV, лог файл, тайлан боловсруулахад гайхалтай.
awk хэрхэн ажилладаг вэ?
awk нь файлын мөр бүрийг уншиж, хоосон зайгаар баганад хуваадаг. $1 нь эхний багана, $2 нь хоёрдугаар багана, $NF нь хамгийн сүүлийн багана, $0 нь бүх мөр.
# Хоосон зайгаар хуваасан эхний баганыг харуулах
echo "Батболд 25 Улаанбаатар" | awk '{print $1}'
# Батболд
# Хоёрдугаар баганыг харуулах
echo "Батболд 25 Улаанбаатар" | awk '{print $2}'
# 25
# Эхний ба гуравдугаар баганыг харуулах
echo "Батболд 25 Улаанбаатар" | awk '{print $1, $3}'
# Батболд Улаанбаатар
Файлтай ажиллах
employees.txt файл:
Батболд Програмист 2500000
Оюун Дизайнер 2200000
Мөнхбат Менежер 3000000
Энхбаяр Програмист 2700000
# Зөвхөн нэрийг харуулах
awk '{print $1}' employees.txt
# Нэр ба цалинг харуулах
awk '{print $1, $3}' employees.txt
# Програмистуудыг шүүж харуулах
awk '$2 == "Програмист" {print $0}' employees.txt
# Цалин 2,500,000-с их байвал харуулах
awk '$3 > 2500000 {print $1, "цалин:", $3}' employees.txt
Тусгаарлагч өөрчлөх
Анхдагч байдлаар awk хоосон зайгаар хуваадаг. CSV файлд таслалаар хувааж болно:
# -F тугтай тусгаарлагчийг заана
awk -F',' '{print $1}' data.csv
# Жишээ CSV файл:
# 001,Батболд,батболд@mail.com,2500000
awk -F',' '{print "Нэр:", $2, " Цалин:", $4}' data.csv
Гаралт:
Нэр: Батболд Цалин: 2500000
Тооцоо хийх
awk хувьсагч ба тооцоо дэмждэг:
# Нийт цалинг тооцох
awk '{sum += $3} END {print "Нийт цалин:", sum}' employees.txt
# Дундаж цалин
awk '{sum += $3; count++} END {print "Дундаж цалин:", sum/count}' employees.txt
# BEGIN блок — файл уншихаас өмнө ажиллана
# END блок — файл дуусахад ажиллана
awk 'BEGIN {print "=== Тайлан ==="} {print $1, $3} END {print "=== Дууслаа ==="}' employees.txt
Практик жишээнүүд
Бодит амьдрал дээрх хэрэглээ:
#!/bin/bash
# Лог файлаас HTTP 500 алдааны IP хаягуудыг олж тоолох
# Лог format: 192.168.1.1 - - [дата] "GET /path HTTP/1.1" 500 1234
echo "=== HTTP 500 алдааны тайлан ==="
awk '$9 == 500 {count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log | sort -k2 -rn | head -10
# CSV файлаас хамгийн өндөр цалинтай 3 хүнийг олох
awk -F',' 'NR > 1 {print $4, $2}' employees.csv | sort -rn | head -3
# Файлын мөр бүрт дугаар нэмэх
awk '{print NR". "$0}' notes.txt
# 1. Эхний мөр
# 2. Хоёрдугаар мөр
# Хоосон мөрүүдийг алгасаж харуулах
awk 'NF > 0' text.txt
NR нь одоогийн мөрийн дугаар, NF нь одоогийн мөрийн баганын тоо. Эдгээр нь awk-н суурь хувьсагчид юм.
awk нь grep ба sed-тэй хамт pipe дамжуулан хэрэглэхэд хамгийн хүчирхэг болдог. Эдгээр гурвыг эзэмшсэн хүн командын мөрөөс аливаа текст боловсруулах ажлыг хэдхэн секундэд шийдэж чаддаг.
Дараагийн хичээлд:
find командыг судална — файл системд нөхцөлөөр хайх, олдсон файлуудтай ажиллах хүчирхэг хэрэгсэл.