12 ví dụ lệnh fgrep trên Centos / Ubuntu / Debian / Fedora

Trong Linux, lệnh fgrep thuộc họ lệnh grep và được sử dụng để tìm kiếm các chuỗi cố định thay vì sử dụng biểu thức chính quy. Do đó, lệnh này được gọi là fgrep (Fixed GREP).

Cú pháp của lệnh fgrep tương tự như các lệnh trong họ lệnh grep khác

$ fgrep [OPTIONS] PATTERNS [FILES]

Để bắt đầu, bạn tạo một tệp văn bản đơn giản với nội dung sau để sử dụng làm ví dụ. 

$ cat input.txt

Dưới đây là một số ví dụ phổ biến về việc sử dụng lệnh fgrep trong thực tế.

Xem nội dung tệp trong Linux

Sự khác biệt giữa lệnh fgrep và các lệnh grep và egrep?

Lệnh fgrep được sử dụng để tìm kiếm các chuỗi cố định. Mẫu tìm kiếm là một chuỗi cố định thay vì một biểu thức chính quy. Do đó, nó thực hiện hoạt động tìm kiếm một cách hiệu quả về thời gian.

Để hiểu sự khác biệt, sử dụng dấu chấm (.) với lệnh grep.

Biểu thức chính quy đơn giản này khớp với bất kỳ ký tự đơn nào trừ ký tự cuối dòng. 

$ grep ha. input.txt

Tìm kiếm ký tự đơn với Grep

Trong kết quả, bạn thấy dấu chấm (.) khớp với các chuỗi "har", "hat" và "has".

Bây giờ, hãy sử dụng cùng một mẫu với lệnh fgrep và quan sát kết quả:

$ fgrep ha. input.txt

Trong kết quả trên, chúng ta thấy rằng lệnh không thể tìm thấy mẫu đã cho.

Điều này xảy ra vì lệnh fgrep không nhận diện biểu thức chính quy và cố gắng tìm kiếm mẫu không tồn tại - "ha.".

Cách tìm kiếm mẫu trong một tệp

Bắt đầu với ví dụ cơ bản, trong đó chúng ta sẽ tìm kiếm chuỗi "professional" trong tệp input.txt.

$ fgrep professionals input.txt

Tìm kiếm mẫu trong tệp

Quá trình khớp mẫu thành công ở hai vị trí và được làm nổi bật bằng màu đỏ.

Cách đặt màu đầu ra của grep cho các mẫu khớp

Trong ví dụ trước, bạn đã thấy rằng theo mặc định, các mẫu khớp được làm nổi bật bằng màu đỏ. Tuy nhiên, bạn có thể thay đổi hành vi này bằng cách gán một giá trị khác cho biến môi trường GREP_COLOR.

Ví dụ: gán giá trị 32 cho biến môi trường GREP_COLOR để làm nổi bật các mẫu khớp bằng màu xanh lá cây. 

$ export GREP_COLOR=32
$ fgrep professionals input.txt

Đặt màu đầu ra Grep cho các mẫu phù hợp

Bây giờ, trước khi chuyển sang ví dụ tiếp theo, hủy bỏ biến môi trường GREP_COLOR để kích hoạt hành vi mặc định.

$ unset GREP_COLOR

Cách tìm kiếm nhiều mẫu trong một tệp

Đôi khi, bạn cần thực hiện khớp mẫu cho nhiều chuỗi. Trong trường hợp như vậy, bạn có thể cung cấp các mẫu từ tệp văn bản thay vì đối số dòng lệnh. 

Tạo một tệp văn bản chứa nhiều mẫu trên từng dòng. 

$ cat pattern.txt
professionals
website

Tiếp theo, sử dụng tệp này với tùy chọn -f để khớp mẫu nhiều chuỗi. 

$ fgrep -f pattern.txt input.txt

Tìm kiếm nhiều mẫu với grep

Trong kết quả trên, quá trình khớp mẫu thành công cho các chuỗi "professionals" và "website".

Cách giới hạn số lần khớp trong một tệp

Mặc định, lệnh fgrep tiếp tục thực hiện khớp mẫu cho đến khi toàn bộ tệp được xử lý.

Tuy nhiên, đôi khi chúng ta cần giới hạn số lần khớp. Sử dụng tùy chọn -m với lệnh:

$ fgrep -m 1 professionals input.txt

Trong ví dụ này, lệnh fgrep dừng quá trình xử lý tệp sau khi khớp mẫu với mẫu đầu tiên.

Cách in tên tệp khi tìm kiếm mẫu

Đôi khi, bạn chỉ cần tìm tên của các tệp trong đó có một mẫu cụ thể. Trong trường hợp như vậy, sử dụng tùy chọn -l của lệnh fgrep:

$ fgrep -l professionals input.txt
input.txt

Ở đây, có thể thấy rằng lệnh chỉ in ra tên của tệp thay vì các dòng chứa mẫu khớp.

Cách in tên tệp khi không khớp mẫu

Cách thực hiện thao tác in tên tệp khi không khớp mẫu.

Thử tìm kiếm mẫu không tồn tại trong tệp và quan sát kết quả:

$ fgrep -L non-existing-word input.txt
input.txt

Trong ví dụ này, tùy chọn -L của lệnh để in tên tệp khi không khớp mẫu thành công.

Cách tắt thông báo lỗi

Xử lý lỗi đóng vai trò quan trọng khi viết các kịch bản shell. Tuy nhiên, trong một số trường hợp không quan trọng, bạn có thể an tâm bỏ qua các thông báo lỗi.

Trong fgrep, sử dụng tùy chọn -s để tắt thông báo lỗi liên quan đến các tệp không tồn tại hoặc không thể đọc được. Để hiểu cách hoạt động này một cách tốt hơn, hãy thử tìm kiếm mẫu trong tệp không tồn tại:

$ fgrep -s professionals non-existing-file.txt
$ echo $?
2

Trong kết quả trên, bạn thấy rằng lệnh không hiển thị bất kỳ lỗi nào trên luồng lỗi tiêu chuẩn. Tuy nhiên, lại được báo cáo bằng giá trị trả về khác không.

Ngoài ra, bạn cũng có thể quan sát cùng hành vi khi tệp không thể đọc được. Vì vậy, trước tiên, thay đổi quyền truy cập vào tệp bằng lệnh chmod:

$ chmod 000 input.txt 
$ ls -l input.txt

Bây giờ, thử tìm kiếm mẫu và quan sát kết quả.

$ fgrep -s professionals input.txt 
$ echo $?

Grep bỏ qua các thông báo lỗi

Cách loại trừ các dòng khớp một phần

Trong các ví dụ trước, chúng ta đã thấy rằng lệnh fgrep thực hiện một khớp một phần. Tuy nhiên, trong một số trường hợp, chúng ta cần thực hiện khớp chính xác cho toàn bộ dòng. Trong những trường hợp như vậy, chúng ta có thể sử dụng tùy chọn -x của lệnh fgrep.

$ fgrep -nx "the same site is sometimes hard to find." input.txt

Trong kết quả trên, sự khớp dòng chính xác xảy ra tại dòng số 20.

Loại trừ các tệp tin trong quá trình tìm kiếm đệ quy

Đôi khi, bạn cần bỏ qua một số tệp tin trong quá trình tìm kiếm. Trong trường hợp như vậy, chúng ta có thể sử dụng tùy chọn --exclude của lệnh fgrep.

Để hiểu cách sử dụng, trước tiên hãy tạo một thư mục và sao chép một số tệp tin mẫu vào đó:

$ mkdir dir-1
$ cp input.txt dir-1/input.txt
$ cp input.txt dir-1/input.data
$ cp input.txt dir-1/input.md 

Bây giờ, tìm kiếm mẫu trong tất cả các tệp tin của thư mục dir-1, trừ các tệp tin có phần mở rộng ".txt":

$ fgrep -r --exclude *.txt professionals dir-1

Loại trừ tệp trong khi tìm kiếm mẫu

Trong kết quả trên, bạn có thể thấy rằng việc so khớp mẫu được thực hiện trên các tệp tin có phần mở rộng ".md" và ".data".

Loại trừ nhiều loại tệp tin trong quá trình tìm kiếm đệ quy

Trong ví dụ trước, chúng ta đã thấy cách loại trừ các tệp tin với một số phần mở rộng cụ thể. Tuy nhiên, lệnh trở nên dài dòng khi muốn loại trừ nhiều loại tệp tin. Trong trường hợp như vậy, bạn cung cấp mẫu loại trừ từ một tệp tin thay vì đối số dòng lệnh:

Vì vậy, tạo một tệp văn bản chứa nhiều mẫu loại trừ trên các dòng riêng biệt. 

$ cat skip-pattern.txt 
*.txt
*.data

Bây giờ, sử dụng tệp này với tùy chọn --exclude-from:

$ fgrep -r --exclude-from skip-pattern.txt professionals dir-1

Loại trừ nhiều loại tệp khi tìm kiếm mẫu

Ở đây, chúng ta có thể thấy rằng việc so khớp mẫu được thực hiện trên các tệp tin có phần mở rộng ".md" duy nhất.

Bao gồm các tệp tin trong quá trình tìm kiếm đệ quy

Trong các ví dụ trước, bạn đã biết cách loại trừ các tệp tin trong quá trình tìm kiếm đệ quy. Bây giờ, hãy xem cách thực hiện thao tác ngược lại.

Sử dụng tùy chọn --include của lệnh fgrep để tìm kiếm mẫu trong các tệp tin có phần mở rộng "*.txt". 

$ fgrep -r --include "*.txt" professionals dir-1

Include Files While Searching Pattern

Trong kết quả trên, bạn có thể thấy rằng việc so khớp mẫu bị bỏ qua đối với các tệp tin có phần mở rộng ".md" và ".data".