Hướng dẫn này chỉ cách dùng lệnh awk trong Linux, với nhiều ví dụ hữu ích hàng ngày.
AWK là công cụ và ngôn ngữ tìm kiếm và thao tác văn bản trên Linux.
Lệnh awk và ngôn ngữ script liên quan tìm trong file văn bản khớp với pattern và thực hiện action cụ thể trên văn bản khớp.
awk hữu ích để trích xuất dữ liệu và xây dựng báo cáo từ file văn bản lớn hoặc nhiều file – ví dụ xử lý log, hoặc đầu ra thiết bị ghi dữ liệu như cảm biến nhiệt độ thu thập nhiều dữ liệu theo thời gian. Cũng dùng trên đầu ra truy vấn database.
Không cần cài awk; nó đã có sẵn trên hệ thống Linux.
Cú pháp awk
Cú pháp dùng lệnh awk trong terminal:
awk [CHUONG_TRINH] [FILE_DAU_VAO]
Lưu ý:
- [CHUONG_TRINH] là pattern tìm kiếm và hành động – chương trình bạn muốn awk chạy trên file cung cấp
- Cũng có thể cấp qua file text thay vì inline bằng tùy chọn -f
- [FILE_DAU_VAO] là file muốn awk xử lý – có thể nhiều file cách nhau dấu cách, hoặc đường dẫn thư mục, hoặc pattern file khớp
- Nếu không chỉ định file đầu vào, awk sẽ xử lý output piped từ lệnh khác
Tùy chọn awk
Các tùy chọn sau có thể cấp cho awk:
| Tùy chọn | Mô tả |
|---|---|
| -f program-file | Đọc chương trình từ file thay vì dòng lệnh. Chấp nhận nhiều -f. |
| -F gia_tri | Đặt field separator FS = gia_tri. |
| -v bien=gia_tri | Gán gia_tri cho biến chương trình bien. |
Xem manual để biết tùy chọn cụ thể cho phiên bản awk của bạn:
man awk
Hành động & Biến chương trình
Chương trình bạn cấp cho awk quyết định nó làm gì với file văn bản. Chương trình awk có dạng:
DIEU_KIEN { HANH_DONG } DIEU_KIEN { HANH_DONG } ... Trong đó DIEU_KIEN là pattern văn bản khớp, HANH_DONG là hành động trên văn bản khớp. Có bao nhiêu điều kiện/hành động tùy ý.
Hành động
Hành động là lệnh có thể bao gồm tính toán, biến, gọi hàm. Một số hàm built-in tùy implementation, xem manual.
Bản ghi (Records)
awk thường coi mỗi dòng mới trong file text là một record trừ khi chỉ định khác qua OPTIONS.
Trường (Fields)
awk dùng whitespace (space, tab) làm phân tách field trong record trừ khi chỉ định khác qua OPTIONS.
Biến
awk có nhiều biến built-in dùng được mà không cần tự định nghĩa, bao gồm các tình huống phổ biến:
| Biến | Ý nghĩa |
|---|---|
| $0 | Toàn bộ record |
| $1, $2, $3 … | Biến trường – giữ text/giá trị các field riêng lẻ trong record |
| NR / Number of Records | Số lượng record đầu vào đã đọc từ tất cả file cho đến nay |
| FNR / File Number of Records | Số record đã đọc trong file hiện tại – reset về 0 mỗi lần bắt đầu file mới |
| NF / Number of Fields | Số field trong record hiện tại – field cuối tham chiếu bằng $NF,倒数第二 $(NF-1), v.v. |
| FILENAME | Tên file đầu vào hiện tại |
| FS / Field Separator | Ký tự phân tách field trong record. Mặc định space và tab |
| RS / Record Separator | Ký tự phân tách record trong file. Mặc định xuống dòng |
| OFS / Output Field Separator | Ký tự phân tách field trong output awk. Mặc định space đơn |
| ORS / Output Record Separator | Ký tự phân tách record trong output awk. Mặc định xuống dòng |
| OFMT / Output ForMaT | Định dạng output số – mặc định “%.6g” |
Ví dụ dùng awk
Ví dụ dùng file flowers.txt với nội dung:
red rose yellow daffodil pink flamingo white rose blue iris white lily red peony yellow orchid purple foxglove
In nội dung file
awk '{print}' flowers.txt In số record (dòng) trong file
awk 'END { print NR }' sample.txt Kết quả:
9
Tìm kiếm text trong file dùng Regular Expression
Lệnh sau in dòng chỉ chứa loại rose:
awk '/rose/' flowers.txt
Lưu ý dùng cú pháp REGEX (Biểu thức chính quy) để định nghĩa text tìm.
Kết quả:
red rose white rose
Regex nâng cao
awk '/^p/' flowers.txt
Chỉ in record bắt đầu bằng p:
pink flamingo purple foxglove
Dùng biến trường (Field Variables)
Dùng biến trường, in chỉ field đầu cho record bắt đầu bằng p:
awk '/^p/ {print $1;}' flowers.txt Kết quả:
pink purple
Xử lý output từ chương trình khác
Có thể pipe output từ chương trình shell khác vào awk xử lý. Ví dụ lấy output ls -l (liệt kê thư mục hiện tại) trả về field 5 (kích thước file):
ls -l | awk '{print $5}' Kết quả dạng:
3104 3072 224 256
…(tùy số file và kích thước).
Dùng biến built-in
awk '{print NR "-" $2 }' flowers.txt In số record hiện tại (số dòng file) theo sau field 2 – tên hoa:
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
Kết hợp hành động
Điều kiện và hành động kết hợp bằng && Lệnh này in record field 1 chứa red VÀ field cuối có dưới 5 ký tự:
awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt Lưu ý:
- Dùng $NF lấy field cuối thay $2 – do là field cuối nên bằng NF (Số field)
- Hàm length() tính độ dài field
Trả về 1 record khớp từ file ví dụ:
red rose
Kết luận
awk có sẵn hầu như mọi Linux vì lý do – nó công cụ cốt lõi tìm kiếm và xử lý text, dùng tìm nhanh entry log khi sự cố hoặc xử lý dữ liệu nghiên cứu.
Nếu từng thử làm gì hơn find/replace đơn giản trên tập file text lớn, bạn biết giá trị của việc thay thế/cập nhật cụ thể tất cả text theo chương trình, không cần chạy find/replace riêng lẻ.
Xem thêm mẹo Linux khác!