Lệnh awk là một phương pháp mạnh mẽ để xử lý hoặc phân tích các tệp văn bản. Đặc biệt, nó phân tích các tệp dữ liệu được sắp xếp theo dòng (hàng) và cột. Các lệnh awk đơn giản có thể được 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 (được gọi là tập lệnh awk) vào một tệp.
Kiến thức cơ bản về AWK
Định dạng cơ bản của lệnh awk trông như sau:
awk 'pattern {action}' input-file > output-file
Điều này có nghĩa là:lấy từng dòng của tệp đầu vào; nếu dòng chứa mẫu, hãy áp dụng hành động cho dòng và ghi dòng kết quả vào tệp đầu ra. Nếu mẫu bị bỏ qua, hành động 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ủa cột thứ 5 của mỗi dòng và viết nó thành một dòng trong tệp đầu ra "output.txt." Biến '$ 4' đề cập đến cột thứ tư. Tương tự, bạn có thể truy cập cột thứ nhất, thứ hai và thứ ba, với $ 1, $ 2, $ 3, v.v. Theo mặc định, các cột được giả định là được phân tách bằng dấu cách hoặc tab (được gọi là khoảng trắng). Vì vậy, nếu tệp đầ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
Sau đó, lệnh sẽ ghi các dòng sau vào tệp đầu ra "output1.txt":
545,
723,
610,
118,
482,
335,
271,
373,
Nếu dấu phân tách cột không phải là dấu cách hoặc tab, chẳng hạn như dấu phẩy, bạn có thể chỉ định điều đó trong câu lệnh awk như sau:
awk -F, '{ print $3 }' table1.txt > output1.txt
Thao tác này sẽ chọn phần tử từ cột 3 của mỗi dòng nếu các 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 có điều kiện trong AWK
Danh sách các câu lệnh bên trong dấu ngoặc nhọn ('{', '}') được gọi là một khối. 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 là đúng.
awk '$7=="\$7.30" { print $3 }' table1.txt
Trong trường hợp này, điều kiện là $ 7 =="\ $ 7.30", có nghĩa là phần tử trong cột 7 bằng $ 7,30. Dấu gạch chéo ngược phía trước ký hiệu đô la được sử dụng để ngăn hệ thống hiểu 7 đô la là một biến và thay vào đó sử dụng ký hiệu đô la theo nghĩa đen.
Vì vậy, câu lệnh awk này in ra phần tử ở cột thứ 3 của mỗi dòng có "$ 7,30" trong cột 7.
Bạn cũng có thể sử dụng biểu thức chính quy 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, nó chỉ là chuỗi "30." Điều này có 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 thứ 3 của dòng đó. Kết quả trong ví dụ trên sẽ là:
Timberlake,
Gaga,
Presley,
Thực hiện các phép tính trong AWK
Nếu các phần tử của bảng là số, awk có thể chạy các phép tính trên chúng như trong ví dụ sau:
awk '{ print ($2 * $3) + $7 }'
Bên cạnh các biến truy cập các phần tử của hàng hiện tại ($ 1, $ 2, v.v.), còn có biến $ 0 đề cập đến hàng hoàn chỉnh (dòng) và biến NF chứa số trường.
Bạn cũng có thể xác định các 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 sẽ tính toán và in ra tổng của tất cả các phần tử của mỗi hàng.
Các câu lệnh awk thường được kết hợp với các lệnh sed.