Phân biệt grep, egrep và fgrep
Grep là một tiện ích rất phổ biến để tìm kiếm bất kỳ thứ gì trong file, line hay nhiều line ở các hệ điều hành Unix-like. Grep vô cùng hữu dụng và cũng hỗ trợ nhiều tùy chọn như: tìm kiếm sử dụng pattern, regex, hay perl based regex và nhiều hơn thế nữa.
Chính vì có nhiều tính năng, grep theo đó cũng có nhiều biến thể như: egrep (extended GREP), fgrep (fixed GREP), pgrep (process GREP), rgrep (recursive GREP). Những biến thể này mặc dù chỉ có thay đổi nhỏ khi đem so với grep nhưng lại khiến chúng phổ biến đối với lập trình viên khi cần thực hiện với các công việc đặc thù.
Trong bài viết này, Nhân Hòa sẽ giải thích những điều cơ bản về sự khác nhau giữa grep, egrep và fgrep
Một vài ký tự đặc biệt của grep (meta-character)
Trước khi đi vào nội dung chính, hãy đọc qua để hiểu các ký tự sau có ý nghĩa như nào:
- +: Đứng sau 1 ký tự nào thì đồng nghĩa ký tự đó sẽ được xuất hiện 1 hoặc nhiều lần
- ?: Ký tự trước đó có thể lặp lại 0, 1 hoặc 2 lần
- (: Bắt đầu 1 biểu thức luân phiên
- ): Kết thúc 1 biểu thức luân phiên
- |: Khớp cả 2 biểu thức được tách biệt bởi “|“. Ví dụ như (a|b)cd sẽ khớp với acd hoặc aacd hoặc abcd
- { và }: Ký tự trước đó sẽ được lặp lại theo số chỉ thị trong cặp ngoặc nhọn. VD: a{3} đồng nghĩa với aaa
Sự khác nhau của grep, egrep và fgrep
Để thuận tiện cho việc chỉ ra điểm khác nhau giữa các biến thể trên, Nhân Hòa sẽ sử dụng file với nội dung sau đây để ví dụ:
grep is a command that can be used on unix-like systems.
it searches for any string in list of strings or file.
It is very fast.
(f|g)ile
Lệnh Grep
Grep hay Global Regular Expression Print là tiện ích chính để tìm kiếm trong hệ thống Unix-like, nó có thể tìm kiếm bất kỳ xâu nào trong tệp, nhiều tệp hay kể cả output của 1 lệnh nào đó.
Nó có thể sử dụng biểu thức chính quy cơ bản ngoài các xâu thông thường để tìm kiếm. Trong regex cơ bản, các ký tự đặc biệt nói bên trên không có ý nghĩa gì và được coi như ký tự thông thường, nếu muốn grep hiểu là ký tự đặc biệt thì ta phải thêm \ vào trước ký tự đó.
Ví dụ: Để dễ hiểu, hãy sử dụng 2 lệnh sau đây và theo dõi kết quả:
grep -C 0 '(f|g)ile' nhanhoa.txt grep -C 0 '\(f\|g\)ile' nhanhoa.txt
Như ta có thể thấy, lệnh grep sẽ coi các ký tự đặc biệt như ‘(‘, ‘|’, ‘)’ như 1 ký tự thông thường nếu không có ‘\’ trước đó, vì vậy khi sử dụng lệnh thứ nhất ta sẽ tìm được xâu (f|g)ile, trong khi lệnh thứ 2 thì khớp với file hoặc gile
Lệnh Egrep
Egrep hay grep -e là 1 mở rộng của grep. Trong khi grep sử dụng Basic Regular Expression thì egrep sử dụng Extended Regular Expression, do đó egrep có thể dùng các ký tự đặc biệt mà không cần phải thêm ‘\’ vào đằng trước, giúp cho việc viết câu lệnh trở nên thuận tiện và đơn giản hơn.
Ví dụ: Hãy tiếp tục sử dụng 2 câu lệnh như ví dụ trên để so sánh kết quả:
egrep -C 0 '(f|g)ile' nhanhoa.txt egrep -C 0 '\(f\|g\)ile' nhanhoa.txt
Như ở đây, egrep tìm kiếm file khi meta character được sử dụng và nếu thêm “\” vào trước meta character thì egrep sẽ coi chúng như những ký tự thông thường
Lệnh Fgrep
Fgrep hay Fixed grep lại là một phiên bản khác nữa của grep khi nó chỉ tìm kiếm chính xác xâu ký tự được chỉ định thay vì sử dụng biểu thức chính quy.
Ví dụ: Hãy theo dõi ví dụ sau đây:
fgrep -C 0 '(f|g)ile' nhanhoa.txt fgrep -C 0 '\(f\|g\)ile' nhanhoa.txt
Rất dễ để nhận ra fgrep tìm kiếm chính xác xâu ký tự chỉ định chứ không hề coi bất kỳ ký tự nào là đặc biệt.
Tổng kết
Qua bài viết này, Nhân Hòa đã chỉ ra sự khác nhau cơ bản giữa 3 biến thể phổ biến nhất của grep là egrep và fgrep. Tuy nhiên, về cách sử dụng nâng cao của chúng, Nhân Hòa sẽ giới thiệu ở các bài viết sau.
Hãy tiếp tục theo dõi các bài viết tiếp theo ở Wiki Nhân Hòa nhé.
Chúc các bạn luôn may mắn và thành công trong cuộc sống!