BÀI VIẾT

Hướng dẫn sử dụng lệnh awk cơ bản trên Linux

10.2K
author Đặng Văn Chương - 2022-08-05 16:43:04 (GMT+7)

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à:

bash (non-root)
awk '/search-pattern/ { action-to-take-on-matches; another-action; }' file-to-parse

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:

hoadon.txt
STT     Fruit   Amount  Price   Total amount
1       Cam     5       6000    30000
2       Xoài    6       30000   180000
3       Bưởi    7       40000   280000
4       Kiwi    4       60000   240000
5       Mận     10      20000   200000

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:

bash (non-root)
awk '{print}' hoadon.txt
STT     Fruit   Amount  Price   Total amount
1       Cam     5       6000    30000
2       Xoài    6       30000   180000
3       Bưởi    7       40000   280000
4       Kiwi    4       60000   240000
5       Mận     10      20000   200000

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:

bash (non-root)
awk '/Kiwi/' hoadon.txt
Kết quả
4       Kiwi    4       60000   240000

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:

bash (non-root)
awk '/Xoài/ {print $4;}' hoadon.txt
Kết quả
30000

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 BEGINEND có thể chứa các lệnh để thực thi trước và sau khi xử lý tệp tương ứng.

bash (non-root)
awk 'BEGIN { action; } /search/ { action; } END { action; }' filename

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ếm
  • action: 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:

bash (non-root)
awk 'BEGIN {print "HOA DON THANH TOAN";} {s+=$5;} END {print "Tong tien thanh toan la: " s;}' hoadon.txt
Kết quả
HOA DON THANH TOAN
Tong tien thanh toan la: 930000

Chú thích tham số lệnh awk:

  • 'BEGIN { print "HOA DON THANH TOAN"; }: In ra màn hình nội dung HOA 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 dung Tong 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:

bash (non-root)
awk '{print $1;}' hoadon.txt
Kết quả
STT
1
2
3
4
5

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:

bash (non-root)
awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n"; } {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;} END { print "---------\nChuyen doi tep thanh cong" }' /etc/passwd
Kết quả
User            UID             GID             Home            Shell

root             0               0               /root           /bin/bash
daemon           1               1               /usr/sbin       /usr/sbin/nologin
bin              2               2               /bin            /usr/sbin/nologin
sys              3               3               /dev            /usr/sbin/nologin
sync             4               65534           /bin            /bin/sync
games            5               60              /usr/games      /usr/sbin/nologin
man              6               12              /var/cache/man  /usr/sbin/nologin
lp               7               7               /var/spool/lpd  /usr/sbin/nologin
mail             8               8               /var/mail       /usr/sb
...
---------
Chuyen doi tep thanh cong

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:

bash (non-root)
awk '$2 ~ /^K/' hoadon.txt
Kết quả
4       Kiwi    4       60000   240000

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:

bash (non-root)
awk '$2 !~ /^C/' hoadon.txt
Kết quả
STT     Fruit   Amount  Price   Total
2       Xoài    6       30000   180000
3       Bưởi    7       40000   280000
4       Kiwi    4       60000   240000
5       Mận     10      20000   200000

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:

bash (non-root)
awk '$2 !~ /^C/ && $1 < 3' hoadon.txt
Kết quả
2       Xoài    6       30000   180000

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.


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Lệnh xác định vị trí của tệp hoặc thư mục trên Linux
Lệnh xác định vị trí của tệp hoặc thư mục trên Linux
Lệnh kiểm tra nhiều cổng port đang mở của một tên miền trên Linux
Lệnh kiểm tra nhiều cổng port đang mở của một tên miền trên Linux
Lệnh tạo một dãy số tăng dần trên Linux
Lệnh tạo một dãy số tăng dần trên Linux

Object Storage

Chuẩn S3, không giới hạn băng thông

Object Storage

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận