Đị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ì:
cat /var/log/syslog
— đọc nội dung file.awk '{print $5}'
— lấy cột thứ năm (tên process).sort
— sắp xếp theo thứ tự bảng chữ cái.uniq -c
— đếm số lượng các dòng duy nhất.sort -nr
— sắp xếp các dòng theo giá trị số giảm dần.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!
GO TO FULL VERSION