Awk Linux là lệnh được dùng để xử lý và phân tích các file văn bản. Lệnh này được thiết kế chuyên biệt để xử lý dữ liệu dạng cột, cho phép trích xuất cột, lọc theo điều kiện, tính toán và định dạng lại kết quả trên dòng lệnh với hiệu năng cao và cú pháp súc tích. Trong bài viết dưới đây, mình sẽ cùng bạn tìm hiểu về các tính năng quan trọng và cách sử dụng lệnh awk qua các ứng dụng thực tế.
Những điểm chính
- Khái niệm: Hiểu rõ khái niệm và nguyên lý vận hành của
awknhư một ngôn ngữ kịch bản mạnh mẽ để xử lý dữ liệu dòng và cột. - Tính năng nổi bật: Nắm được các khả năng cốt lõi như phân tách trường tự động, so khớp mẫu, tính toán số học và tạo báo cáo chuyên nghiệp.
- Cú pháp và nguyên tắc hoạt động: Thành thạo cách viết lệnh
awktrực tiếp hoặc qua file script, hiểu rõ khái niệm Record, Field và các biến tích hợp. - Các tùy chọn phổ biến: Có được bảng tra cứu nhanh các tùy chọn quan trọng để tối ưu hóa quy trình xử lý văn bản.
- Cách cài đặt awk trên Linux: Nắm rõ cách kiểm tra và cài đặt awk Linux,
- Các trường hợp sử dụng thực tế: Học cách áp dụng
awkvào các bài toán thực tế như trích xuất cột, xử lý logic điều kiện và tạo báo cáo xếp loại. - Câu hỏi thường gặp: Giải đáp các câu hỏi thường gặp liên quan đến lệnh awk trong Linux.
Lệnh awk Linux là gì?
Lệnh awk là lệnh được dùng để xử lý và phân tích các file văn bản. Ngoài ra, awk cũng được định nghĩa là một ngôn ngữ kịch bản được sử dụng cho việc thao tác dữ liệu cấu trúc và tạo lập báo cáo tự động trong môi trường Unix/Linux. Điểm mạnh của ngôn ngữ này là khả năng hoạt động theo cơ chế thông dịch trực tiếp, cho phép người dùng vận dụng linh hoạt các biến, toán tử logic cùng hệ thống hàm số học và chuỗi ký tự phức tạp mà không cần trải qua quá trình biên dịch mã nguồn.

Về nguyên lý vận hành, awk quét toàn bộ nội dung file đầu vào để tìm kiếm các đoạn văn bản khớp với mẫu đã định nghĩa, từ đó thực thi các hành động xử lý tương ứng trên từng dòng dữ liệu cụ thể. Tên gọi của awk không mang ý nghĩa tiếng Anh thông thường mà là từ viết tắt được ghép từ chữ cái đầu trong tên của ba nhà khoa học máy tính đã phát triển ra công cụ này là: Alfred Aho, Peter Weinberger và Brian Kernighan.
Tính năng của lệnh awk
Các tính năng quan trọng của lệnh awk là:
- Xử lý luồng dữ liệu tuần tự:
awktự động quét và đọc dữ liệu đầu vào theo cơ chế từng dòng một và không cần viết code mở file thủ công. - Phân tách trường dữ liệu tự động: Công cụ này có khả năng tự động chia nội dung mỗi dòng thành các trường (cột) riêng biệt dựa trên ký tự phân cách, giúp trích xuất dữ liệu dễ dàng.
- So khớp mẫu linh hoạt: Người dùng có thể so sánh các dòng hoặc từng trường dữ liệu với các biểu thức chính quy hoặc các điều kiện logic phức tạp.
- Thực thi hành động có điều kiện:
awkcho phép lập trình viên định nghĩa các khối lệnh cụ thể để chỉ xử lý những dòng dữ liệu thỏa mãn tiêu chí lọc nhất định. - Chuyển đổi cấu trúc dữ liệu:
awkhỗ trợ thay đổi cấu trúc file, sắp xếp lại thứ tự các cột hoặc sửa đổi nội dung để phù hợp với định dạng mong muốn. - Tổng hợp và tạo báo cáo: SysAdmin có thể sử dụng
awkđể trích xuất thông tin từ file log và tổng hợp thành các báo cáo thống kê chi tiết. - Định dạng đầu ra chuyên nghiệp: Lệnh
printftích hợp sẵn giúp căn chỉnh lề, định dạng số liệu và trình bày dữ liệu đầu ra một cách trực quan, dễ đọc. - Tính toán số học và xử lý chuỗi:
awkcung cấp đầy đủ các toán tử số học và các hàm thao tác chuỗi. - Kiểm soát luồng chương trình: Ngôn ngữ này hỗ trợ trọn bộ các cấu trúc điều khiển lập trình như
if,else,whilevàforđể giải quyết các bài toán logic phức tạp.

Cú pháp và nguyên tắc hoạt động của lệnh awk
awk có hai phương thức thực thi chính đó là trực tiếp trên dòng lệnh hoặc thông qua một file script.
- Cú pháp inline:
awk [options] 'program' file…Ví dụ: awk '{print}' file.txt- Cú pháp dùng program file:
awk [options] -f program-file file…Ví dụ: awk -f command.awk file.txtTìm hiểu mô hình Record và Field
Để sử dụng awk hiệu quả, việc hiểu rõ cách awk nhận diện dữ liệu là rất quan trọng.
- Record (Bản ghi): Mặc định,
awkxử lý dữ liệu theo từng dòng, mỗi dòng được coi là một record và được phân tách bởi ký tự xuống dòng. BiếnRSsẽ cho phép bạn thay đổi ký tự phân tách này. - Field (Trường): Mỗi record được chia thành các field, mặc định phân tách bởi khoảng trắng. Biến
FSsẽ cho phép bạn tùy chỉnh ký tự phân tách.

Các biến tích hợp quan trọng
$0: Đại diện cho toàn bộ nội dung của record hiện tại.$1,$2,…: Đại diện cho field thứ nhất, thứ hai,…$NF: Đại diện cho field cuối cùng trong record.NF: Chứa số lượng field trong record hiện tại.NR: Chứa số thứ tự của record hiện tại (số dòng).
Các tùy chọn phổ biến của lệnh awk
Dưới đây là danh sách các tham số dòng lệnh thường được sử dụng nhất để tối ưu hóa quy trình xử lý văn bản với awk:
| Tùy chọn | Chức năng |
| -F | Định nghĩa ký tự phân tách trường tùy chỉnh thay vì sử dụng khoảng trắng mặc định. |
| -f | Chỉ định đường dẫn tới file script chứa mã lệnh awk để thực thi thay vì phải viết mã lệnh trực tiếp trên dòng lệnh. |
| -v | Khởi tạo và gán giá trị cho một biến cụ thể trước khi chương trình bắt đầu quá trình xử lý dữ liệu. |
| –help | Xuất ra màn hình bảng hướng dẫn sử dụng nhanh, bao gồm cú pháp và danh sách các tham số hỗ trợ. |
| –version | Hiển thị thông tin chi tiết về phiên bản phần mềm awk đang được cài đặt trên hệ thống. |
Cách cài đặt awk trên Linux
Awk thông thường đã được tích hợp sẵn trong phần lớn bản phân phối GNU/Linux. Để kiểm tra xem hệ thống đã được cài đặt awk hay chưa, bạn hãy dùng lệnh which awk. Nếu lệnh này không trả về đường dẫn nào, bạn cần cài đặt AWK với cú pháp sau:
- Trên Debian/Ubuntu:
sudo apt-get update sudo apt-get install gawk- Trên CentOS/AlmaLinux/RHEL:
yum install gawkCác trường hợp sử dụng lệnh awk thực tế
Giả sử, bạn cần xét một file diem.txt chứa dữ liệu điểm số của học sinh, với các cột là Tên, Toán, Văn, Anh và Điểm trung bình.
Anh 9 8 7 8.0
Binh 7 8 8 7.7
Cuong 5 6 7 6.0
Dung 8 9 9 8.7
1. In toàn bộ nội dung
Bạn có thể sử dụng print để in ra toàn bộ record với cú pháp sau:
awk '{print}' diem.txtLệnh {print} khi không có tham số sẽ mặc định hiểu là print $0, do đó lệnh sẽ in ra toàn bộ dòng.

2. Trích xuất cột dữ liệu cụ thể
Để lấy ra tên học sinh (cột 1) và điểm trung bình (cột 4), bạn tham chiếu trực tiếp đến $1 và $4 với cú pháp lệnh sau:
awk '{print $1 "\t" $4}' diem.txtKết quả như sau:
Anh 8.0
Binh 7.7
Cuong 6.0
Dung 8.7"\t" được chèn vào giữa để tạo một ký tự tab, giúp định dạng đầu ra dễ đọc hơn.

3. Xử lý logic điều kiện với Program File
Giả sử, bạn cần xếp loại học lực dựa trên điểm trung bình (cột 4) với các tiêu chí:
- Giỏi: ĐTB >= 8
- Khá: 6.5 <= ĐTB < 8
- Trung bình: 5 <= ĐTB < 6.5
- Yếu: ĐTB < 5
Khi đó, bạn cần tạo một file xeploai.awk với nội dung logic như sau:
{
if ($4 >= 8) grade="Gioi"
else if ($4 >= 6.5) grade="Kha"
else if ($4 >= 5) grade="Trung binh"
else grade="Yeu"
print $0, "\t=> Xep loai:", grade
}
Sau đó, bạn thực thi lệnh awk bằng cách sử dụng cờ -f để gọi file script này:
awk -f xeploai.awk diem.txtKết quả:
Anh 9 8 7 8.0 => Xep loai: Gioi
Binh 7 8 8 7.7 => Xep loai: Kha
Cuong 5 6 7 6.0 => Xep loai: Trung binh
Dung 8 9 9 8.7 => Xep loai: Gioiawk đã đọc từng dòng của diem.txt, áp dụng khối lệnh if-else trong file xeploai.awk để xác định biến grade, sau đó in ra kết quả đã được bổ sung thông tin xếp loại.

Câu hỏi thường gặp
Sự khác biệt giữa awk, sed và grep là gì?
awk, sed và grep là ba công cụ xử lý văn bản được sử dụng phổ biến trên Linux, cụ thể:- grep: Dùng khi bạn chỉ cần tìm kiếm dòng khớp mẫu trong dữ liệu văn bản, thường dùng để lọc log, tìm chuỗi, hoặc kiểm tra sự xuất hiện của pattern.- sed: Cho phép thay thế, chèn, xóa, cắt bớt hoặc biến đổi nội dung ngay trong luồng dữ liệu, thường dùng cho các tác vụ Edit/Replace hàng loạt.
– awk: Là một ngôn ngữ kịch bản chuyên cho dữ liệu dạng dòng/cột, cho phép truy cập từng cột, áp dụng điều kiện, tính toán số học và tạo báo cáo.
Khối lệnh BEGIN và END trong AWK dùng để làm gì?
– BEGIN { ... }: Chạy trước khi dòng đầu tiên của file được đọc, thường dùng để khởi tạo biến hoặc in tiêu đề bảng.
– END { ... }: Chạy sau khi dòng cuối cùng đã được xử lý, thường dùng để in kết quả tổng kết.
Tôi muốn truyền biến từ bên ngoài vào trong awk thì làm sao?
Bạn không nên nhúng biến Bash trực tiếp vào trong dấu nháy đơn ' ' của awk vì rất dễ gây lỗi cú pháp. Thay vào đó, bạn hãy dùng cờ -v với cú pháp như sau:awk -v var_name="$BASH_VAR" …
Có thể dùng awk để lọc dữ liệu theo điều kiện if phức tạp không?
Hoàn toàn có thể dùng awk để lọc dữ liệu với các điều kiện if phức tạp. Công cụ này hỗ trợ đầy đủ toán tử so sánh, toán tử logic và cấu trúc điều khiển như if, else, while, for, nên rất phù hợp cho các biểu thức lọc nhiều điều kiện lồng nhau.
Awk Linux là một ngôn ngữ xử lý dữ liệu chuyên biệt và có khả năng thao tác linh hoạt trên từng trường dữ liệu. Việc sử dụng thành thạo awk sẽ giúp bạn tự động hóa nhiều tác vụ lặp lại, rút ngắn thời gian phân tích sự cố và từ đó nâng cao hiệu quả trong việc vận hành hệ thống. Chúc bạn thao tác thành công với awk và hẹn gặp lại trong các bài viết sau.




