Học bằng cách đọc theo thứ tự

Biểu thức chính quy cơ bản — Các mẫu dùng với grep

Thực hành biểu thức chính quy cơ bản của grep — 5 ký hiệu ^/$/./*/[], biểu thức mở rộng với -E, và -o để chỉ in phần khớp — bằng cách trích xuất từ các tệp văn bản.

Công cụ để thử regex của bạn

Bạn cũng có thể thử các mẫu trong bài này trên Trình kiểm tra Regex chạy trong trình duyệt. Nó hiển thị nơi mẫu của bạn khớp với văn bản đầu vào, ngay tại chỗ.

Biểu thức chính quy cơ bản — ^ $ . * []

Biểu thức chính quy là một cách mô tả mẫu trong văn bản. grep diễn giải chuỗi bạn tìm như một biểu thức chính quy, nên bạn có thể tìm các dòng theo điều kiện như 'bắt đầu bằng ký tự này' hay 'một ký tự bất kỳ ở đây', chứ không chỉ theo chuỗi cố định. 5 ký hiệu cần học cho biểu thức chính quy cơ bản là ^, $, ., *, và [].

^$ là các neo cho đầu dòng và cuối dòng. . khớp một ký tự bất kỳ, và * nghĩa là không hoặc nhiều lần lặp lại của ký tự đứng trước. [abc] khớp một ký tự bất kỳ bên trong dấu ngoặc, còn [a-z] khớp một ký tự thường theo phạm vi. Kết hợp chúng để tìm kiếm linh hoạt.

Các ký hiệu regex cơ bản và ý nghĩa
^ct$c.tdòng bắt đầubằng cdòng kết thúcbằng t1 ký tự bất kỳgiữa c và t
^ là đầu dòng, $ là cuối dòng, và . là một ký tự bất kỳ.
Ký hiệuÝ nghĩaVí dụVí dụ nghĩa là gì
^Khớp đầu dònggrep '^c' fTìm các dòng bắt đầu bằng c
$Khớp cuối dònggrep 't$' fTìm các dòng kết thúc bằng t
.Khớp một ký tự bất kỳgrep 'c.t' fMột ký tự bất kỳ giữa ct (cat/cot)
*Không hoặc nhiều lần ký tự đứng trướcgrep 'ab*c' fBao nhiêu b cũng được giữa ac (ac/abc)
[abc]Khớp một trong các ký tựgrep '[cb]at' fTìm cat hoặc bat
[a-z]Một ký tự bất kỳ trong phạm vigrep '[a-z]at' fMột ký tự thường + at (cat/bat)
\|Khớp một trong hai (hoặc)grep 'cat\|dog' fCác dòng chứa cat hoặc dog
echo -e 'cat\ncot\ndog' > words.txt   # tạo dữ liệu
grep '^c' words.txt                       # cat và cot, bắt đầu bằng c
grep 't$' words.txt                       # cat và cot, kết thúc bằng t
grep 'c.t' words.txt                      # cat và cot khớp c?t

① Tạo tệp dữ liệu 3 dòng bằng echo -e 'cat\ncot\ndog' > words.txt.

② Truyền cho grep một mẫu có neo đầu dòng và chỉ hiển thị các dòng bắt đầu bằng c.

③ Tiếp theo, với một mẫu dùng neo cuối dòng, hiển thị các dòng kết thúc bằng t.

④ Cuối cùng, với một mẫu đặt ký hiệu một-ký-tự-bất-kỳ ở giữa, hiển thị các dòng có một ký tự giữa ct. (Chạy đúng thì phần giải thích sẽ hiện ra.)

Linux console
0 / 4 đã hoàn thành
Loading Linux Terminal...

Lặp lại và lớp ký tự — * và []

* nghĩa là không hoặc nhiều lần lặp lại của ký tự đứng trước. ab*c khớp các dòng có không hoặc nhiều b, như ac, abc, và abbc. [] khớp một ký tự bất kỳ bên trong dấu ngoặc, nên [cb]at bắt cả cat lẫn bat. Viết một phạm vi như [a-z] biểu thị một ký tự thường.

echo -e 'ac\nabc\nabbc\naxc' > rep.txt   # tạo dữ liệu
grep 'ab*c' rep.txt                       # ac abc abbc, với không hoặc nhiều b
echo -e 'cat\nbat\nrat' > cls.txt      # tạo dữ liệu
grep '[cb]at' cls.txt                     # 2 dòng cat và bat

① Tạo dữ liệu để kiểm tra lặp lại bằng echo -e 'ac\nabc\nabbc\naxc' > rep.txt.

② Truyền cho grep một mẫu dùng ký hiệu cho không hoặc nhiều lần lặp lại của ký tự đứng trước, và hiển thị các dòng có bao nhiêu b cũng được giữa ac.

③ Tạo dữ liệu để kiểm tra lớp ký tự bằng echo -e 'cat\nbat\nrat' > cls.txt.

④ Với một mẫu dùng lớp ký tự trong dấu ngoặc, chỉ hiển thị catbat.

Linux console
0 / 4 đã hoàn thành
Loading Linux Terminal...

Hoặc — Khớp một trong hai với \|

Trong biểu thức chính quy cơ bản, | (hoặc) được xem là một ký tự thường như nguyên trạng.

Để biểu thị lựa chọn, thêm một dấu gạch chéo ngược và viết \|, nên grep 'cat\|dog' khớp các dòng chứa cat hoặc dog.

Với grep -E, mà bạn sẽ học sau, bạn có thể viết | trực tiếp thay cho \|.

echo -e 'cat\ndog\nfox' > sel.txt   # tạo dữ liệu
grep 'cat\|dog' sel.txt              # 2 dòng chứa cat hoặc dog

① Tạo tệp dữ liệu 3 dòng bằng echo -e 'cat\ndog\nfox' > sel.txt.

② Để biểu thị 'hoặc' trong biểu thức chính quy cơ bản, thêm dấu gạch chéo ngược vào |. Truyền cho grep mẫu 'cat\|dog' và hiển thị các dòng chứa cat hoặc dog.

③ Xác nhận rằng fox không được in ra vì nó không khớp với cái nào.

Linux console
0 / 2 đã hoàn thành
Loading Linux Terminal...

Regex mở rộng và in phần khớp — grep -E / grep -o

Trong biểu thức chính quy cơ bản, + | ( ) cần thoát, như \+ \| \( \), nhưng với grep -E bạn có thể viết chúng trực tiếp. grep -E bật biểu thức chính quy mở rộng (ERE). Giờ bạn có thể viết trực tiếp + (một hoặc nhiều), | (hoặc), và () (nhóm), những thứ cần thoát trong regex cơ bản. grep -E 'cat|dog' khớp các dòng chứa cat hoặc dog.

grep -o chỉ in chuỗi con đã khớp, chứ không in cả dòng khớp. Nếu có nhiều phần khớp trên một dòng, nó in mỗi phần trên một dòng riêng. Nó tiện khi bạn muốn rút riêng các phần khớp ra khỏi một log và đếm chúng.

Ký hiệuÝ nghĩaVí dụVí dụ nghĩa là gì
+Một hoặc nhiều lần ký tự đứng trướcgrep -E 'ab+c' fMột hoặc nhiều b giữa ac (abc/abbc)
|Khớp một trong hai (hoặc)grep -E 'cat|dog' fCác dòng chứa cat hoặc dog
()Nhóm lạigrep -E '(ab)+' fMột hoặc nhiều lần lặp ab (ab/abab)
grep -E và grep -o làm gì
grep -E 'cat|dog' fdòng chứa cathoặc doggrep -o 'cat' fchỉ in catđã khớp
-E bật regex mở rộng, và -o chỉ in phần đã khớp.
Cách viếtÝ nghĩaVí dụ
grep -EBật regex mở rộng (ERE)grep -E 'cat|dog' f
grep -oChỉ in phần đã khớpgrep -o 'cat' f

Regex nâng cao hơn

grep -P (regex tương thích Perl) là một phần mở rộng của GNU grep. Trong khóa học này bạn học biểu thức chính quy cơ bản (^ $ . * []), grep -E để bật regex mở rộng, và grep -o để chỉ in phần khớp. Những cái này hoạt động giống nhau trên mọi Linux.

echo -e 'cat\ndog\nfox' > animals.txt   # tạo dữ liệu
grep -E 'cat|dog' animals.txt              # 2 dòng cat hoặc dog
echo -e 'ac\nabc\nabbc' > plus.txt      # tạo dữ liệu
grep -E 'ab+c' plus.txt                    # abc abbc, với một hoặc nhiều b
echo -e 'cat cat dog' > line.txt         # tạo dữ liệu
grep -o cat line.txt                       # in mỗi cat đã khớp trên dòng riêng

① Tạo tệp dữ liệu bằng echo -e 'cat\ndog\nfox' > animals.txt.

② Thêm vào grep tùy chọn bật regex mở rộng và hiển thị các dòng chứa cat hoặc dog.

③ Tạo dữ liệu bằng echo -e 'ac\nabc\nabbc' > plus.txt, và với regex mở rộng grep -E 'ab+c', hiển thị các dòng có một hoặc nhiều b.

④ Tạo dữ liệu với nhiều từ trên một dòng bằng echo -e 'cat cat dog' > line.txt.

⑤ Thêm vào grep tùy chọn chỉ in phần khớp, tìm cat, và xác nhận mỗi từ khớp xuất hiện trên dòng riêng.

Linux console
0 / 6 đã hoàn thành
Loading Linux Terminal...

Lọc đầu ra của lệnh — | grep

grep có thể tìm không chỉ trong một tệp truyền vào làm đối số mà còn trong đầu ra của lệnh khác truyền qua pipe |.

Đưa kết quả của ls hay cat vào | grep để thu hẹp xuống đúng các dòng bạn cần.

ls cmds | grep '^c' chỉ hiển thị các tên bắt đầu bằng c từ danh sách của thư mục cmds, và cat tệp | grep từ lọc nội dung của một tệp theo cách tương tự.

Lọc đầu ra của lệnh bằng | grep
ls cmdsin ra toàn bộdanh sáchls cmds | grep '^c'lọc dòng bắt đầubằng c
Đưa đầu ra của một lệnh vào grep bằng | để thu hẹp xuống đúng các dòng khớp. cmds là một thư mục dữ liệu nhỏ bạn tự tạo.
mkdir -p cmds                                # thư mục dữ liệu nhỏ
touch cmds/cat cmds/cut cmds/sort            # chuẩn bị 3 tên
ls cmds | grep '^c'                          # cat và cut, bắt đầu bằng c
echo -e 'apple\nbanana\ncherry' > fruit.txt   # tạo dữ liệu
cat fruit.txt | grep an                      # chỉ banana, chứa an

① Chuẩn bị một thư mục dữ liệu nhỏ bằng mkdir -p cmdstouch cmds/cat cmds/cut cmds/sort.

② Đưa đầu ra của ls cmds vào grep bằng | và chỉ hiển thị các tên bắt đầu bằng c.

③ Tạo dữ liệu 3 dòng bằng echo -e 'apple\nbanana\ncherry' > fruit.txt, rồi đưa đầu ra của cat fruit.txt vào | grep và chỉ hiển thị các dòng chứa an.

Linux console
0 / 5 đã hoàn thành
Loading Linux Terminal...
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Ký hiệu nào khớp đầu dòng trong một biểu thức chính quy?

Câu 2* trong grep 'ab*c' f biểu thị điều gì?

Câu 3Cái gì được in ra khi bạn chạy grep -o cat line.txt?