Kiến thức regex dành cho sysadmin Image Kiến thức regex dành cho sysadmin

Trong bài viết này giới thiệu các bạn về kiến thức regex dành cho sysadmin trên hệ điều hành Linux.

1. Regex của hệ điều hành Linux

Biểu thức chính quy là các ký tự đặc biệt giúp tìm kiếm dữ liệu, phù hợp với dữ liệu phức tạp, nó còn được gọi vắng tắt là "regex".

Biểu thức chính quy có khả năng tìm kiếm xâu ký tự mạnh mẽ cho bất cứ công cụ xử lý text nào. Tóm lại,đó là một chuỗi ký tự đặc biệt giúp xây dựng nên các mẫu tìm kiếm (searching partern).

2. Các loại regex

Chúng ta cùng tìm hiểu các loại Regex:

  • regex cơ bản
  • regex dạng khoảng(Interval)
  • regex mở rộng

2.1. Regex cơ bản

Một số lệnh thường được sử dụng với các biểu thức chính quy là tr, sed, vigrep. Dưới đây là một số Regex cơ bản:

Ký hiệuMô tả
.Khớp bất kỳ kí tự đơn nào.
^Đầu chuỗi.
$Cuối chuỗi.
*Khớp với 0 hoặc nhiều lần ký tự trước.
+Khớp với 1 hoặc nhiều lần ký tự trước.
\Đại diện cho ký tự đặc biệt.
()Nhóm biểu thức chính quy.
?khớp tối đa 1 kí tự.
[]Khớp với bất kì kí tự nào nằm trong dấu ngoặc vuông.
[^ ]Khớp với bất kì kí tự nào không có trong ngoặc vuông.
(abc)Khớp với các kí tự abc theo một thứ tự chính sác.

Chúng ta cùng thực hiện một ví dụ:

Dùng lệnh cat để xem nội dung của tệp hiện có

[root@test1 ~]# cat file.txt
apple
bat
ant
eat
people
taste
ball

Tìm kiếm nội dung chứa chữ 'a'.

Tìm kiếm nội dung chứa chữ 'a'

Kí tự '^' tìm kiếm kí tự bắt đầu của một chuỗi.

Kí tự '^' ứng với bắt đầu của một chuỗi

Chỉ các dòng bắt đầu bằng ký tự được tìm kiếm. Các dòng không chứa ký tự 'a' khi bắt đầu sẽ bị bỏ qua.

Kí tự '$' tìm kiếm kí tự cuối của một chuỗi.

Kí tự '$' ứng với kí tự cuối của một chuỗi

Sử dụng '$' chỉ chọn những dòng được kết thúc bằng kí tự 't'

Dùng kí tự '.' để tìm kiếm thay thế khí tự đứng trước hoặc đướng sau ki tự cần tìm.

Tìm kiếm thay thế kí tự trước hoặc sau kí tự cần tìm

2.2. Regex dạng khoảng(Interval)

Những biểu thức này cho chúng ta biết về số lần xuất hiện của một ký tự trong một chuỗi.

Kí hiệuMô tả
{n}Khớp với ký tự xuất hiện chính xác 'n' lần
{n, m}Khớp với ký tự xuất hiện 'n' lần nhưng không quá m
{n,}Chỉ khớp với ký tự khi nó xuất hiện 'n' lần trở lên

Ví dụ:

Lọc tất cả các dòng có chứa ký tự 'p'

Lọc tất cả các dòng có chứa ký tự 'p'

Chúng ta kiểm tra xem ký tự 'p' xuất hiện chính xác 2 lần trong một chuỗi lần lượt. Cú pháp sẽ là:

cat file | grep -E p\{2}

Lọc các dòng có 2 kí tự p

Ví dụ: Chúng ta thực hiện biểu thức chính quy sau [0-9]{2,3} để lọc ra các số ghép ít nhất 2 chữ số nhưng không quá 3 trong phạm vi từ 0 đến 9.

Lọc ít nhất 2 số nhưng không lớn hơn 3

Lưu ý: Chúng ta cần thêm tùy chọn -E với các regex này.

2.3. Regex mở rộng

Các biểu thức chính quy này chứa các kết hợp của nhiều biểu thức. Một số cơ bản là:

Kí hiệuMô tả
\+Khớp với một hoặc nhiều lần xuất hiện của ký tự trước
\?Khớp 0 hoặc một lần xuất hiện của ký tự trước

Ví dụ:

Tìm kiếm tất cả các ký tự 't'

Tìm kiếm tất cả các ký tự 't'

Chúng ta muốn lọc ra các dòng trong đó ký tự 'a' đứng trước ký tự 't'

Chúng ta sử dụng lệnh như sau:

cat file | grep "a\+t"

Lọc ra các dòng trong đó ký tự 'a' đứng trước ký tự 't'

Cú pháp cho phần mở rộng là dấu ngoặc {} và một chuỗi hoặc một danh sách các mục được phân tách bằng dấu phẩy bên trong dấu ngoặc nhọn "{}". Các mục bắt đầu và kết thúc trong một chuỗi được phân tách bằng hai dấu chấm "..".

Ví dụ:

[root@test1 ~]# echo {aa,bb,cc,dd}
aa bb cc dd
[root@test1 ~]# echo {0..11}
0 1 2 3 4 5 6 7 8 9 10 11
[root@test1 ~]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@test1 ~]# echo a{0..10}b
a0b a1b a2b a3b a4b a5b a6b a7b a8b a9b a10b

Ví dụ trên: Lệnh echo tạo chuỗi bằng cách sử dụng mở rộng dấu ngoặc.