Grep (Global Regular Expression Print) là một công cụ dòng lệnh Linux/Unix được sử dụng để tìm kiếm một chuỗi ký tự trong một tệp được chỉ định. Khi tìm thấy kết quả khớp, nó sẽ in dòng kết quả. Lệnh greprất tiện lợi khi tìm kiếm thông qua các tệp nhật ký lớn. Ở bài viết này, mình sẽ giới thiệu những tùy chọn hay dùng và hữu ích nhất của grep command.

Cách sử dụng:

Cú pháp: grep [tuỳ chọn] <file>

Sau đây mình sẽ có những ví dụ để các bạn dễ hình dung và dễ hiểu hơn về lệnh grep

Mình có 2 file voivang.txt và song.txt

1: Tìm một chuỗi trong một file

VD: Tìm từ “tat nang” trên file voivang.txt

Kết quả sẽ hiển thị dòng chứa từ “tat nang”

2: Tìm kiếm chuỗi trên nhiều file

VD: Tìm từ “gio” trên 2 file voivang.txt và song.txt

Kết quả sẽ hiển thị những dòng chứa từ “gio” trên cả hai file

3: Tìm kiếm không phân biệt hoa thường, sử dụng tùy chọn -i

VD: Như các bạn đã thấy, trên 2 file text có cả thừ viết hoa và viết thường. Để tìm kiếm mà không phân biệt hoa thường ta có thể sử dụng tùy chọn -i

So sánh giữa sử dụng grep bình thường và tùy chọn -i

Ở đây, mình tìm từ “toi” là chữ thường thì sẽ không ra kết quả, nhưng nếu sử dụng tùy chọn -i, thì kết quả sẽ xuất hiện với từ “Toi”

4: Tìm kiếm ngược, sử dụng tùy chọn -v

VD: Để tìm tất cả những dòng không chứa từ “nang”

Kết quả sẽ hiển thị những dòng không chứa từ “nang

5: Hiển thị số dòng, số lượng, giới hạn số dòng đầu ra

Ứng với các tùy chọn sau:

  • -n: Hiện thị số thứ tự của dòng và dòng chứa từ cần tìm
  • -c: Đếm số dòng khớp với kí tự cần tìm
  • -m[chỉ số cần giới hạn]: Giới hạn số lượng dòng khớp
Các bạn có thể để ý số dòng và các từ cần tìm.
  • Với tùy chọn -n, kết quả hiển thị bao gồm thứ tự dòng và dòng chứa từ “nhat”.
  • Với tùy chọn -c, kết quả hiển thị 2 vì có 2 dòng chứa từ “Toi”.
  • Tùy chọn cuối, chúng ta có thể tùy chỉnh số dòng được hiển thị theo ý muốn của mình.

6: Tìm kiếm nhiều chuỗi

Có 3 cú pháp tìm tương đương nhau:

  • Cách 1: grep -e "word1" -e "word2" <file>
  • Cách 2: grep "word1\|word2" <file> # \ để phân biệt word1 với word2
  • Cách 3: egrep "word1|word2" <file> 
Kết quả sẽ hiển thị tất cả những dòng chứa từ “nang” hoặc từ “bay”

7: Tìm kiếm tên tệp

  • -l: để có được các tập tin phù hợp với tìm kiếm
  • -L: để có được các tập tin không phù hợp với tìm kiếm
  • -h: hiện thị không với tên file (khi chỉ định nhiều file)
  • -H: hiển thị cùng với tên file
7.1: So sánh giữa 2 tùy chọn -l -L
  • Tùy chọn -l sẽ ra kết quả là những tên file có chứa từ “gio”
  • Tùy chọn -L sẽ ra kết quả là những tên file không chứa từ “gio”
7.2: So sánh 2 tùy chọn -h-H
  • Tùy chọn -h sẽ cho kết quả những dòng chứa từ “gio” mà không kèm với tên file
  • Còn với tùy chọn -H kết quả sẽ bao gồm tên file và dòng chứa từ “gio”

8: Hiển thị thêm dòng trước, sau, xung quanh dòng chứa kết qủa cần tìm.

grep -<A, B hoặc C> <n> "chuoi" <file>

Trong đó:

  • A : hiển thị dòng sau dòng khớp với kí tự cần tìm
  • B : hiển thị dòng trước dòng khớp với kí tự cần tìm
  • C : hiển thị dòng xung quanh dòng khớp với kí tự cần tìm
  • n : là số tự nhiên chỉ định xem hiển thị trước, sau hay xung quanh bao nhiêu dòng

VD:

Ở đây với n=1, nếu các bạn muốn tìm rộng hơn có thể thay đổi n với số lớn hơn

9: Tìm chính xác với -w

VD: Mình có file vqmanh.txt

Để ý vqmanhvqmanh99
  • Khi bạn tìm kiếm bình thường với grep, kết quả sẽ hiển thị tất cả những dòng có chứa từ vqmanh kể cả vqmanh99.
  • Với tùy chọn -w, kết quả sẽ tìm chính xác chỉ những dòng có chứa từ vqmanh.

10: Tìm tất cả các file trên cả thư mục con và thư mục cha với tùy chọn -R

  • Thêm tùy chọn này các bạn có thể tìm trên thư mục con lẫn thư mục cha khi không biết chính xác file nào chứa chuỗi cần tìm. Các bạn có thể xem cụ thể hơn ở phần 11.2

11: Mở rộng nâng cao, kết hợp các tùy chọn

11.1 Tìm kiếm dựa trên output của lệnh trước làm input của lệnh sau sử dụng “|
Hiển thị tên mô hình cpu
11.2 Tìm chuỗi, hiển thị số dòng, tên file

VD: Tìm “error” hiển thị số dòng, tên file mà chưa biết chính xác file nào: grep -Hin 'error' /var/log/httpd/*

Với tùy chọn này sẽ hiển thị tên, đường dẫn đến file, thứ tự dòng. Tùy chọn này sẽ không đọc được file có trong thư mục con.

VD: Sử dụng tùy chọn -Rin để tìm kiếm tất cả những file có trong thư mục, kể cả thư mục con.

grep -Rin 'error' /var/log/ # VD này sẽ tìm kiếm tất cả những file có chứa “error” và hiển thị tên file, số dòng, kể cả thư mục con năm trong thư mục log.

11.3 Đọc file loại bỏ comment, dòng trống

VD: Khi một file cấu hình có sử dụng rất nhiều comment và các dòng trống. Mà bạn chỉ muốn đọc các cấu hình một cách nhanh và ngắn gọn sử dụng:

egrep -v "^#|^*#|^$" tên_file

  • ^# – Những dòng bắt đầu bằng #
  • ^*# – Những dòng bắt đầu bằng # kể cả khoảng trống trước nó
  • ^$ – Những dòng trống

Hy vọng bài viết này sẽ hữu ích cho các bạn mới bắt đầu tìm hiểu về lệnh grep.