Câu 1Ký hiệu nào khớp đầu dòng trong một biểu thức chính quy?
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à [].
^ 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.
^ là đầu dòng, $ là cuối dòng, và . là một ký tự bất kỳ.| Ký hiệu | Ý nghĩa | Ví dụ | Ví dụ nghĩa là gì |
|---|---|---|---|
^ | Khớp đầu dòng | grep '^c' f | Tìm các dòng bắt đầu bằng c |
$ | Khớp cuối dòng | grep 't$' f | Tìm các dòng kết thúc bằng t |
. | Khớp một ký tự bất kỳ | grep 'c.t' f | Một ký tự bất kỳ giữa c và t (cat/cot) |
* | Không hoặc nhiều lần ký tự đứng trước | grep 'ab*c' f | Bao nhiêu b cũng được giữa a và c (ac/abc) |
[abc] | Khớp một trong các ký tự | grep '[cb]at' f | Tìm cat hoặc bat |
[a-z] | Một ký tự bất kỳ trong phạm vi | grep '[a-z]at' f | Một ký tự thường + at (cat/bat) |
\| | Khớp một trong hai (hoặc) | grep 'cat\|dog' f | Cá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
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
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
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ĩa | Ví dụ | Ví dụ nghĩa là gì |
|---|---|---|---|
+ | Một hoặc nhiều lần ký tự đứng trước | grep -E 'ab+c' f | Một hoặc nhiều b giữa a và c (abc/abbc) |
| | Khớp một trong hai (hoặc) | grep -E 'cat|dog' f | Các dòng chứa cat hoặc dog |
() | Nhóm lại | grep -E '(ab)+' f | Một hoặc nhiều lần lặp ab (ab/abab) |
-E bật regex mở rộng, và -o chỉ in phần đã khớp.| Cách viết | Ý nghĩa | Ví dụ |
|---|---|---|
grep -E | Bật regex mở rộng (ERE) | grep -E 'cat|dog' f |
grep -o | Chỉ in phần đã khớp | grep -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
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ự.
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
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
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?