Linux Regular Expression (Regex) là một chuỗi các ký tự đặc biệt được sử dụng để tìm kiếm, so khớp và xử lý văn bản hoặc file trong Linux và các hệ điều hành khác. Regex được sử dụng trong các lệnh như grep, sed và awk để tìm kiếm và thay thế các chuỗi ký tự trong văn bản.
Regex có thể được sử dụng để chỉ định một mẫu chuỗi hoặc nhóm các ký tự có thể có trong một chuỗi. Các ký tự đặc biệt được sử dụng để tạo một mẫu, ví dụ như dấu chấm (.) để đại diện cho bất kỳ ký tự nào, hay dấu ngoặc vuông ([ ]) để chỉ định một nhóm các ký tự có thể có trong một chuỗi.
Regex cũng hỗ trợ các phép toán như lặp lại ký tự, tìm kiếm chuỗi bắt đầu hoặc kết thúc bằng một mẫu cụ thể và các toán tử so sánh.
Regex là một công cụ hữu ích cho những người quản trị hệ thống Linux và các lập trình viên trong việc tìm kiếm và xử lý các văn bản và file trong hệ thống.
Các tham số trong Regular Expression:
-E
hoặc--extended-regexp
: Sử dụng extended regular expression thay vì basic regular expression.-F
hoặc--fixed-strings
: Trong regular expression, xử lý chuỗi theo string literals thay vì regular expression.-G
hoặc--basic-regexp
: Sử dụng basic regular expression thay vì extended regular expression.-i
hoặc--ignore-case
: Không phân biệt chữ hoa, chữ thường trong regular expression.-w
hoặc--word-regexp
: So khớp chỉ trên từ riêng biệt thay vì tìm kiếm trong các từ khác.-v
hoặc--invert-match
: Lọc ra các dòng không khớp với regular expression.
Dưới đây là một số Metacharacter thường được sử dụng trong Regular Expression trên Linux:
- . : thay thế cho bất kỳ ký tự nào.
- ^ : khớp với đầu chuỗi và đại diện cho các ký tự không có trong chuỗi.
- $ : khớp với cuối chuỗi.
- : khớp với 0 hoặc nhiều lần xuất hiện của ký tự trước đó.
- \ : đại diện cho một nhóm các ký tự.
- () : nhóm các biểu thức chính quy.
- ? : khớp với đúng một ký tự.
- : khớp với một hoặc nhiều lần xuất hiện của ký tự trước đó.
- {N} : ký tự trước đó được khớp chính xác N lần.
- {N,} : ký tự trước đó được khớp ít nhất N lần.
- {N,M} : ký tự trước đó được khớp từ N đến M lần.
- : đại diện cho khoảng.
- \b : khớp với chuỗi rỗng ở đầu hoặc cuối của một từ.
- \B : khớp với chuỗi rỗng nếu nó không ở đầu hoặc cuối của một từ.
- < : khớp với chuỗi rỗng ở đầu của một từ.
- > : khớp với chuỗi rỗng ở cuối của một từ.
Ví dụ về sử dụng Regular Expression trong Linux là khi bạn muốn tìm kiếm tất cả các file trong thư mục hiện tại và các thư mục con của nó có chứa từ “example” trong tên file:
find . -type f -name "*example*"
Trong đó:
find
là lệnh tìm kiếm..
là thư mục hiện tại.-type f
chỉ tìm kiếm trong các tập tin.-name "*example*"
chỉ tìm kiếm các tập tin có chứa chuỗi “example” trong tên file.
Lệnh này sẽ tìm kiếm tất cả các file trong thư mục hiện tại và các thư mục con của nó có chứa từ “example” trong tên file và hiển thị danh sách các file tìm thấy.
Để lọc địa chỉ IP từ một tập tin văn bản trong Linux bằng cách sử dụng Regular Expression, bạn có thể sử dụng lệnh grep và cung cấp cho nó một biểu thức chính quy để tìm kiếm địa chỉ IP trong file văn bản đó. Ví dụ:
Giả sử chúng ta có một file văn bản có nội dung sau:
This is a sample text file containing IP addresses such as 192.168.0.1 and 10.0.0.1 as well as some other text.
Chúng ta có thể sử dụng lệnh grep với biểu thức chính quy để lọc ra tất cả các địa chỉ IP từ file văn bản này như sau:
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" sample.txt
Trong đó:
-o
chỉ ra rằng chúng ta chỉ muốn lấy ra các kết quả khớp với biểu thức chính quy, chứ không phải toàn bộ các dòng chứa nó.-E
chỉ ra rằng chúng ta đang sử dụng biểu thức chính quy mở rộng.\b
chỉ ra rằng chúng ta chỉ muốn khớp với các địa chỉ IP đứng riêng lẻ, không phải là một phần của một từ khác.([0-9]{1,3}\.){3}
chỉ ra rằng chúng ta muốn khớp với bất kỳ chuỗi 1-3 chữ số nào, được phân tách bởi dấu chấm, và có đúng 3 cặp như vậy.[0-9]{1,3}
chỉ ra rằng chúng ta muốn khớp với bất kỳ chuỗi 1-3 chữ số nào.sample.txt
là tên file văn bản chúng ta muốn tìm kiếm.
Kết quả sẽ là danh sách các địa chỉ IP được tìm thấy trong file văn bản, trong trường hợp này là:
192.168.0.1
10.0.0.1
Hoặc cũng có thể sử dụng nó để tìm kiếm đầu ra của một lệnh.
$ ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
192.168.13.228
255.255.254.0
192.168.13.255
172.25.0.1
255.255.0.0
172.25.255.255
172.17.0.1
255.255.0.0
172.17.255.255
127.0.0.1
255.0.0.0
10.0.0.254
255.255.255.0
10.0.0.255
172.16.1.254
255.255.255.0
172.16.1.255
192.168.1.254
255.255.255.0
192.168.1.255