BÀI VIẾT

Hướng dẫn dùng biểu thức chính quy với grep trong Linux

2.3K
author Huỳnh Đình Hiếu - 2022-08-05 16:40:28 (GMT+7)

Giới thiệu

Biểu thức chúng quy là một nhóm các ký tự, ký hiệu giúp chúng ta có thể tìm kiếm dữ liệu và khớp các mẫu phức tạo. Chúng được sử dùng nhiều trong các lệnh Linux như: grep, sed, bash..., trong bài viết này chúng ta sẽ tìm hiểu chúng với grep.

Các loại biểu thức chính quy

  • Biểu thức chính quy cơ bản

  • Biểu thưc chính quy khoảng

  • Biểu thức chính quy mở rộng

Toán tử biểu thức chính quy

Ký hiệu Mô tả
. Khớp bất kỳ kí tự đơn nào.
? khớp tối đa 1 kí tự.
* Khớp với 0 hoặc nhiều lần ký tự trước.
+ Khớp với một hoặc nhiều lần xuất hiện của ký tự trước
{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
- Đại diện cho phạm vi nếu nó không phải là đầu tiên hoặc cuối cùng trong danh sách.
$ Khớp với ký tự cuối chuỗi.
^ Khớp với ký tự dầu chuỗi.
\b Khớp với chuỗi trống ở cạnh của một từ
\B Khớp với chuỗi trống miễn là nó không ở cạnh của một từ.
\< Khớp chuỗi trống ở đầu từ.
\> Khớp chuỗi trống ở cuối từ.

Ví dụ biểu thức chính quy

Cách ghép các ký tự đơn.

Ký tự dấu chấm . khớp với bất kỳ một ký tự nào.

Chúng ta có tệp 123host.txt như sau:

bash (non-root)
cat 123host.txt
dataset.txt
purchase.db
purchase1.db
purchase2.db
purchase3.db
purchase.idx
host
hosting
123host.vn
host1
Host2
host10
host11

Chúng ta tìm kiếm chuỗi bắt đầu bằng purchase.

bash (non-root)
grep 'purchase' 123host.txt
purchase.db
purchase1.db
purchase2.db
purchase3.db
purchase.idx

Chúng ta tìm kiếm chuỗi bắt đầu bằng purchase và theo sau là một ký tự khác.

bash (non-root)
grep 'purchase.' 123host.txt
purchase.db
purchase1.db
purchase2.db
purchase3.db
purchase.idx

Cuối cùng chúng ta tìm kiếm chuỗi bắt đầu bằng purchase nhưng kết thúc bằng db.

bash (non-root)
grep 'purchase..db' 123host.txt
purchase1.db
purchase2.db
purchase3.db

Cách khớp chỉ dấu chấm.

Dấu chấm có một ý nghĩa đặc biệt trong regex, tức là khớp với một ký tự bất kỳ nào. Nhưng nếu chúng ta chỉ cần khớp dấu chấm . thay vì ý nghĩa đặc biệt regex. Chúng ta cần đặt trước nó một dấu gạch chéo ngược \.

Ví dụ:

bash (non-root)
grep 'purchase..' 123host.txt
purchase.db
purchase1.db
purchase2.db
purchase3.db
purchase.idx
bash (non-root)
grep 'purchase.\.' 123host.txt
purchase1.db
purchase2.db
purchase3.db

Neo.

Chúng ta có thể sử dụng ^$ để buộc regex chỉ khớp ở đầu hoặc cuối dòng tương ứng.

Ví dụ chúng ta cần tìm chuỗi bắt đầu bằng 123 trong file 123host.txt.

bash (non-root)
grep '^123' 123host.txt
123host
123host.vn

Ví dụ chúng ta cần tìm chuỗi kết thúc bằng vn trong file 123host.txt.

bash (non-root)
grep 'vn$' 123host.txt
123host.vn

Chúng ta có thể chỉ hiển thị host nhưng không hiển thị hosting, 123host ... như sau:

bash (non-root)
grep -w '^host' 123host.txt
host

Chúng ta có thể tìm kiếm dòng chỉ chưa nội dung host như sau:

bash (non-root)
grep '^host$' 123host.txt
host

Chúng ta có thể tìm các dòng trống như sau:

bash (non-root)
grep '^$' 123host.txt

Cách ghép các bộ ký tự.

Dấu chấm . khớp với bất kỳ ký tự đơn lẻ nào, Chúng ta có thể khớp với các ký tự và phạm vi ký tự cụ thể bằng cách sử dụng cú pháp [..]

Ví dụ chúng ta cần tìm host hoặc Host như sau:

bash (non-root)
grep '[hH]ost' 123host.txt
host
hosting
123host.vn
host1
Host2
host10
host11

Chúng ta cũng có thể khớp số và ký tự hoa, ký tự thường. Như ví dụ chúng ta chỉ khớp với host1 Host2.

bash (non-root)
grep -w '[hH]ost[0-9]' 123host.txt
host1
Host2

Chúng ta cũng có thể khớp 2 số, ví dụ như host10 host11 như sau:

bash (non-root)
grep 'host[0-9][0-9]' 123host.txt
host10
host11

Chúng ta không bị giới hạn bởi chữ số và khớp ít nhất một ký tự như sau:

bash (non-root)
grep '[A-Za-z]' 123host.txt
dataset.txt
purchase.db
purchase1.db
purchase2.db
purchase3.db
purchase.idx
host
hosting
123host.vn
host1
Host2
host10
host11

Trong một biểu thức, tên của một lớp ký tự được đặt trong “[[:” và “:]]” là viết tắt của danh sách tất cả các ký tự thuộc lớp đó. Tên lớp ký tự tiêu chuẩn là:

  • [[:alnum:]] – Thuộc chữ cái-số [a-z A-Z 0-9]

  • [[:alpha:]] – Bảng chữ cái [a-z A-Z]

  • [[:blank:]] – Bảng chữ cái [a-z A-Z]

  • [[:digit:]] – Các số [0-9] ‘0 1 2 3 4 5 6 7 8 9’

  • [[:lower:]] – Các ký tự viết thường [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'

  • [[:space:]] – Khoảng trống trắng

  • [[:upper:]] – Các ký tự viết hoa [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’

Ví dụ khớp với tất cả các chữ cái viết hoa:

bash (non-root)
grep '[[:upper:]]' 123host.txt
Host2

Cách phủ định tất cả các phạm vi trong một tập hợp.

Ví dụ chúng ta tìm kiếm các dòng chứa chuỗi host Host như sau:

bash (non-root)
grep '[hH]ost' 123host.txt
host
hosting
123host.vn
host1
Host2
host10
host11

Chúng ta sẽ phủ định các chữ số trong chuỗi.

bash (non-root)
grep '[hH]ost[^0-9]' 123host.txt
hosting
123host.vn

Ký tự đại diện.

Chúng ta có thể dùng dấu . để đại diện cho một ký tự, trong ví dụ sau chúng ta khớp 3ký tự từ bắt đầu bằng b và kết thúc bằng t.

bash (non-root)
grep '\<b.t\>' 123host.txt
  • \<: Khớp chuỗi trống ở đầu từ
  • \>: Khớp chuỗi trống ở cuối từ.

In tất cả các dòng có chính xác hai ký tự

bash (non-root)
grep '^..$' 123host.txt

Hiển thị bất kỳ dòng nào bắt đầu bằng dấu chấm và chữ số:

bash (non-root)
grep '^\.[0-9]' 123host.txt

Cách tìm kiếm 1 mẫu có biểu tượng - ở đầu hàng.

Tìm kiếm tất cả các dòng khớp với --test-- bằng tùy chọn -e Nếu không có -e, grep sẽ cố gắng phân tích cú pháp –test– dưới dạng danh sách các tùy chọn.

bash (non-root)
grep -e '--test--' 123host.txt

Cách dùng | làm hoặc với grep.

Ví dụ để tìm hosting hoặc server trong file 123host.txt chúng ta dùng lệnh như sau:

bash (non-root)
grep -E 'hosting|server' 123host.txt

Cách dùng | làm với grep.

Ví dụ chúng ta muốn hiển thị các dòng chứa cả từ hostingcheap trong file 123host.txt chúng ta sử dụng lệnh như sau:

bash (non-root)
grep 'hosting' 123host.txt | grep 'cheap'

Cách kiểm tra sự liên tục của ký tự.

Chúng ta có thể kiểm tra tần suất một ký tự được lặp lại theo trình tự với cú pháp như sau:

Ký hiệu Mô 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ụ khớp với ký tự v 2 lần.

bash (non-root)
egrep "v{2}" 123host.txt

Ví dụ sau sẽ khớp với cả hai từ "col" và "cool".

bash (non-root)
egrep 'co{1,2}l' 123host.txt

Ví dụ tiếp theo chúng sẽ khớp với bất kỳ hàng nào có ít nhất 3 chữ cái ‘c’.

bash (non-root)
egrep 'c{3,}' 123host.txt

Tổng kết

Chúng ta đã kêt thúc bài hướng dẫn dùng biểu thức chính quy với grep trong Linux. Hy vọng qua bài nãy sẽ giúp các bạn hiểu hơn về biểu thức chính quy và cách dùng với grep trong Linux.


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Lệnh xác định vị trí của tệp hoặc thư mục trên Linux
Lệnh xác định vị trí của tệp hoặc thư mục trên Linux
Lệnh kiểm tra nhiều cổng port đang mở của một tên miền trên Linux
Lệnh kiểm tra nhiều cổng port đang mở của một tên miền trên Linux
Lệnh tạo một dãy số tăng dần trên Linux
Lệnh tạo một dãy số tăng dần trên Linux

Object Storage

Chuẩn S3, không giới hạn băng thông

Object Storage

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận