Hướng dẫn sử dụng lệnh awk cơ bản trên Linux
Giới thiệu
awk là một ngôn ngữ kịch bản được sử dụng để thao tác dữ liệu và tạo báo cáo. Ngôn ngữ lập trình lệnh awk
không yêu cầu biên dịch và cho phép người dùng sử dụng các biến, hàm số, hàm chuỗi và toán tử logic.
awk chủ yếu được sử dụng để quét và xử lý mẫu. Nó tìm kiếm một hoặc nhiều tệp để xem liệu chúng có chứa các dòng phù hợp với các mẫu được chỉ định hay không và sau đó thực hiện các hành động liên quan.
awk được viết tắt từ tên của các nhà phát triển - Aho, Weinberger và Kernighan.
Cú pháp cơ bản
Lệnh awk
đã được cập nhât mặc định trong tất cả các hệ thống Linux hiện tại, vì vậy chúng ta không cần phải cài đặt nó để bắt đầu sử dụng.
Định dạng cơ bản của một lệnh awk
là:
Chú thích tham số lệnh awk
:
/search-patterm/
: Là nội dung mẫu tìm kiếm.action-to-take-on-matches
: Biểu thức xử lí nội dung.;
: Dấu kết thúc biểu thức xử lí nội dung.another-action
: Biểu thức xử lí nội dung khác.file-to-parse
: Là tên tệp hoăc đường dẫn đến tệp.
Chúng ta có thể làm được gì với lệnh awk
:
- Quét từng dòng tệp.
- Tách từng dòng đầu vào thành các trường.
- So sánh dòng / trường đầu vào với mẫu.
- Thực hiện các hành động trên các dòng phù hợp.
- Chuyển đổi tệp dữ liệu.
- Tạo báo cáo được định dạng.
- Định dạng dòng đầu ra.
- Phép toán số học và chuỗi.
- Điều kiện và vòng lặp.
- ...
Để hiểu hơn về awk
, bây giờ chúng ta hãy tạo một tệp mẫu hoadon.txt
có nội dung hiển thị là một hóa đơn bán hàng với danh sách là các loại quả bạn yêu thích với nội dung như sau:
Bây giờ, chúng ta hãy bắt đầu làm quen với awk
. Đầu tiên, chúng ta sử dụng lệnh awk
để in tệp hoadon.txt
vừa tạo ở trên ra màn hình với cú pháp như sau:
Hãy thử sử dụng lệnh awk
để tìm kiếm một chuỗi nào đó trong tệp bằng lệnh:
Tương tự, chúng ta cũng có thể sử dụng lệnh awk
để hiển thị nội dung chúng ta tìm kiếm trên một cột bất kì khi sử dụng lệnh sau:
Lệnh này sẽ thực hiện tìm kiếm dòng có chứa nội dung Xoài và in ra màn hình nội dung trường (cột) thứ thứ tư ($4) của dòng đó. Cho nên chúng ta nhìn thấy giá tiền của Xoài trong bảng hoadon.txt
Biến nội bộ và định dạng mở rộng
Lệnh awk
sử dụng một số biến nội bộ để gán một số phần thông tin nhất định khi nó xử lý một tệp.
FNR
: Tham chiếu số lượng bản ghi hiện tại so với tệp đầu vào hiện tại.FS
: Dấu phân tách trường (cột) hiện tại được sử dụng để biểu thị từng trường (cột) trong bản ghi. Theo mặc định, điều này được đặt thành khoảng trắng.NF
: Số trường (cột) trong bản ghi hiện tại.NR
: Số lượng bản ghi hiện tại.OFS
: Dấu tách trường cho dữ liệu đầu ra. Theo mặc định, điều này được đặt thành khoảng trắng.ORS
: Dấu phân tách bản ghi cho dữ liệu đầu ra. Theo mặc định, đây là một ký tự dòng mới.RS
: Dấu phân tách bản ghi dùng để phân biệt các bản ghi riêng biệt trong tệp đầu vào.
Biểu thức khởi tạo và kết thúc
Cú pháp awk
hơi phức tạp hơn những gì chúng ta đã sử dụng. Ngoài ra, còn có các khối tùy chọn BEGIN
và END
có thể chứa các lệnh để thực thi trước và sau khi xử lý tệp tương ứng.
Chú thích tham số lệnh awk
:
BEGIN
: Sẽ được thực thi trước khi đọc dòng đầu tiên từ dữ liệu nhập vào.END
: Sẽ được thực thi sau khi dòng lệnh cuối cùng hoàn thành./search/
: Nội dung bạn cần tìm kiếmaction
: Là biểu thức điều kiện hoặc hành động bạn muốn câu lệnh thực hiện.filename
: Là tên tệp hoặc đường dẫn đến tệp.
Ví dụ: Chúng ta hãy in thông tin thanh toán hóa đơn ở phần trước chúng ta tạo như sau:
Chú thích tham số lệnh awk
:
'BEGIN { print "HOA DON THANH TOAN"; }
: In ra màn hình nội dungHOA DON THANH TOAN
.{ s+=$5; }
: Biểu thức tính tổng tiền hóa đơn.END { print "Tong tien thanh toan la: " s; }
: In ra màn hình nội dungTong tien thanh toan la:
và tổng tiền của hóa đơn.
Một số ví dụ về lệnh awk
Để in ra nội dung trường (cột) đầu tiên của một tệp chúng ta dùng lệnh sau:
Chuyển đổi dữ liệu tệp thành bảng, bây giờ chúng ta hãy chuyển đổi dữ liệu tệp passwd
tại /etc/passwd
thành bảng bằng câu lệnh sau:
Như chúng ta đã thấy, sử dụng lệnh awk
có thể định dạng lại tệp passwd dưới dạng bảng khá dễ nhìn và đẹp hơn.
Sử dụng awk
để tìm kiếm tên loại trái cây chỉ khớp nội dung ở đầu cột thứ hai bằng cách sử dụng lệnh sau:
Chúng ta cũng có thể dễ dàng tìm kiếm những thứ không khớp với từ khóa tìm kiếm bằng cách thêm ký tự !
trước dấu ngã (~). Lệnh này sẽ trả về tất cả các dòng không có tên loại quả bắt đầu bằng “C” như sau:
Ngoài ra, chúng ta cũng có thể sử dụng biểu thức điều kiện để xử lí tệp đầu vào bằng cách:
Kết quả của câu lệnh này in ra dòng thứ 2 tại vì khi chúng ta chạy lệnh awk '$2 !~ /^C/ && $1 < 3' hoadon.txt
lệnh sẽ lọc tên và xóa dòng có trường (cột) Cam đi và tiếp tục so sánh biểu thức điều kiện thứ 2 là chỉ in ra những dòng bé hơn 3 cho nên kết quả in ra màn hình chúng ta nhận được là 2 Xoài 6 30000 180000
Kết luận
Như vậy, qua bài viết này chúng ta đã có thêm hiểu biết về lệnh awk
để thao tác, định dạng và in có chọn lọc các tệp văn bản và luồng văn bản. Tuy nhiên, awk
là một chủ đề lớn hơn nhiều và thực sự là một ngôn ngữ lập trình hoàn chỉnh với phép gán biến, cấu trúc điều khiển, hàm tích hợp và hơn thế nữa. Chúng ta có thể sử dụng nó trong các tập lệnh của riêng mình để định dạng văn bản theo cách chúng ta mong muốn.
Tính năng đang được phát triển