Awk là một ngôn ngữ lập trình xử lý dữ liệu mạnh mẽ được tích hợp vào hầu hết mọi hệ thống * nix. Nó trông giống như một ngôn ngữ lập trình mục đích chung trên bề mặt, nhưng nó được xây dựng để thực hiện các thao tác nhập và chạy dựa trên đầu vào đó. Nếu bạn cần xử lý văn bản dựa trên các điều kiện nhất định, awk sẽ hầu như luôn thực hiện công việc nhanh hơn ngôn ngữ chung như C. Nó cũng được diễn giải, vì vậy bạn tránh quá trình biên dịch và gỡ lỗi dài của các ngôn ngữ biên dịch.

Thực tế thú vị hơn : tên kỳ quặc của chương trình là tên gọi ban đầu của các lập trình viên: Alfred A ho, Peter W einberger và Brian K ernighan

Cú pháp cơ bản của Awk

Khi được gọi trên dòng lệnh, awk tuân theo mẫu cơ bản bên dưới:

 tệp mẫu {action} tệp mẫu {action} ... 

Awk sẽ thực hiện hành động bất cứ khi nào mẫu được khớp trong tệp được chỉ định. Nếu bạn không chỉ định một tệp, awk sẽ chạy trên đầu ra tiêu chuẩn. Khi các mẫu phù hợp, awk có thể sử dụng các biểu thức chính quy cũng như đầu vào có lập trình. Hãy xem xét ví dụ cơ bản dưới đây:

 email awk '/ com / {print $ 0}' 

Chương trình một dòng này sẽ in từng dòng từ tập tin “email” chứa các ký tự com . Trong awk $0 đề cập đến dòng hiện tại, cũng là hành vi mặc định. Các dòng có thể đã được viết mà không có $0, và nó sẽ có chức năng giống hệt nhau.

Trường in

Bởi vì awk có thể xác định và phân tích cú pháp phân tách trường, nó rất hữu ích cho việc in ra các cột hoặc hàng dữ liệu cụ thể. Chúng ta sẽ sử dụng tệp “/ etc / passwd” cho ví dụ này.

 awk -F ":" '{print $ 1}' / etc / passwd 

Chương trình một dòng này thực hiện một vài điều. Cờ -F chỉ ra rằng ký tự tiếp theo ( : trong ví dụ này) nên được hiểu là dấu tách trường. Awk họ in trường đầu tiên, được chỉ định bởi $1 .

Chúng tôi cũng có thể in nhiều lần một trường bằng cách chỉ định các trường tuần tự:

 awk -F ":" '{print $ 4 "" $ 5}' / etc / passw 

Nó sẽ tạo ra đầu ra trông giống như sau.

Điều này in các lĩnh vực thứ tư và thứ năm của tập tin passwd với một không gian giữa chúng. Lưu ý rằng khoảng cách giữa các dấu ngoặc kép. Điều này chỉ định nó như là một ký tự chữ trong lệnh in, do đó, nó được in dưới dạng văn bản. Chúng tôi cũng có thể thêm các chữ phức tạp hơn để làm sạch đầu ra của chúng tôi:

 awk -F ":" '{print "quá trình:" $ 5 "\ t \ t" "thư mục:" $ 6}' / etc / passwd 

Điều này sẽ in đầu ra với nhãn để nhận dạng. Và chúng ta có thể xuất tất cả điều này vào một tệp mới bằng cách sử dụng dấu mũ (>).

 awk -F ":" '{print "quá trình:" $ 5 "\ t \ t" "thư mục:" $ 6}' / etc / passwd> processes.txt 

Chúng ta có thể kết hợp những gì chúng ta biết cho đến nay để xử lý dữ liệu rộng rãi. Ví dụ: chúng tôi có thể sử dụng cụm từ thông dụng để in tất cả các dòng từ tài liệu có chứa số điện thoại Hoa Kỳ hợp lệ.

 awk '/^(\+\d{1, 2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4 } $ / {print} 'liên hệ 

Mở rộng sức mạnh khớp lệnh của lệnh Awk

Awk cũng có thể xử lý thông tin bằng nhiều toán hạng. Điều này bao gồm các toán hạng chuẩn như ==, <, >, <=, >=, và !=, Cũng như toán hạng awk-cụ thể ~!~, nghĩa là "đối sánh" và "không khớp" tương ứng. Các toán hạng này được sử dụng khi so sánh các biểu thức chính quy với logic Boolean, cũng như các cụm từ có lập trình tiêu chuẩn hơn.

Ví dụ về lệnh Awk

 awk 'length ($ 0)> 80' dữ liệu 

In tất cả các dòng dài hơn tám mươi ký tự trong tệp “dữ liệu”. Lưu ý việc thiếu lệnh in: khi không có hành động cụ thể, awk sẽ in dòng đầy đủ bất cứ khi nào mẫu phù hợp.

 $ 1 == "người dùng" {print} 

In tất cả các dòng trong đó trường đầu tiên bằng chuỗi “người dùng”. Nếu không có cờ -F, awk sẽ sử dụng khoảng trắng làm dấu phân tách trường mặc định. Ngoài ra, lưu ý rằng awk và tập tin không được chỉ định. Điều này được sử dụng trong các tập lệnh trong các tệp riêng biệt, như được trình bày bên dưới.

 $ 5 ~ / root / {print $ 3} 

In trường thứ ba bất cứ khi nào trường thứ năm khớp với biểu thức chính quy /root/ .

 {if ($ 5! ~ / root /) {print $ 3}} 

Khi trường 5 không khớp /root/, trường in ba. Điều này sử dụng câu lệnh if -C, cũng tương thích với awk. Định dạng này cho phép sự linh hoạt hơn cho các lập trình viên quen thuộc với các ngôn ngữ mục đích chung.

Lưu tập lệnh trong tệp

Các tập lệnh awk cũng có thể được lưu trong các tệp cho phép bạn lưu các chương trình phức tạp hơn:

 dữ liệu awk -f ~ / scripts / program.awk 

Khi sử dụng cờ -f, awk chạy tập lệnh trong đường dẫn tệp được chỉ định, cụ thể là program.awk . Các lệnh trong chương trình đó sẽ xử lý tệp “dữ liệu”.

Các hành động cũng có thể được chạy trước và sau chương trình, sử dụng BEGINEND :

 BEGIN {FS = ":"} # chỉ ra rằng: là dấu tách trường cho chương trình. #operations END {print "Bạn đã hoàn tất"} # in một thông điệp vui cho người dùng 

Như bạn có thể thấy ở trên, ký hiệu # bắt đầu một chú thích, kéo dài đến cuối dòng.

Phần kết luận

Hướng dẫn này chỉ chạm vào các yếu tố cơ bản nhất của awk. Có nhiều thứ để xây dựng và khám phá hơn thế nữa. Kiểm tra tài liệu GNU cho awk hoặc The Awk Programming Language, và sách giáo khoa awk được viết bởi các nhà phát triển của chương trình.