Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Làm chủ awk trên Linux: Hướng dẫn thực tế với ví dụ thực tế

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!