Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Cách Viết Lệnh Và Script AWK Trong Linux

Lệnh awk là phương pháp mạnh mẽ để xử lý hoặc phân tích file văn bản. Đặc biệt, nó phân tích các file dữ liệu được tổ chức theo dòng (hàng) và cột. Các lệnh awk đơn giản có thể chạy từ dòng lệnh. Các tác vụ phức tạp hơn nên được viết dưới dạng chương trình awk (gọi là awk script) vào một file.

Cách Viết Lệnh Và Script AWK Trong Linux

Cơ Bản Về AWK

Định dạng cơ bản của một lệnh awk trông như sau:

awk 'pattern {action}' input-file > output-file

Điều này có nghĩa: lấy từng dòng của file đầu vào; nếu dòng chứa pattern, áp dụng action cho dòng đó và ghi dòng kết quả ra file đầu ra. Nếu pattern bị bỏ qua, action sẽ được áp dụng cho tất cả các dòng. Ví dụ:

awk '{ print $5 }' table1.txt > output1.txt

Câu lệnh trên lấy phần tử cột thứ 5 của mỗi dòng và ghi nó như một dòng trong file đầu ra "output1.txt". Biến '$4' tham chiếu đến cột thứ tư. Tương tự, bạn có thể truy cập cột thứ nhất, hai, ba với $1, $2, $3, v.v. Mặc định, các cột được giả định phân tách bằng khoảng trắng hoặc tab (gọi là white space). Vì vậy, nếu file đầu vào "table1.txt" chứa các dòng sau:

1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50

Thì lệnh sẽ ghi các dòng sau vào file đầu ra "output1.txt":

545,
723,
610,
118,
482,
335,
271,
373,

Nếu phân cách cột là thứ khác ngoài khoảng trắng hoặc tab, ví dụ dấu phẩy, bạn có thể chỉ định trong câu lệnh awk như sau:

awk -F, '{ print $3 }' table1.txt > output1.txt

Lệnh này sẽ chọn phần tử từ cột 3 của mỗi dòng nếu cột được coi là phân tách bằng dấu phẩy. Do đó, đầu ra trong trường hợp này sẽ là:

Title 545
Title 723
Title 610
Title 118
Title 482
Title 335
Title 271
Title 373

Biểu Thức Điều Kiện Trong AWK

Danh sách các câu lệnh bên trong ngoặc nhọn ('{','}') được gọi là một khối (block). Nếu bạn đặt một biểu thức điều kiện trước một khối, câu lệnh bên trong khối sẽ chỉ được thực thi nếu điều kiện đúng.

awk '$7=="$7.30" { print $3 }' table1.txt

Trong trường hợp này, điều kiện là $7=="$7.30", nghĩa là phần tử ở cột 7 bằng $7.30. Dấu gạch chéo ngược trước dấu dollar được dùng để ngăn hệ thống thông dịch $7 như một biến và thay vào đó lấy dấu dollar theo nghĩa đen.

Vì vậy, câu lệnh awk này in ra phần tử ở cột 3 của mỗi dòng có "$7.30" ở cột 7.

Bạn cũng có thể dùng biểu thức chính quy (regular expressions) làm điều kiện. Ví dụ:

awk '/30/ { print $3 }' table1.txt

Chuỗi giữa hai dấu gạch chéo ('/') là biểu thức chính quy. Trong trường hợp này, chỉ là chuỗi "30". Nghĩa là nếu một dòng chứa chuỗi "30", hệ thống sẽ in ra phần tử ở cột 3 của dòng đó. Đầu ra trong ví dụ trên sẽ là:

Timberlake,
Gaga,
Presley,

Thực Hiện Tính Toán Trong AWK

Nếu các phần tử bảng là số, awk có thể chạy phép tính trên chúng như trong ví dụ này:

awk '{ print ($2 * $3) + $7 }'

Ngoài các biến truy cập phần tử của hàng hiện tại ($1, $2, v.v.), có biến $0 tham chiếu đến toàn bộ hàng (dòng), và biến NF giữ số lượng trường (fields).

Bạn cũng có thể định nghĩa biến mới như trong ví dụ này:

awk '{ sum=0; for (col=1; col<=NF; col++) sum += $col; print sum; }'

Điều này tính và in tổng của tất cả các phần tử của mỗi hàng.