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
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
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à 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.