Khi chúng ta chạy một số lệnh trong Linux để đọc hoặc chỉnh sửa văn bản từ một chuỗi hoặc tệp tin, chúng ta thường muốn lọc đầu ra vào một phần cụ thể. Đây là nơi sử dụng biểu thức chính quy trở nên hữu ích. Cùng xem cách sử dụng awk command trong Linux.
Biểu thức chính quy là gì?
Biểu thức chính quy có thể được định nghĩa là chuỗi thể hiện nhiều chuỗi kí tự. Một trong những điều quan trọng nhất về biểu thức chính quy là chúng cho phép bạn lọc đầu ra của một lệnh hoặc tệp tin, chỉnh sửa một phần của văn bản hoặc tệp cấu hình, và nhiều hơn nữa.
Các tính năng của biểu thức chính quy:
Biểu thức chính quy gồm:
- Các ký tự thông thường như dấu cách, gạch dưới(_), A-Z, a-z, 0-9.
- Các ký tự đặc biệt sẽ được mở rộng thành các ký tự thông thường, bao gồm:
(.)
nó khớp với bất kỳ ký tự đơn nào trừ ký tự xuống dòng.
(*)
nó khớp với sự tồn tại không hoặc nhiều hơn của ký tự liền trước nó.
[ký tự]
nó khớp với bất kỳ một trong các ký tự được chỉ định trong ký tự(s), bạn cũng có thể sử dụng dấu gạch ngang (-)
để chỉ định một dải ký tự như [a-f]
, [1-5]
, và còn nữa.
^
nó khớp với đầu dòng trong một tệp tin.
$
khớp với cuối dòng trong một tệp tin.
\
đây là ký tự thoát.
Để lọc văn bản, bạn phải sử dụng công cụ lọc văn bản như awk. Bạn có thể xem awk như một ngôn ngữ lập trình riêng của nó. Nhưng đối với phạm vi của hướng dẫn này về cách sử dụng awk, chúng ta sẽ xem nó như một công cụ lọc dòng lệnh đơn giản.
Cú pháp chung của awk là:
awk 'script' filename
Ở đây 'script'
là một tập hợp các lệnh được hiểu bởi awk và được thực thi trên tệp tin, tệp tin_bắt đầu.
Nó hoạt động bằng cách đọc từng dòng cho trước trong tệp tin, tạo một bản sao của dòng đó, và sau đó thực thi script trên dòng đó. Quá trình này được lặp lại trên tất cả các dòng trong tệp tin.
'script' ở dạng '/mẫu/ hành động'
nơi mẫu là một biểu thức chính quy và hành động là điều mà awk sẽ làm khi nó tìm thấy mẫu cho trước trong một dòng.
Cách sử dụng công cụ lọc Awk Linux
Trong các ví dụ dưới đây, chúng ta sẽ tập trung vào các ký tự đặc biệt mà chúng ta đã thảo luận ở trên trong các tính năng của awk.
In tất cả các dòng từ tệp bằng Awk command
Ví dụ dưới đây in tất cả các dòng trong tệp tin /etc/hosts vì không có mẫu được cung cấp.
awk '//{print}'/etc/hosts
Awk in tất cả các dòng trong một tệp
Sử dụng Awk Patterns: So khớp các dòng với 'localhost' trong Tệp
Trong ví dụ dưới đây, đã cung cấp một mẫu localhost
, vì vậy awk sẽ khớp dòng có localhost trong tệp tin /etc/hosts
.
awk '/localhost/{print}' /etc/hosts
Sử dụng Awk để in các chuỗi khớp trong một tệp
Sử dụng Awk với (.) Ký tự đại diện trong một Pattern
Các ký tự (.)
sẽ khớp với các chuỗi chứa loc, localhost, localnet trong ví dụ dưới đây.
Điều đó có nghĩa là * l một ký tự duy nhất c *.
awk '/l.c/{print}' /etc/hosts
Sử dụng Awk để in các chuỗi khớp trong một tệp
Sử dụng Awk với ký tự (*) trong một Pattern
Nó sẽ khớp các chuỗi chứa localhost, localnet, lines, capable, như trong ví dụ dưới đây:
awk '/l*c/{print}' /etc/localhost
Sử dụng Awk để khớp chuỗi trong tệp
Bạn cũng sẽ nhận thấy (*)
cố gắng lấy cho bạn kết quả khớp dài nhất nó có thể phát hiện được.
Hãy xem một trường hợp mô tả điều này, hãy lấy biểu thức chính quy t*t
đó có nghĩa khớp các chuỗi bắt đầu bằng chữ t
và kết thúc bằng t
trong dòng dưới đây:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
Bạn sẽ có các khả năng sau khi sử dụng mẫu /t*t/
:
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
Và (*)
trong /t*t/
ký tự đại diện cho phép awk chọn lựa chọn cuối cùng:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
Sử dụng Awk với bộ [ ký tự ]
Hãy lấy ví dụ về set [al1]
, ở đây awk sẽ khớp tất cả các chuỗi chứa ký tự a
hoặc l
hoặc 1
trong một dòng trong tệp tin /etc/hosts.
awk '/[al1]/{print}' /etc/hosts
Sử dụng Awk để in ký tự trùng khớp trong tệp
Ví dụ tiếp theo khớp các chuỗi bắt đầu với K
hoặc k
theo sau bởi T
:
# awk '/[Kk]T/{print}' /etc/hosts
Sử dụng Awk để in chuỗi khớp trong tệp
Chỉ định các ký tự trong một phạm vi
Hiểu những ký tự trong awk:
[0-9]
có nghĩa là một số duy nhất
[a-z]
có nghĩa khớp một ký tự viết thường duy nhất
[A-Z]
có nghĩa khớp một ký tự viết hoa duy nhất
[a-zA-Z]
có nghĩa khớp một ký tự duy nhất
[a-zA-Z 0-9]
có nghĩa khớp một ký tự hoặc số duy nhất
Hãy xem một ví dụ dưới đây:
awk '/[0-9]/{print}' /etc/hosts
Sử dụng Awk để in các số trùng khớp trong tệp
Tất cả các dòng từ tệp tin /etc/hosts chứa ít nhất một số duy nhất [0-9]
trong ví dụ trên.
Sử dụng Awk với (^) ký tự Meta
Nó khớp tất cả các dòng bắt đầu bằng mẫu đã cho như trong ví dụ dưới đây:
# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts
Sử dụng Awk để in tất cả các dòng phù hợp với mẫu
Sử dụng Awk với ký tự Meta ($)
Nó khớp tất cả các dòng kết thúc bằng mẫu đã cho:
awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
Sử dụng Awk để in chuỗi mẫu đã cho
Sử dụng Awk với ký tự thoát (\)
Nó cho phép bạn xem ký tự theo sau nó là một literal, tức là xem nó như vậy.
Trong ví dụ dưới đây, lệnh đầu tiên in tất cả các dòng trong tệp tin, và lệnh thứ hai không in ra gì vì tôi muốn khớp với một dòng có $25.00, nhưng không có ký tự thoát được sử dụng.
Lệnh thứ ba là đúng vì đã sử dụng ký tự thoát để đọc $ như nó.
awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
Sử dụng Awk với ký tự thoát
Đó không phải là tất cả với công cụ lọc dòng awk command, các ví dụ trên là các hoạt động cơ bản của awk. Trong các phần tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng các tính năng phức tạp của awk.