Trong số nhiều công cụ xử lý văn bản có sẵn trên shell Linux, awk nổi bật vì sức mạnh và tính linh hoạt của nó. Được phát triển ban đầu vào những năm 1970 bởi Aho, Weinberger và Kernighan, awk không chỉ là một lệnh - mà là một ngôn ngữ lập trình hoàn chỉnh được thiết kế để xử lý và phân tích các tệp văn bản.
Lệnh này in trường đầu tiên của mỗi bản ghi (thường là từ đầu tiên của mỗi dòng) từ file.txt.
Tổng và giá trị trung bình của một cột
Lệnh này tính tổng và giá trị trung bình của các giá trị trong cột thứ hai của file.txt.
Lọc dựa trên điều kiện
Điều này hiển thị các dòng từ file.txt trong đó trường thứ ba lớn hơn 100.
Sử dụng tùy chọn -F theo sau là dấu phân cách mong muốn. Ví dụ: awk -F, '{print $2}' file.csv sẽ in trường thứ hai của tệp CSV.
Awk có thể xử lý nhiều tệp cùng một lúc không?
Có, awk có thể xử lý nhiều tệp theo trình tự. Sử dụng awk '{print}' file1.txt file2.txt để xử lý file1.txt và file2.txt theo trình tự.
Làm thế nào để tích hợp awk với các biến shell?
Bạn có thể truyền các biến shell cho awk bằng tùy chọn -v. Ví dụ: var="value"; awk -v awkVar="$var" '{print awkVar}' file.txt sẽ in giá trị của biến shell var cho mỗi dòng trong file.txt.
Có thể sửa đổi tệp tại chỗ bằng awk không?
Không, awk không hỗ trợ trực tiếp chỉnh sửa tại chỗ như sed -i. Tuy nhiên, bạn có thể thực hiện điều này bằng cách chuyển hướng đầu ra của awk sang tệp tạm thời rồi đổi tên thành tệp gốc.
Awk có thể được sử dụng để xử lý văn bản phức tạp không?
Hoàn toàn có thể. Mặc dù awk đơn giản đối với các tác vụ cơ bản, nhưng nó cũng đủ mạnh để xử lý văn bản phức tạp. Nó hỗ trợ mảng, hàm và biểu thức chính quy, khiến nó phù hợp với nhiều tác vụ thao tác văn bản khác nhau.
Lệnh awk
awk hoạt động trên các tệp và luồng dưới dạng một chuỗi các bản ghi và trường. Theo mặc định, một bản ghi được định nghĩa là một dòng và các trường được phân tách bằng khoảng trắng, mặc dù cả hai đều có thể được định nghĩa lại.Cú pháp cơ bản
Cú pháp cơ bản của awk là:
Mã:
awk 'pattern {action}' file
- Pattern: Chỉ định thời điểm hành động sẽ được thực hiện. Nếu bỏ qua, hành động sẽ áp dụng cho mọi dòng.
- Action: Một tập hợp các lệnh được thực hiện khi mẫu được khớp. Các hành động được đặt trong dấu ngoặc nhọn {}.
Ví dụ về awk
In cột đầu tiên của tệp
Mã:
awk '{print $1}' file.txt
Tổng và giá trị trung bình của một cột
Mã:
awk '{sum+=$2; count++} END {print "Sum =", sum; print "Average =", sum/count}' file.txt
Lọc dựa trên điều kiện
Mã:
awk '$3 > 100' file.txt
Câu hỏi thường gặp
Làm thế nào để thay đổi dấu phân cách trường trong awk?Sử dụng tùy chọn -F theo sau là dấu phân cách mong muốn. Ví dụ: awk -F, '{print $2}' file.csv sẽ in trường thứ hai của tệp CSV.
Awk có thể xử lý nhiều tệp cùng một lúc không?
Có, awk có thể xử lý nhiều tệp theo trình tự. Sử dụng awk '{print}' file1.txt file2.txt để xử lý file1.txt và file2.txt theo trình tự.
Làm thế nào để tích hợp awk với các biến shell?
Bạn có thể truyền các biến shell cho awk bằng tùy chọn -v. Ví dụ: var="value"; awk -v awkVar="$var" '{print awkVar}' file.txt sẽ in giá trị của biến shell var cho mỗi dòng trong file.txt.
Có thể sửa đổi tệp tại chỗ bằng awk không?
Không, awk không hỗ trợ trực tiếp chỉnh sửa tại chỗ như sed -i. Tuy nhiên, bạn có thể thực hiện điều này bằng cách chuyển hướng đầu ra của awk sang tệp tạm thời rồi đổi tên thành tệp gốc.
Awk có thể được sử dụng để xử lý văn bản phức tạp không?
Hoàn toàn có thể. Mặc dù awk đơn giản đối với các tác vụ cơ bản, nhưng nó cũng đủ mạnh để xử lý văn bản phức tạp. Nó hỗ trợ mảng, hàm và biểu thức chính quy, khiến nó phù hợp với nhiều tác vụ thao tác văn bản khác nhau.