Lệnh awk trong Linux là một công cụ mạnh mẽ được sử dụng để xử lý và phân tích dữ liệu văn bản theo dòng, cột hoặc điều kiện cụ thể. Nó có thể đọc, chỉnh sửa, lọc, và định dạng dữ liệu từ các tệp văn bản hoặc từ các đầu vào khác. awk được tích hợp sẵn trong hầu hết các hệ điều hành dựa trên Unix, bao gồm Linux, và thường được sử dụng trong các tập lệnh shell để tự động hóa các tác vụ xử lý dữ liệu.

Dưới đây là các phần quan trọng khi sử dụng lệnh awk:

Cấu trúc cơ bản của lệnh awk

awk 'pattern {action}' filename
  • pattern: Đây là điều kiện hoặc mẫu mà awk sẽ tìm kiếm trong dữ liệu. Nếu điều kiện là đúng, awk sẽ thực hiện action.
  • action: Đây là hành động awk thực hiện khi mẫu phù hợp được tìm thấy. Nó có thể là in dữ liệu, tính toán, hoặc thao tác với các trường.
  • filename: Tên tệp mà awk sẽ đọc để xử lý dữ liệu.

Ví dụ đơn giản

In toàn bộ nội dung của một tệp

awk '{print}' file.txt
  • {print}: In ra toàn bộ các dòng trong tệp file.txt.

In cột cụ thể từ tệp

Ví dụ, nếu có tệp data.txt chứa:

John 25 Jane 30 Doe 40

Lệnh awk dưới đây sẽ in ra cột thứ nhất (tên):

awk '{print $1}' data.txt
  • $1: Đại diện cho cột đầu tiên.
  • $2: Sẽ đại diện cho cột thứ hai, $3 cho cột thứ ba, và cứ thế.

Kết quả:

John
Jane
Doe

Tìm kiếm và lọc dữ liệu

Giả sử bạn muốn tìm những dòng có chứa tên “John”:

awk '/John/ {print}' data.txt

Các thao tác phổ biến với awk

Tính tổng giá trị của một cột

Ví dụ, nếu bạn có một tệp với các số và bạn muốn tính tổng giá trị của cột thứ hai:

awk '{sum += $2} END {print sum}' data.txt
 95

Đếm số dòng

Để đếm tổng số dòng trong một tệp:

awk 'END {print NR}' data.txt
  • NR: Biến tích hợp của awk đại diện cho số dòng hiện tại.

Điều kiện với if

Bạn có thể sử dụng if trong awk để thực hiện các hành động điều kiện. Ví dụ, in ra những người có độ tuổi lớn hơn 30:

awk '{if ($2 > 30) print $1, $2}' data.txt
Doe 40

Biến tích hợp trong awk

  • NR: Số dòng hiện tại.
  • NF: Số trường (cột) trong dòng hiện tại.
  • FS: Ký tự phân cách các trường (mặc định là dấu cách hoặc tab).
  • OFS: Ký tự phân cách đầu ra giữa các trường (mặc định là dấu cách).
  • RS: Ký tự phân cách dòng (mặc định là dòng mới).

Cách thay đổi ký tự phân cách

Mặc định, awk sử dụng dấu cách hoặc tab làm ký tự phân cách giữa các cột. Tuy nhiên, bạn có thể thay đổi điều này bằng cách chỉ định ký tự phân cách khác với tùy chọn -F.

Ví dụ, xử lý tệp CSV có dấu phẩy làm ký tự phân cách:

awk -F ',' '{print $1, $2}' data.csv

Một số ví dụ nâng cao

In những dòng có độ dài hơn 30 ký tự

awk 'length($0) > 30' file.txt
  • length($0): Đo độ dài của dòng hiện tại.

Tính giá trị trung bình của cột

awk '{sum += $2; count += 1} END {print sum/count}' data.txt
  • Tính tổng các giá trị trong cột thứ hai và sau đó chia cho số dòng để lấy giá trị trung bình.

Kết luận

Lệnh awk rất hữu ích trong các tác vụ xử lý dữ liệu văn bản phức tạp, giúp bạn thực hiện mọi thứ từ in đơn giản đến các phép tính toán học và điều kiện phức tạp. awk đặc biệt mạnh mẽ khi làm việc với các tệp có cấu trúc hoặc khi cần phân tích và xử lý các tệp log, dữ liệu CSV, hay các tệp văn bản khác.