Bash / awk хуваарилагч

awk хуваарилагч

awk бол түүнийг бүтээсэн Aho, Weinberger, Kernighan нарын нэрийн эхний үсгүүдийг нэгтгэсэн нэр юм. grep нь мөр олдог, sed нь текст солидог бол awk нь баганаар ажилладаг — CSV, лог файл, тайлан боловсруулахад гайхалтай.

awk хэрхэн ажилладаг вэ?

awk нь файлын мөр бүрийг уншиж, хоосон зайгаар баганад хуваадаг. $1 нь эхний багана, $2 нь хоёрдугаар багана, $NF нь хамгийн сүүлийн багана, $0 нь бүх мөр.

bash
# Хоосон зайгаар хуваасан эхний баганыг харуулах
echo "Батболд 25 Улаанбаатар" | awk '{print $1}'
# Батболд

# Хоёрдугаар баганыг харуулах
echo "Батболд 25 Улаанбаатар" | awk '{print $2}'
# 25

# Эхний ба гуравдугаар баганыг харуулах
echo "Батболд 25 Улаанбаатар" | awk '{print $1, $3}'
# Батболд Улаанбаатар

Файлтай ажиллах

employees.txt файл:

код
Батболд  Програмист  2500000
Оюун     Дизайнер    2200000
Мөнхбат  Менежер     3000000
Энхбаяр  Програмист  2700000
bash
# Зөвхөн нэрийг харуулах
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 файлд таслалаар хувааж болно:

bash
# -F тугтай тусгаарлагчийг заана
awk -F',' '{print $1}' data.csv

# Жишээ CSV файл:
# 001,Батболд,батболд@mail.com,2500000
awk -F',' '{print "Нэр:", $2, "  Цалин:", $4}' data.csv

Гаралт:

код
Нэр: Батболд   Цалин: 2500000

Тооцоо хийх

awk хувьсагч ба тооцоо дэмждэг:

bash
# Нийт цалинг тооцох
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

Практик жишээнүүд

Бодит амьдрал дээрх хэрэглээ:

bash
#!/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
bash
# 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 командыг судална — файл системд нөхцөлөөр хайх, олдсон файлуудтай ажиллах хүчирхэг хэрэгсэл.