Awk Linux: Lọc văn bản với các hành động theo mẫu cụ thể

Trong loạt lệnh awk Linux, chúng ta sẽ xem xét cách lọc văn bản hoặc chuỗi dựa trên các mẫu cụ thể mà người dùng có thể xác định.

Đôi khi, lọc văn bản, bạn muốn chỉ ra các dòng cụ thể từ một tệp đầu vào hoặc các dòng chuỗi dựa trên một điều kiện được chỉ định hoặc sử dụng một mẫu cụ thể có thể khớp. Làm điều này với Awk rất dễ dàng, đó là một trong những tính năng tuyệt vời của Awk mà bạn sẽ thấy hữu ích.

Các ví dụ về lệnh Awk Linux

Chúng ta hãy xem xét một ví dụ dưới đây, ví dụ bạn có một danh sách mua sắm cho các mặt hàng thực phẩm mà bạn muốn mua, được gọi là food_prices.list.

Nó có danh sách các mặt hàng thực phẩm và giá.

cat food_prices.list 
No	Item_Name		Quantity	Price
1	Mangoes			   10		$2.45
2	Apples			   20		$1.50
3	Bananas			   5		$0.90
4	Pineapples		   10		$3.46
5	Oranges			   10		$0.78
6	Tomatoes		   5		$0.55
7	Onions			   5            $0.45

Và sau đó, bạn muốn chỉ ra một dấu sao (*) trên các mặt hàng thực phẩm có giá lớn hơn 2 đô la, điều này có thể được thực hiện bằng cách chạy lệnh sau:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
In ra các mặt hàng có giá lớn hơn 2 đô la
In ra các mặt hàng có giá lớn hơn 2 đô la

Từ kết quả trên, bạn có thể thấy có dấu sao (*) ở cuối các dòng có các mặt hàng thực phẩm, như mango và dứa. Nếu bạn kiểm tra giá của chúng, chúng lớn hơn 2 đô la.

Trong ví dụ này, chúng ta đã sử dụng hai mẫu:

  • mẫu thứ nhất: / * \$ [2-9] \. [0-9] [0-9] * / lấy các dòng có giá mặt hàng thực phẩm lớn hơn 2 đô la và
  • mẫu thứ hai: / * \$ [0-1] \. [0-9] [0-9] * / tìm kiếm các dòng có giá mặt hàng thực phẩm nhỏ hơn 2 đô la.

Điều gì xảy ra là có bốn trường trong tệp, khi mẫu một gặp một dòng với một giá mặt hàng thực phẩm lớn hơn 2 đô la, nó in ra tất cả bốn trường và một dấu sao (*) ở cuối dòng làm cờ.

Mẫu thứ hai đơn giản in ra các dòng khác có giá thực phẩm nhỏ hơn 2 đô la như chúng xuất hiện trong tệp đầu vào, food_prices.list.

Cách này bạn có thể sử dụng các hành động dựa trên mẫu cụ thể để lọc ra các mặt hàng thực phẩm được định giá trên 2 đô la, mặc dù có một vấn đề với kết quả, các dòng có dấu sao (*) không được định dạng giống như phần còn lại của các dòng khiến đầu ra không đủ rõ ràng.

Chúng tôi đã thấy cùng một vấn đề ở Phần 2 của loạt awk, nhưng chúng tôi có thể giải quyết nó theo hai cách:

1. Sử dụng lệnh printf là một cách dài và buồn chán sử dụng lệnh dưới đây:

$ awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list 
Lọc và in các mục sử dụng Awk và Printf
Lọc và in các mục sử dụng Awk và Printf

2. Sử dụng trường $0. Awk sử dụng biến 0 để lưu toàn bộ dòng đầu vào. Điều này hữu ích để giải quyết vấn đề trên và nó đơn giản và nhanh chóng như sau:

$ awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 
Lọc và in các mục sử dụng Awk và biến
Lọc và in các mục sử dụng Awk và Variable

Kết luận

Đó là tất cả, tạm thời, đây là cách đơn giản để lọc văn bản sử dụng hành động dựa trên mẫu có thể giúp đánh dấu các dòng văn bản hoặc chuỗi trong một tệp sử dụng lệnh Awk Linux.