Tóm tắt: Trong hướng dẫn dành cho người mới bắt đầu này, chúng ta sẽ thảo luận vài ví dụ thực tế về fgrep command. Đến cuối cùng của hướng dẫn này, người dùng sẽ có thể thực hiện các thao tác tìm kiếm văn bản hiệu quả bằng giao diện dòng lệnh.
Tìm kiếm văn bản là một trong những thao tác phổ biến nhất. Tuy nhiên, nếu người dùng không quen với các công cụ đúng, nhiệm vụ đơn giản này sẽ nhanh chóng trở nên tốn thời gian. Trong Linux, có các tiện ích lọc văn bản khác nhau như awk, sed, cut, v.v.
Tuy nhiên, trong Linux, fgrep là tiện ích được ưa chuộng nhất cho việc tìm kiếm văn bản đơn giản. Trong hướng dẫn này, chúng ta sẽ thảo luận về một số ví dụ thực hành về câu lệnh fgrep mà có thể được sử dụng hàng ngày.
Câu lệnh fgrep trong Linux thuộc họ câu lệnh grep. Tuy nhiên, nó được sử dụng để tìm kiếm mẫu chuỗi cố định thay vì biểu thức chính quy. Do đó, tên của câu lệnh là fgrep (Fixed GREP).
Cú pháp của câu lệnh fgrep tương tự với các câu lệnh grep khác trong họ:
$ fgrep [OPTIONS] PATTERNS [FILES]
Để bắt đầu, hãy 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
Ở đây, ta có thể thấy rằng tệp văn bản đã sẵn sàng với các nội dung mẫu. Bây giờ, hãy thảo luận về một số ví dụ thông thường của câu lệnh fgrep trong các ví dụ tiếp theo.
1. Sự khác biệt giữa câu lệnh fgrep và grep và egrep?
Như tên gọi, câu lệnh fgrep được sử dụng để tìm kiếm các mẫu chuỗi cố định. Nó hiểu mẫu như một chuỗi cố định thay vì một biểu thức chính quy. Do đó, nó thực hiện thao tác tìm kiếm một cách hiệu quả về thời gian.
Để hiểu sự khác biệt, hãy sử dụng một ký tự chấm (.) với câu lệnh grep.
Biểu thức chính quy đơn giản này phù hợp với bất kỳ ký tự đơn nào trừ khi kết thúc dòng:
$ grep ha. input.txt
Trong đầu ra trên, ta có thể thấy rằng ký tự chấm (.) phù hợp với văn bản "har", "hat" và "has".
Bây giờ, hãy sử dụng cùng một mẫu với câu lệnh fgrep và quan sát kết quả:
$ fgrep ha. input.txt
Trong kết quả trên, ta có thể thấy rằng câu lệnh không thể tìm thấy mẫu đã cho.
2. Cách tìm kiếm một mẫu trong một tệp
Hãy bắt đầu với ví dụ cơ bản, nơi chúng ta sẽ tìm kiếm một chuỗi "professional" trong tệp input.txt:
$ fgrep professionals input.txt
Như chúng ta có thể thấy, việc phù hợp với mẫu thành công tại hai vị trí và được đánh dấu màu đỏ.
3. Cách đặt màu đầu ra grep cho các mẫu phù hợp
Trong ví dụ trước, ta đã thấy rằng mặc định, mẫu phù hợp được đánh dấu màu đỏ. Tuy nhiên, ta có thể thay đổi hành vi này bằng cách gán giá trị khác cho biến môi trường GREP_COLOR
.
Hãy gán giá trị 32 cho biến môi trường GREP_COLOR
để làm nổi bật mẫu phù hợp bằng màu xanh lá cây:
$ export GREP_COLOR=32
$ fgrep professionals input.txt
Bây giờ, trước khi chuyển đến ví dụ tiếp theo, hãy hủy biến môi trường GREP_COLOR để kích hoạt hành vi mặc định:
$ unset GREP_COLOR
4. Cách tìm kiếm nhiều mẫu trong một tệp
Đôi khi, chúng ta cần phù hợp với nhiều chuỗi mẫu. Trong những trường hợp như vậy, ta có thể cung cấp các mẫu từ tệp văn bản thay vì đối số dòng lệnh.
Hãy tạo một tệp văn bản chứa nhiều mẫu trên các dòng riêng biệt:
$ cat pattern.txt
professionals
website
Bây giờ, hãy sử dụng tệp này với tùy chọn -f
cho việc phù hợp nhiều mẫu:
$ fgrep -f pattern.txt input.txt
Trong kết quả trên, ta có thể thấy rằng việc phù hợp với mẫu thành công cho chuỗi professionals và website.
5. Cách giới hạn số lần phù hợp trong một tệp
Mặc định, câu lệnh fgrep tiếp tục thực hiện việc phù hợp với 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ượng phù hợp. Trong những trường hợp như vậy, ta có thể sử dụng tùy chọn -m
cùng với câu lệnh:
$ fgrep -m 1 professionals input.txt
TecMint was started on 15th August 2012 by technical professionals and all the
Trong ví dụ này, câu lệnh fgrep dừng việc xử lý tệp sau khi phù hợp với mẫu đầu tiên.
6. Cách in tên tệp khi tìm kiếm mẫu
Đôi khi, chúng ta chỉ cần tìm tên của các tệp trong đó có một mẫu cụ thể. Trong những trường hợp như vậy, ta có thể sử dụng tùy chọn -l
của câu lệnh fgrep:
$ fgrep -l professionals input.txt
input.txt
Ở đây, chúng ta có thể thấy rằng câu lệnh chỉ in tên tệp thay vì các dòng với các mẫu phù hợp.
7. Cách in tên tệp khi không phù hợp với mẫu
Trong ví dụ trước, chúng ta đã thấy cách in tên tệp khi phù hợp với mẫu. Bây giờ, hãy xem xét cách thực hiện thao tác theo hướng ngược lại.
Hãy thử tì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, chúng ta đã sử dụng tùy chọn -L
của câu lệnh để in tên tệp khi phù hợp với mẫu không thành công.
8. Cách ẩn thông báo lỗi
Xử lý lỗi đóng vai trò quan trọng khi viết các tập lệnh shell. Tuy nhiên, trong một số tình huống không quan trọng, chúng ta có thể an toàn bỏ qua các thông báo lỗi.
Trong fgrep, ta có thể sử dụng tùy chọn -s
để ẩn các 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. Để hiểu hành vi này một cách tốt hơn, hãy thử tìm kiếm một mẫu trong tệp không tồn tại:
$ fgrep -s professionals non-existing-file.txt
$ echo $?
2
Trong đầu ra trên, ta có thể thấy rằng câu lệnh không hiển thị bất kỳ thông báo lỗi nào trên luồng lỗi tiêu chuẩn. Tuy nhiên, sự thất bại được báo cáo bằng giá trị trả về không phải là không chính xác.
Ngoài ra, ta cũng có thể quan sát cùng một hành vi khi tệp không thể đọc. Vì vậy, trước tiên, hãy thay đổi quyền tệp bằng câu lệnh chmod:
$ chmod 000 input.txt
$ ls -l input.txt
Bây giờ, hãy thử tìm kiếm mẫu và quan sát kết quả:
$ fgrep -s professionals input.txt
$ echo $?
9. Cách loại trừ các dòng phù hợp một phần
Trong các ví dụ trước, chúng ta đã thấy rằng câu lệnh fgrep thực hiện việc phù hợp một phần. Tuy nhiên, trong một số trường hợp, chúng ta cần sự phù hợp chính xác cho toàn bộ dòng. Trong các trường hợp như vậy, ta có thể sử dụng tùy chọn -x
của câu lệnh fgrep.
$ fgrep -nx "the same site is sometimes hard to find." input.txt
Trong đầu ra trên, việc phù hợp chính xác của dòng xảy ra ở dòng số 20.
10. Cách loại trừ các tệp trong quá trình tìm kiếm theo cách đệ quy
Đôi khi, chúng ta cần bỏ qua một số tệp trong quá trình thực hiện các hoạt động tìm kiếm. Trong những trường hợp như vậy, ta có thể sử dụng tùy chọn --exclude
của câu lệnh fgrep.
Để hiểu điều này, trước tiên hãy tạo một thư mục và sao chép một số tệp 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ờ, hãy tìm kiếm mẫu trong tất cả các tệp của thư mục dir-1 ngoại trừ các tệp “.txt”
:
$ fgrep -r --exclude *.txt professionals dir-1
Trong kết quả trên, chúng ta có thể thấy rằng việc phù hợp với mẫu đã được thực hiện trên các tệp có đuôi “.md”
và “.data”
.
11. Cách loại trừ nhiều loại tệp trong quá trình tìm kiếm theo cách đệ quy
Trong ví dụ trước, chúng ta đã thấy cách loại trừ các tệp có các phần mở rộng cụ thể. Tuy nhiên, câu lệnh trở nên dài khi chúng ta muốn loại trừ các tệp có nhiều phần mở rộng. Trong những trường hợp như vậy, ta có thể cung cấp mẫu loại trừ từ tệp văn bản thay vì đối số dòng lệnh:
Vì vậy, hã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ờ, hãy 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
Ở đây, chúng ta có thể thấy rằng việc phù hợp mẫu đã được thực hiện trên các tệp có phần mở rộng “.md”
duy nhất.
12. Cách bao gồm các tệp trong quá trình tìm kiếm theo cách đệ quy
Trong các ví dụ trước, chúng ta đã thấy cách loại trừ các tệp trong quá trình thực hiện các hoạt động tìm kiếm theo cách đệ quy. Bây giờ, hãy xem cách thực hiện hoạt động theo hướng ngược lại.
Hãy sử dụng tùy chọn --include
của câu lệnh fgrep để thực hiện tìm kiếm trên các tệp với phần mở rộng “*.txt”
:
$ fgrep -r --include "*.txt" professionals dir-1
Trong kết quả trên, chúng ta có thể thấy rằng việc phù hợp mẫu đã được bỏ qua đối với các tệp có phần mở rộng “*.md”
và “*.data”
.
Trong bài viết này, chúng ta đã thảo luận về một số ví dụ hữu ích của fgrep command. Người mới bắt đầu có thể sử dụng những ví dụ này trong cuộc sống hàng ngày để tăng năng suất khi làm việc với Linux.