
Đây là bài viết đầu tiên trong loạt bài hướng dẫn awk mới. Chúng tôi sẽ đăng một số bài viết về awk trong những tuần tới đề cập đến tất cả các tính năng của awk kèm theo các ví dụ thực tế.
Trong bài viết này, chúng ta hãy xem xét phương pháp làm việc awk cơ bản cùng với 7 ví dụ in awk thực tế.
Lưu ý: Hãy nhớ xem lại Chuỗi hướng dẫn Sed trước đây của chúng tôi.
Giới thiệu và thao tác in Awk
Awk là ngôn ngữ lập trình cho phép dễ dàng thao tác dữ liệu có cấu trúc và tạo báo cáo được định dạng. Awk là viết tắt của tên các tác giả của nó “A ồ, W einberger và K ernighan”
Awk chủ yếu được sử dụng để quét và xử lý mẫu. Nó tìm kiếm một hoặc nhiều tệp để xem liệu chúng có chứa các dòng khớp với các mẫu đã chỉ định hay không và sau đó thực hiện các hành động liên quan.
Một số tính năng chính của Awk là:
- Awk xem tệp văn bản dưới dạng bản ghi và trường.
- Giống như ngôn ngữ lập trình thông thường, Awk có các biến, điều kiện và vòng lặp
- Awk có các toán tử số học và chuỗi.
- Awk có thể tạo báo cáo được định dạng
Awk đọc từ một tệp hoặc từ đầu vào tiêu chuẩn của nó và xuất ra đầu ra tiêu chuẩn của nó. Awk không hoạt động tốt với các tệp không phải văn bản.
Syntax:
awk '/search pattern1/ {Actions}
/search pattern2/ {Actions}' file Trong cú pháp awk ở trên:
- mẫu tìm kiếm là một biểu thức chính quy.
- Hành động – (các) câu lệnh sẽ được thực hiện.
- Có thể thực hiện một số mẫu và hành động trong Awk.
- file – Tệp đầu vào.
- Dấu ngoặc đơn xung quanh chương trình là để tránh shell không diễn giải bất kỳ ký tự đặc biệt nào của nó.
Phương pháp làm việc Awk
- Awk đọc từng dòng một tệp đầu vào.
- Đối với mỗi dòng, nó khớp với mẫu đã cho theo thứ tự nhất định, nếu khớp sẽ thực hiện hành động tương ứng.
- Nếu không có mẫu nào khớp thì sẽ không có hành động nào được thực hiện.
- Trong cú pháp trên, mẫu tìm kiếm hoặc hành động là tùy chọn, nhưng không phải cả hai.
- Nếu mẫu tìm kiếm không được cung cấp thì Awk sẽ thực hiện các hành động đã cho cho từng dòng của dữ liệu đầu vào.
- Nếu hành động không được cung cấp, hãy in tất cả các dòng khớp với các mẫu đã cho là hành động mặc định.
- Dấu ngoặc rỗng mà không có bất kỳ hành động nào sẽ không có tác dụng gì. Nó sẽ không thực hiện thao tác in mặc định.
- Mỗi câu lệnh trong Hành động phải được phân cách bằng dấu chấm phẩy.
Chúng ta hãy tạo tệp nhanvien.txt có nội dung sau, tệp này sẽ được sử dụng trong
ví dụ được đề cập dưới đây.
$cat employee.txt 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
Awk Ví dụ 1. Hành vi mặc định của Awk
Theo mặc định, Awk in mọi dòng từ tệp.
$ awk '{print;}' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
Trong ví dụ trên mẫu không được đưa ra. Vì vậy, các hành động có thể áp dụng cho tất cả các dòng.
Hành động in không có bất kỳ đối số nào sẽ in toàn bộ dòng theo mặc định. Vì vậy nó in tất cả
các dòng của tập tin không bị lỗi. Các hành động phải được đặt trong dấu ngoặc nhọn.
Ví dụ 2 về Awk. In các dòng khớp với mẫu.
$ awk '/Thomas/ > /Nisha/' employee.txt 100 Thomas Manager Sales $5,000 400 Nisha Manager Marketing $9,500
Trong ví dụ trên, nó in tất cả các dòng khớp với ‘Thomas’ hoặc ‘Nisha’. Nó có hai mẫu. Awk chấp nhận số lượng mẫu bất kỳ, nhưng mỗi bộ (mẫu và hành động tương ứng của nó) phải được phân tách bằng dòng mới.
Ví dụ 3 về Awk. Chỉ in trường cụ thể.
Awk có số lượng biến được tích hợp sẵn. Đối với mỗi bản ghi, tức là dòng, theo mặc định, nó sẽ phân chia bản ghi được phân cách bằng ký tự khoảng trắng và lưu trữ nó trong các biến $n. Nếu dòng có 4 từ, nó sẽ được lưu trong $1, $2, $3 và $4. $0 đại diện cho toàn bộ dòng. NF là một biến tích hợp biểu thị tổng số trường trong một bản ghi.
$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000
$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000 Trong ví dụ trên $2 và $5 tương ứng là Tên và Mức lương. Chúng ta cũng có thể nhận được Mức lương bằng cách sử dụng $NF, trong đó $NF đại diện cho trường cuối cùng. Trong câu lệnh in ‘,’ là một dấu nối.
Ví dụ về Awk 4. Khởi tạo và hành động cuối cùng
Awk có hai mẫu quan trọng được chỉ định bởi từ khóa có tên BEGIN và END.
Syntax:
BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }
# is for comments in Awk
Các hành động được chỉ định trong phần BEGIN sẽ được thực thi trước khi bắt đầu đọc các dòng từ đầu vào.
Hành động END sẽ được thực hiện sau khi hoàn thành việc đọc và xử lý các dòng từ đầu vào.
$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas Manager Sales $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
-------------- Trong ví dụ trên, nó in dòng tiêu đề và tệp cuối cùng cho báo cáo.
Ví dụ Awk 5. Tìm nhân viên có id nhân viên lớn hơn 200
$ awk '$1 >200' employee.txt 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000
Trong ví dụ trên, trường đầu tiên ($1) là id nhân viên. Vì vậy, nếu $1 lớn hơn 200 thì chỉ cần thực hiện thao tác in mặc định để in toàn bộ dòng.
Awk Ví dụ 6. In danh sách nhân viên phòng Công nghệ
Bây giờ tên bộ phận có sẵn ở trường thứ tư, vì vậy cần kiểm tra xem $4 có khớp với chuỗi “Công nghệ” hay không, nếu có hãy in dòng này.
$ awk '$4 ~/Technology/' employee.txt 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 500 Randy DBA Technology $6,000
Toán tử ~ dùng để so sánh với các biểu thức chính quy. Nếu nó khớp với hành động mặc định, tức là in toàn bộ dòng sẽ được thực hiện.
Awk Ví dụ 7. In số lượng nhân viên phòng Công nghệ
Ví dụ dưới đây kiểm tra xem bộ phận đó có phải là Công nghệ hay không, nếu đúng thì trong Hành động, chỉ cần tăng biến đếm, được khởi tạo bằng 0 trong phần BEGIN.
$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt
Number of employees in Tehcnology Dept = 3 Sau đó, khi kết thúc quá trình, chỉ cần in giá trị đếm sẽ cung cấp cho bạn số lượng nhân viên trong bộ phận Công nghệ.
Nên đọc
Sed và Awk 101 Hack, của Ramesh Natarajan . Tôi dành vài giờ mỗi ngày trên môi trường UNIX / Linux để xử lý các tệp văn bản (tệp dữ liệu, cấu hình và nhật ký). Tôi sử dụng Sed và Awk cho tất cả công việc xử lý văn bản của mình. Dựa trên kinh nghiệm về Sed và Awk của tôi, tôi đã viết Sách điện tử Sed và Awk 101 Hacks chứa 101 ví dụ thực tế về các tính năng nâng cao khác nhau của Sed và Awk sẽ nâng cao tuổi thọ UNIX / Linux của bạn. Ngay cả khi bạn đã sử dụng Sed và Awk được vài năm và chưa đọc cuốn sách này, hãy tự giúp mình và đọc cuốn sách này. Bạn sẽ ngạc nhiên với khả năng của các tiện ích Sed và Awk.
Các bài viết bổ sung về Awk
- Biến do người dùng xác định trong Awk với 3 ví dụ thực tế
- 8 biến tích hợp Awk mạnh mẽ – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
- 7 ví dụ về toán tử Awk mạnh mẽ (Toán tử một ngôi, nhị phân, số học, chuỗi, phép gán, có điều kiện, Reg-Ex Awk)
- 4 Ví dụ về câu lệnh If Awk ( if, if else, if else if, :? )
- Bị mắc kẹt? Awk While, Do While, For Loop, Break, Continue, Exit Ví dụ