CodeGym /Các khóa học /Docker SELF /Định dạng dữ liệu bằng cách sử dụng `awk`

Định dạng dữ liệu bằng cách sử dụng `awk`

Docker SELF
Mức độ , Bài học
Có sẵn

Định dạng dữ liệu bằng cách sử dụng awk

1. Làm quen với awk

awk — một tiện ích văn bản mạnh mẽ để xử lý dữ liệu. Hãy tưởng tượng tệp văn bản giống như một bảng, trong đó các dòng là các dòng (rõ ràng rồi), còn các cột là dữ liệu được phân tách bằng khoảng trắng, thì awk trở thành người bạn thân thiết của chúng ta. Nó giúp chọn cột nhanh chóng, lọc dòng, định dạng dữ liệu và thậm chí thực hiện các phép toán số học.

Được đặt tên theo các tác giả của nó — Alfred Aho, Peter Weinberger và Brian Kernighan (đúng rồi, chính người này cũng tham gia tạo ra ngôn ngữ C).

Khái niệm chính của awk là xử lý dữ liệu bằng cách sử dụng mẫu và hành động, điều này khiến nó giống như một ngôn ngữ lập trình mini.

Cú pháp của awk

Cú pháp cơ bản của lệnh trông như sau:

awk 'mẫu {hành động}' tệp
  • mẫu — điều kiện được kiểm tra cho mỗi dòng của tệp.
  • hành động — các thao tác được thực hiện trên các dòng phù hợp với mẫu.
  • Nếu không có mẫu, hành động sẽ thực hiện cho mỗi dòng.

Ví dụ:

awk '{print $1}' data.txt

Lệnh này sẽ in cột đầu tiên ($1) cho mỗi dòng của tệp data.txt.


2. Các tính năng cơ bản của awk

1. Chọn cột

Cách sử dụng đơn giản nhất của awk là chọn một hoặc nhiều cột từ file. Trường được biểu thị dưới dạng $n, trong đó n là số thứ tự của cột, bắt đầu từ 1.

Ví dụ:

Hiển thị cột thứ nhất và thứ ba:

awk '{print $1, $3}' data.txt

Giả sử file data.txt của chúng ta trông như sau:

John 25 Engineer
Jane 30 Designer
Mike 28 Developer

Kết quả:

John Engineer
Jane Designer
Mike Developer

2. Xử lý dòng có điều kiện

Điều kiện cho phép xử lý chỉ những dòng thỏa mãn các tiêu chí nhất định.

Ví dụ:

Hiển thị các dòng, trong đó giá trị ở cột thứ hai lớn hơn 27:

awk '$2 > 27 {print $1, $2}' data.txt

Kết quả:

Jane 30
Mike 28

3. Phép toán số học

awk có thể thực hiện các phép toán số học. Điều này rất hữu ích khi bạn cần tính toán điều gì đó ngay lập tức.

Ví dụ:

Thêm 10 vào giá trị ở cột thứ hai:

awk '{print $1, $2+10}' data.txt

Kết quả:

John 35
Jane 40
Mike 38

4. Đếm số dòng

awk tự động biết số lượng dòng đã được xử lý. Thông tin này được lưu trong biến NR (Number of Records).

Ví dụ:

Đếm số lượng dòng trong file:

awk 'END {print NR}' data.txt

Kết quả:

3

3. Khả năng nâng cao

1. Định dạng đầu ra

awk hỗ trợ đầu ra định dạng mạnh mẽ với việc sử dụng hàm printf. Đây là tương tự như hàm printf trong C.

Ví dụ:

In dữ liệu với căn chỉnh:

awk '{printf "%-10s %-5s %-10s\n", $1, $2, $3}' data.txt

Kết quả:

John       25    Engineer  
Jane       30    Designer  
Mike       28    Developer 

2. Biến

Bạn có thể sử dụng biến để lưu trữ dữ liệu và làm đơn giản hóa công việc.

Ví dụ:

Tính tổng cột thứ hai:

awk '{sum += $2} END {print "Tổng tuổi:", sum}' data.txt

Kết quả:

Tổng tuổi: 83

3. Biểu thức chính quy

awk hỗ trợ biểu thức chính quy để tìm kiếm dòng.

Ví dụ:

In các dòng, nơi cột đầu tiên có chữ cái J:

awk '/J/ {print $0}' data.txt

Kết quả:

John 25 Engineer
Jane 30 Designer

4. Ví dụ thực hành

1. Phân tích nhật ký hệ thống

Giả sử chúng ta có một file log hệ thống /var/log/syslog, và mình muốn biết những process nào được nhắc đến nhiều nhất.

Lệnh:

cat /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | head -10

Lệnh này làm gì:

  1. cat /var/log/syslog — đọc nội dung file.
  2. awk '{print $5}' — lấy cột thứ năm (tên process).
  3. sort — sắp xếp theo thứ tự bảng chữ cái.
  4. uniq -c — đếm số lượng các dòng duy nhất.
  5. sort -nr — sắp xếp các dòng theo giá trị số giảm dần.
  6. head -10 — hiển thị top-10 process.

2. Chuẩn bị báo cáo lương

Chúng ta có file salaries.txt:

John 25 4000
Jane 30 5000
Mike 28 4500

Nhiệm vụ:

Tăng lương lên 10% và hiển thị báo cáo cuối cùng.

Giải pháp:

awk '{new_salary = $3 * 1.1; printf "%-10s %-5s %-10.2f\n", $1, $2, new_salary}' salaries.txt

Kết quả:

John       25    4400.00
Jane       30    5500.00
Mike       28    4950.00

5. Các lỗi thường gặp khi làm việc với awk

Vấn đề với delimiters

Mặc định, awk sử dụng dấu cách hoặc tab làm delimiters. Nếu dữ liệu của bạn được phân cách bằng thứ khác (ví dụ, dấu phẩy hoặc dấu hai chấm), bạn cần chỉ định điều đó bằng tùy chọn -F.

Ví dụ:

File data.csv:

John,25,Engineer
Jane,30,Designer
Mike,28,Developer

Lệnh để làm việc với CSV:

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

Kết quả:

John Engineer
Jane Designer
Mike Developer

Bỏ qua các trường do định dạng sai

Đôi khi, các dòng có thể chứa các dấu cách không mong muốn hoặc các cột bị thiếu. Điều này có thể gây ra lỗi. Luôn luôn kiểm tra dữ liệu trước khi bắt đầu làm việc.

Ứng dụng thực tế

Bạn vừa học cách sử dụng awk để phân tích log hệ thống, xử lý dữ liệu lương và tạo báo cáo. Những kỹ năng này sẽ giúp bạn làm việc với các cơ sở dữ liệu lớn, file CSV và log trong các dự án thực tế. Nếu bạn làm việc trong DevOps, phân tích log hệ thống bằng awk sẽ là siêu năng lực của bạn. Còn nếu bạn là lập trình viên, đây là cách tuyệt vời để thao tác nhanh chóng với dữ liệu ngay trong terminal.

Để tìm hiểu sâu hơn về awk, mình khuyên bạn nên xem qua tài liệu chính thức của GNU Awk. Bây giờ bạn đã thực sự biết cách khiến dữ liệu của mình tuân theo ý mình rồi đấy!

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION