Lệnh grep trong Linux dùng để tìm kiếm các dòng chứa chuỗi ký tự cụ thể trong các file văn bản. Các biểu thức chính quy (regular expressions) trong grep cho phép bạn tìm kiếm các chuỗi ký tự theo các quy tắc cụ thể, chẳng hạn như tìm kiếm một chuỗi ký tự chính xác, hoặc tìm kiếm chuỗi ký tự bắt đầu hoặc kết thúc bằng một ký tự nhất định.
Concatenating Characters
Ví dụ, bạn muốn tìm kiếm tất cả các dòng trong một file văn bản chứa từ “linux” thì bạn có thể sử dụng lệnh:
grep "linux" file.txt
Bạn cũng có thể sử dụng các biểu thức chính quy để tìm kiếm các chuỗi ký tự phức tạp hơn. Ví dụ, nếu bạn muốn tìm kiếm tất cả các dòng trong file văn bản bắt đầu bằng từ “error” thì bạn có thể sử dụng lệnh:
grep "^error" file.txt
Trong đó ^ biểu thị bắt đầu dòng. Nếu bạn muốn tìm kiếm tất cả các dòng kết thúc bằng từ “error” thì bạn có thể sử dụng lệnh:
grep "error$" file.txt
Trong đó $ biểu thị kết thúc dòng.
Bạn cũng có thể sử dụng các biểu thức chính quy khác trong grep để tìm kiếm các chuỗi ký tự theo các quy tắc khác như lặp lại, tìm kiếm theo ký tự đại diện và nhiều hơn nữa.
Công cụ grep có các tùy chọn sau để sử dụng biểu thức chính quy:
- -E: Chuỗi được đọc như biểu thức chính quy mở rộng (ERE – Extended Regular Expressions).
- -G: Chuỗi được đọc như biểu thức chính quy cơ bản (BRE – Basic Regular Expressions).
- -P: Chuỗi được đọc như biểu thức chính quy Perl (PRCE – Perl Regular Expressions).
- -F: Chuỗi được đọc theo cách đơn giản, không được coi là biểu thức chính quy.
One Or The Other
Cú pháp:
grep <option> <'pattern|pattern> <fileName>
Ví dụ:
grep -E 'j|g' msg.txt
grep -P 'j|g' msg.txt
grep -G 'j\|g' msg.txt
Các lệnh grep
trên đều được sử dụng để tìm kiếm và in ra các dòng chứa chuỗi kết hợp với các biểu thức chính quy (regular expressions).
Cụ thể:
grep -E 'j|g' msg.txt
sử dụng ERE để tìm kiếm các dòng chứa chuỗi có chứa ký tự ‘j’ hoặc ‘g’ trong filemsg.txt
.grep -P 'j|g' msg.txt
sử dụng PRCE để tìm kiếm các dòng chứa chuỗi có chứa ký tự ‘j’ hoặc ‘g’ trong filemsg.txt
.grep -G 'j\|g' msg.txt
sử dụng BRE để tìm kiếm các dòng chứa chuỗi có chứa ký tự ‘|’ được escape bằng dấu ” (tức là ký tự ” và ‘|’ sẽ được tìm thay đổi riêng lẻ) trong filemsg.txt
.
Ví dụ nếu file msg.txt
chứa các dòng văn bản như sau:
This is a message
with some text in it.
It may contain a j or a g.
Lệnh grep -E 'j|g' msg.txt
sẽ in ra:
It may contain a j or a g.
Lệnh grep -P 'j|g' msg.txt
sẽ in ra:
It may contain a j or a g.
Lệnh grep -G 'j\|g' msg.txt
sẽ không in ra gì vì không có chuỗi kết hợp với biểu thức chính quy nào chứa ký tự ‘|’ được escape bằng dấu ” trong file msg.txt
.
One Or More / Zero Or More
Cú pháp:
grep <option> <'pattern*'> <fileName>
Ví dụ:
grep -E '1*' list
grep -E '1+' list
Cả hai lệnh grep -E '1*' list
và grep -E '1+' list
đều sử dụng tùy chọn -E
để sử dụng ký tự đại diện cho biểu thức chính quy (regular expression).
- Trong biểu thức chính quy
'1*'
, ký tự*
đại diện cho một hoặc nhiều ký tự trước đó (1
ở đây). Vì vậy, lệnh sẽ tìm kiếm các dòng trong filelist
chứa bất kỳ số lượng ký tự1
nào hoặc không có ký tự1
nào. - Trong biểu thức chính quy
'1+'
, ký tự+
đại diện cho một hoặc nhiều ký tự trước đó (1
ở đây). Vì vậy, lệnh sẽ tìm kiếm các dòng trong filelist
chứa ít nhất một ký tự1
.
Ví dụ: Giả sử file list
chứa các dòng sau đây:
123
456
789
101010
11
Khi chạy lệnh grep -E '1*' list
, đầu ra sẽ bao gồm các dòng:
123
101010
11
Khi chạy lệnh grep -E '1+' list
, đầu ra sẽ bao gồm các dòng:
123
101010
11
Match The Start Of A String
Cú pháp:
grep ^<pattern> <fileName>
Ví dụ:
grep ^o dupli.txt
Lệnh grep ^o dupli.txt
được sử dụng để tìm kiếm các dòng trong file dupli.txt
mà bắt đầu bằng ký tự o
.
Trong đó:
grep
là lệnh tìm kiếm và in ra các dòng có chứa một chuỗi ký tự cụ thể trong một hoặc nhiều file.^
là metacharacter được sử dụng để chỉ định rằng ký tự cần tìm kiếm phải xuất hiện ở đầu của một dòng.o
là ký tự cần tìm kiếm.
Vì vậy, lệnh này sẽ in ra tất cả các dòng trong file dupli.txt
mà bắt đầu bằng ký tự o
.
Separating Words
Cú pháp:
grep '\b<pattern>\b' <fileName>
Ví dụ:
grep '\bsome\b' file
Lệnh grep '\bsome\b' file
sử dụng regular expression để tìm kiếm chuỗi “some” tại những vị trí trên file “file” mà từ “some” đứng độc lập, tức là không nằm trong một từ nào khác. Cụ thể, metacharacter \b
sẽ đại diện cho “word boundary” (ranh giới từ), và các ký tự “some” được đặt trong cặp ký tự này để chỉ tìm kiếm từ “some” mà không có ký tự nào phía trước hoặc sau nó.