ripgrep là gì? Công cụ tìm kiếm nhanh hơn grep trong terminal

ripgrep (rg) là một công cụ tìm kiếm trong dòng terminal được thiết kế để thay thế grep truyền thống, đặc biệt phù hợp với môi trường phát triển phần mềm hiện đại sử dụng hệ thống quản lý phiên bản như Git. Với sự kết hợp giữa tốc độ siêu nhanh, khả năng tự động tôn trọng các file bị bỏ qua như .gitignore và hỗ trợ regex hiện đại, ripgrep đã nhanh chóng trở thành lựa chọn thích hợp cho các nhà phát triển khi cần tìm kiếm nhanh trong một lớn lượng file nguồn.

Ảnh chụp màn hình ripgrep hiển thị kết quả tìm kiếm với màu sắc

So sánh ripgrep và grep truyền thống: tốc độ, độ chính xác và tính năng

Ripgrep được viết bằng ngôn ngữ Rust và tập trung vào ba mục tiêu chính: tốc độ, độ tin cậy và khả năng cấu hình linh hoạt. Trong khi grep dựa trên các thuật toán tìm kiếm nguyên thuỷ và thường bị chậm khi xử lý thư mục lớn, ripgrep áp dụng nhiều tối ưu hiện đại để vượt trội trong thực tế. Bảng dưới đây tóm tắt những điểm khác biệt nổi bật giữa hai công cụ.

Tiêu chí Grep truyền thống Ripgrep
Tìm kiếm mặc định Chỉ thư mục hiện tại (cần -r để đệ quy) Đệ quy tất cả thư mục con, tự động bỏ qua .gitignore, .ignore, .rgignore
Phát hiện file nhị phân Kiểm tra toàn bộ file (chậm) Sử dụng memory mapping (mmap) khi có lợi để chỉ đọc vài KB đầu và tìm byte NUL
Tối ưu literal search Không có Trích xuất tiền tố/hậu tố + SIMD-accelerated memchr
Song song xử lý Không Thread pool với Chase-Lev work-stealing queue (mặc định bật)
Bỏ qua file không mong muốn Cần chỉ định đường dẫn hoặc dùng find + xargs RegexSet từ ignore crate kiểm tra hàng ngàn globs trong một lần duyệt

Ripgrep tự động tôn trọng các file bị bỏ qua

Một trong những điểm mạnh lớn nhất của ripgrep là khả năng tự động phát hiện và bỏ qua các file được liệt kê trong các file cấu hình như .gitignore, .ignore (có mức ưu tiên cao hơn ở thư mục cha) và .rgignore (mức ưu tiên cao nhất). Điều này được thực hiện bằng cách đọc các file cấu hình từ thư mục hiện tại lên tới thư mục gốc và xây dựng một RegexSet tổng hợp. Nhờ vậy, khi chạy rg 'pattern' . trong một dự án Git, ripgrep sẽ tự động bỏ qua:

  • Thư mục .git/ và tất cả nội dung bên trong
  • Các file được liệt kê trong .gitignore tại thư mục hiện tại và các thư mục cha
  • Các file tạm thời được tạo ra bởi trình xây dựng (build) như *.o, *.class, *.exe
  • Các file log hoặc file cấu hình IDE (ví dụ: .vscode/, .idea/)
Ảnh chụp cây thư mục hệ thống Linux minh hoạ quá trình quét thư mục đệ quy

Trong quá trình duyệt thư mục, ripgrep không đơn giản chỉ chạy qua từng mục con mà sắp xếp công việc tìm kiếm dựa trên chế độ song song. Mỗi luồng công nhân nhận một phần thư mục để xử lý, sau đó kết quả được gộp lại và sắp xếp nếu cần. Khi người dùng chỉ định --sort path, ripgrep sẽ tắt tính năng song song và trả về kết quả theo thứ tự đường dẫn tuyệt đối, hữu ích khi cần tạo ra file log có thứ tự ổn định.

Các tuỳ chọn linh hoạt để điều chỉnh tìm kiếm

Ripgrep cung cấp hàng tá tuỳ chọn để tinh chỉnh hành vi tìm kiếm theo nhu cầu cụ thể. Một số ví dụ thường gặp bao gồm:

  • -t/--type và -T: tìm kiếm chỉ trong một loại file cụ thể (ví dụ: -t py cho file Python) hoặc loại trừ một loại file (-T py)
  • -z/--search-zip: tìm kiếm bên trong các file nén (gzip, bzip2, xz, zstd, lz4, lzma, brotli) mà không cần giải nén trước
  • --ignore-file: chỉ định file chứa các mẫu bổ sung cần bỏ qua (ví dụ: .customignore để loại trừ file log rotate)
  • --max-depth: giới hạn độ sâu tìm kiếm thư mục (ví dụ: --max-depth 3 chỉ duyệt ba cấp thư mục)
  • --type-not: kết hợp với -t để loại trừ một loại file cụ thể khỏi kết quả (ví dụ: --type-not 'markdown' để tìm trong mọi file ngoại trừ Markdown)
  • --no-mmap: buộc đọc toàn bộ file thay vì sử dụng memory mapping (hữu ích trên một số hệ thống có lỗi mmap)
  • --binary: sau khi gặp byte NUL, tiếp tục tìm kiếm trong phần còn lại của file thay vì dừng lại
Ảnh chụp màn hình terminal Bash

Ứng dụng thực tế trong phát triển phần mềm

Ripgrep không chỉ là công cụ kiểm tra lỗi nhanh mà còn được tích hợp sâu vào quy trình làm việc hàng ngày của các nhà phát triển. Dưới đây là một số trường hợp sử dụng thực tế:

  • Refactoring code: tìm tất cả nơi xuất hiện một tên hàm hoặc biến để thay đổi một cách nhất quán (ví dụ: rg 'old_function_name' .)
  • Kiểm tra bảo mật: quét tìm các chuỗi nhạy cảm như API key, mật khẩu, token trong source code và file cấu hình (ví dụ: rg --type-add 'secret:*.env' -t secret 'password|secret|key' .)
  • Phân tích log: tìm các dòng lỗi hoặc cảnh báo trong file log xoay vòng (ví dụ: rg -i 'error|fail|exception' *.log)
  • Tích hợp với trình soạn thảo: các plugin như ripgrep-rg cho Vim/Neovim hoặc vscode-ripgrep cho VS Code cho phép tìm kiếm tức thời trong dự án mà không cần rời khỏi môi trường viết code.

Nguồn tham khảo

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

VLC media player là gì: trình phát đa năng cho mọi định dạng

VLC media player là trình phát đa năng mã nguồn mở do dự án VideoLAN phát triển, chạy được trên máy tính lẫn điện thoại. Nhờ đọc được gần như…

Xem thêm
Hộp thoại tạo mật khẩu ngẫu nhiên trong KeePass với bộ tạo ký tự tích hợp

KeePass là gì: Quản lý mật khẩu mã hóa mã nguồn mở miễn phí

KeePass là gì: Quản lý mật khẩu mã hóa mã nguồn mở miễn phí KeePass là phần mềm quản lý mật khẩu mã nguồn mở, cho phép lưu trữ hàng…

Xem thêm
Giao diện danh sách workflow GitHub Actions hiển thị trạng thái chạy thành công của các pipeline tự động

GitHub Actions tự động hoá CI/CD: workflow, cache, secrets

GitHub Actions là hệ thống tự động hoá tích hợp và triển khai (CI/CD) tích hợp sẵn trong mọi kho mã nguồn trên GitHub. Chỉ cần một file YAML đặt…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất