[Tips] Thao tác file với Awk cơ bản – ToiLaCoder

Awk được sử dụng để tìm kiếm và xử lý dữ liệu text. Awk có thể tìm kiếm trong một hoặc nhiều tệp đầu vào để xem liệu chúng có chứa các dòng khớp với pattern (mẫu) đã được chỉ định hay không, và sau đó có thể thực hiện các thao tác trên dữ liệu tìm được.

Bạn đang sử dụng UNIX/LINUX, bạn đang lay hoay không biết làm sao để thao tác với các file text trở nên hiệu quả hơn. Hôm nay, chúng ta sẽ cùng tim hiểu qua cách sử dụng cơ bản của AWK.

Tổng quan

Awk là một ngôn ngữ lập trình giúp dễ dành thao tác với dữ liệu có cấu trúc và tạo ra các bảng kết cả có định dạng. Awk là chữ viết tắt của tên các tác giả tạo ra nó: Aho, Weinberger, Kernighan.

Chủ yếu, awk được sử dụng để tìm kiếm và xử lý dữ liệu text. Awk có thể tìm kiếm trong một hoặc nhiều tệp đầu vào để xem liệu chúng có chứa các dòng khớp với pattern (mẫu) đã được chỉ định hay không, và sau đó có thể thực hiện các thao tác trên dữ liệu tìm được.

Một số tính năng chính của Awk:

  • Xem một tệp dữ liệu text giống như một bảng dữ liệu bao gồm các trường và nhiều bản ghi.
  • Có định nghĩa các biến, câu điều kiện và vòng lặp.
  • Có các toán tử số học và chuỗi.
  • Có thể tạo bảng kết quả theo định dạng mong muốn.

Cú pháp:

awk '/pattern1/ {Actions} /pattern2/ {Actions}' file

Awk đọc dữ liệu từ một file hoặc từ đầu vào có dạng chuẩn và trả ra kết quả đầu ra theo chuẩn của nó. Awk không làm việc với file không có dạng text

Cách thức hoạt động:

  1. Đọc file đầu vào theo từng dòng.
  2. Với dữ liệu mỗi dòng, tiến hành so khớp với các pattern, nếu thì thực hiện các action tương ứng.
  3. Nếu không khớp với bất kì pattern nào thì sẽ không thực hiện gì.
  4. Trong cú pháp awk, chỉ có thể khuyết một trong 2 thành phần: pattern hoặc action.
  5. Nếu không có pattern thì đều thực hiện action với mỗi dòng dữ liệu.
  6. Nếu không có action thì action mặc định là in tất cả dòng khớp ra màn hình.
  7. Tuy nhiên nếu trong câu lệnh awk, thành phần action trong dấu ngoặc nhọn { } được để trống thì không thực hiện thao tác nào trong action cả (kể cả action mặc định).
  8. Trong thành phần action có thể chứa nhiều action ngăn cách với nhau bới dấu chấm phẩy ;

Tiếp đến, chúng ta sẽ tạo một file text để sử dụng trong các ví dụ dưới đây

> cat employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000

1. Hành động mặc định

> awk ‘{print;}’ employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000

Ví dụ này không có thành phần pattern. Vì vậy action được áp dụng cho tất cả các dòng

2. In các dòng phù hợp với pattern

> awk ‘/Thomas/ /Randy/’ employee.txt
100 Thomas Manager Sales $5,000
500 Randy DBA Technology $6,000

Trong ví dụ trên, chúng ta in tất cả các dòng khớp với mẫu ‘Thomas’ và ‘Randy’
Câu lệnh trên không có thành phần action nên action mặc định là in ra màn hình.

3. Chỉ in những trường cụ thể

Awk có sử dụng biến như các ngôn ngữ lập trình khác.
Nó phân tách 1 bản ghi (dòng dữ liệu) bởi khoảng trắng (mặc định) và lưu giá trị vào các biến $n. Nếu dòng được phân tách thành 5 phần thì các giá trị sẽ được lưu lần lượt vào $1, $2, $3, $4, $5. Ngoài ra $0 sẽ lưu toàn bộ dòng, $NF lưu số lượng trường trong bản ghi, trong trường hợp này giá trị của $NF là 5.

> awk ‘{print $2,$5;}’ employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

> awk ‘{print $2,$NF;}’ employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

4. Hành động khởi tạo và kết thúc

Có 2 mẫu quan trọng được Awk định nghĩa sẵn với 2 từ khóa là BEGINEND.

Syntax:
BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }

# is for comments in Awk

Action được chỉ định bằng BEGIN sẽ được thực hiện trước khi đọc dòng dữ liệu từ đầu vào.
Action được chỉ định bằng END sẽ được thực hiện sau khi đã đọc và xử lý xong các dòng dữ liệu từ đầu vào.

> awk ‘BEGIN {print “Name\tDest\tDept\tSalary”;}
> {print $2, “\t”, $3, “\t”, $4, “\t”, $NF;}
> END {print “Done!\n”;}’ employee.txt

Name Dest Dept Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Done!

5. Thao tác với phép so sánh toán học

> awk ‘$1 >= 300’ employee.txt
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000

6. Thao tác với cú pháp điều kiện

Toán tử ~ được dùng để so sánh giá trị của một trường với một biểu thức chính quy, nếu khớp sẽ được in ra màn hình.

> awk ‘$4 ~ /Technology/’ employee.txt
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
500 Randy DBA Technology $6,000

7. Thao tác với phép tính toán học

> awk ‘BEGIN {count = 0;}
> $4 ~ /Technology/ {count++;}
> END {print “Count=”, count;}’ employee.txt

Count= 3

Tham khảo

https://www.thegeekstuff.com/2010/01/awk-introduction-tutorial-7-awk-print-examples/