Sử dụng grep
để tìm kiếm văn bản
1. grep
là gì?
grep
— là một công cụ mạnh mẽ trên dòng lệnh để tìm kiếm các dòng khớp với một mẫu nhất định trong các tệp văn bản. Hãy nghĩ về grep
như một "thám tử" trong thế giới Linux: nó tìm "dấu vết" (mẫu văn bản) trong "hồ sơ" (tệp) và báo cáo nơi chúng ở.
Tên gọi grep
được bắt nguồn từ lệnh trong trình soạn thảo văn bản ed
: g/re/p
, được hiểu là "tìm kiếm toàn cục theo biểu thức chính quy và hiện kết quả tìm thấy".
grep
được sử dụng rộng rãi: từ việc tìm lỗi trong nhật ký đến phân tích dữ liệu hệ thống. Nó không kiểu cách và sẵn sàng làm việc với bất kỳ văn bản nào — có thể là nhật ký cá nhân của bạn hoặc nhật ký từ máy chủ.
2. Cú pháp cơ bản
Cấu trúc lệnh:
grep [tùy chọn] "mẫu" tệp
- [tùy chọn] — các thiết lập bổ sung cho lệnh.
- "mẫu" — văn bản hoặc biểu thức chính quy để tìm kiếm.
- tệp — tên của tệp hoặc các tệp bạn muốn tìm kiếm trong đó.
Nếu bạn muốn tìm kiếm văn bản trong nhiều tệp, chỉ cần liệt kê chúng cách nhau bằng khoảng trắng, hoặc sử dụng các ký tự *
và ?
để làm việc với nhóm tệp.
Ví dụ:
grep "error" /var/log/syslog
3. Các tùy chọn để tìm kiếm thuận tiện
1. -i
: Bỏ qua chữ hoa/thường
Tùy chọn này cho phép bạn tìm kiếm văn bản bất kể được viết bằng chữ hoa hay chữ thường. Ví dụ, Error
, ERROR
và error
sẽ được tìm thấy cùng lúc.
Ví dụ sử dụng:
grep -i "error" application.log
2. -v
: Tìm kiếm đảo ngược
With great power comes great responsibility... Đôi khi điều quan trọng là tìm mọi thứ mà không khớp với mẫu. Ví dụ, loại bỏ các dòng chứa "debug".
Ví dụ sử dụng:
grep -v "debug" system.log
3. -n
: Hiển thị số dòng
Khi tệp chứa nhiều dòng, sẽ hữu ích khi xác định chính xác vị trí dòng phù hợp. Cờ -n
thêm số dòng vào mỗi dòng tìm thấy.
Ví dụ sử dụng:
grep -n "error" server.log
4. -r
hoặc -R
: Tìm kiếm đệ quy
Bạn có thể tìm kiếm mẫu văn bản trong các tệp không chỉ trong thư mục hiện tại mà còn trong tất cả các thư mục con của nó. Cẩn thận nếu bạn có hàng ngàn tệp!
Ví dụ sử dụng:
grep -r "keyword" /home/user/documents
4. Ví dụ sử dụng
1. Tìm kiếm chính xác
Tìm từ "hello" trong tệp example.txt
:
grep "hello" example.txt
2. Tìm kiếm đoạn chuỗi
Thử tìm các dòng chứa tên người dùng, ví dụ, "John":
grep "John" database.txt
3. Tìm kiếm có phân biệt chữ hoa, chữ thường
Tìm chính xác "ERROR", không nhầm lẫn với "error" hoặc "Error":
grep "ERROR" log.txt
4. Tìm kiếm đệ quy trong thư mục
Tìm các dòng có thông báo "fatal error" trong tất cả các tệp của thư mục hiện tại và thư mục con:
grep -r "fatal error" .
5. Tìm kiếm đảo ngược
Hiển thị tất cả các dòng không chứa từ "error":
grep -v "error" server.log
6. Chỉ hiển thị 10 kết quả đầu tiên
Nếu nhật ký quá dài, bạn có thể giới hạn ở N thông báo đầu tiên:
grep "error" log.txt | head -n 10
7. Đếm số dòng có lỗi
Bạn có thể chỉ đơn giản đếm số dòng có lỗi để chuẩn bị tinh thần làm việc:
grep -c "error" log.txt
8. Sử dụng bộ lọc
Nếu trong nhật ký có nhiều rác văn bản, hãy sử dụng bộ lọc. Ví dụ, dưới đây chúng ta tìm lỗi liên quan đến bộ nhớ trong nhật ký:
cat /var/log/syslog | grep "memory"
5. Kết hợp grep
với các lệnh khác
Trên Linux, các lệnh thường làm việc nhóm với nhau (xin lỗi vì sự lặp từ). Sử dụng dấu ống |
, chúng ta có thể kết hợp grep
với các tiện ích khác. Hãy cùng xem vài ví dụ thực tế nha.
1. Lọc thông báo hệ thống
Muốn biết chỉ về lỗi của thiết bị USB thôi hả? Dễ lắm!
dmesg | grep "usb"
Ở đây ta chuyển kết quả của lệnh dmesg
(xem thông báo hệ thống) cho grep
.
2. Áp dụng bộ lọc
Nếu trong log có quá nhiều thông tin không cần thiết, thì dùng bộ lọc thôi. Ví dụ, chúng ta tìm lỗi liên quan đến bộ nhớ trong log:
cat /var/log/syslog | grep "memory"
3. Tìm kiếm trong các tiến trình
Danh sách tất cả các tiến trình đang chạy liên quan đến nginx
:
ps aux | grep "nginx"
6. Khả năng nâng cao: Biểu thức chính quy
Nếu việc tìm kiếm đơn giản là không đủ, grep
hỗ trợ một công cụ mạnh mẽ – biểu thức chính quy. Đừng sợ, không khó như bạn nghĩ đâu.
Ví dụ về biểu thức chính quy
Tìm kiếm các dòng bắt đầu bằng "error":
grep "^error" logfile.txt
Giải thích:
- Ký tự
^
có nghĩa là "bắt đầu của dòng".
Tìm kiếm các dòng kết thúc bằng ".conf":
grep "\.conf$" filelist.txt
Giải thích:
- Ký tự
$
biểu thị cuối dòng. - Dấu gạch chéo
\
làm thoát ký tự.
, để nó được nhận diện là một dấu chấm thật, không phải bất kỳ ký tự nào.
Biểu thức chính quy là một công cụ cực kỳ mạnh mẽ. Đôi khi, thậm chí còn quá mạnh mẽ. Đùa chút: nếu bạn gặp một vấn đề và muốn giải quyết nó bằng biểu thức chính quy, thì bạn đã có hai vấn đề.
7. Bài tập thực hành
Để củng cố kiến thức, hãy thực hiện các bài tập sau:
Trong file
access.log
, tìm các dòng chứa mã phản hồi từ server "404":grep "404" access.log
Trong thư mục
/var/log
, tìm tất cả các dòng chứa từ "error", không phân biệt chữ hoa/thường:grep -ri "error" /var/log
Hiển thị tất cả các dòng từ file
database.log
mà không chứa từ "DEBUG":grep -v "DEBUG" database.log
Tìm trong các log hệ thống các dòng chứa ngày tháng "Oct 15":
grep "Oct 15" /var/log/syslog
Hiển thị các dòng từ file
application.log
có kết quả khớp với "timeout", nhưng chỉ định số dòng:grep -n "timeout" application.log
8. Lỗi thường gặp và đặc điểm
Nếu không có kết quả hiển thị, điều này không nhất thiết là lỗi. Có thể không có sự trùng khớp nào cả. Hãy thử kiểm tra tệp bằng lệnh như
cat
để đảm bảo rằng trong tệp có văn bản.Chú ý đến dấu ngoặc kép. Nếu mẫu chứa khoảng trắng hoặc ký tự đặc biệt, nhớ đặt nó trong dấu ngoặc kép.
Khi làm việc với các thư mục lớn và sử dụng cờ
-r
, hãy sẵn sàng đối mặt với lượng đầu ra lớn. Sử dụng| less
để xem thuận tiện hơn. Ví dụ:grep -r "test" /some/directory | less
Bây giờ, khi bạn đã nắm vững cách sử dụng grep
, bạn đã sẵn sàng tìm kiếm bất cứ thứ gì và ở bất cứ đâu. Từ việc tìm kiếm lỗi trong cơ sở mã khổng lồ đến kiểm tra nhật ký hệ thống — kỹ năng tìm kiếm của bạn sẽ trở thành công cụ ưa thích nhất.
GO TO FULL VERSION