Feature comparison of ack, ag, git-grep, GNU grep and ripgrep

There are many greplike tools available to choose from. ripgrep is currently the fastest, which folks seem to focus on, but they have different features. Here's a chart to help you see which tools can do what.

If you find this chart useful, consider making one for the projects you run, even if it includes "competing" projects. The best project for someone might not be your project, and that's OK.

If you have updates to the chart, please submit as a GitHub issue.

ack ag git-grep GNU grep rg
Name ack The Silver Searcher git-grep GNU grep ripgrep
Project page Link Link Link Link Link
Language Perl C C C Rust
License Artistic License 2.0 Apache License 2.0 GPL 2 GPL 3 MIT/Unlicense
Regular expressions Native Perl Perl-compatible Basic, extended, or Perl-compatible Basic, extended, or Perl-compatible (experimental) Fast non-backtracking, Perl-compatible, or automatic selection
Feature ack ag git-grep GNU grep rg
Search where anywhere anywhere git repository by default, or anywhere with --no-index anywhere anywhere
Search git history ✔
Include/exclude files by filetype ✔ ✔ ✔
Specify filetype by file extension ✔ ✔ ✔
Specify filetype by pattern match on filename ✔ ✔ ✔ ✔
Specify filetype by pattern match on first line of file ✔
Configuration file System-, user- and project-level System-, user- and project-level Specified by RIPGREP_CONFIG_PATH environment variable
Ignore files based on .gitignore or .ignore files ✔ ✔ ✔
Parallelism ✔, threads ✔, threads ✔, threads
Deterministic output ✔, using --sort-files ✔, using --sort path
Match patterns across newlines ✔ ✔
Smart case searching ✔ ✔ ✔
Multiple patterns with boolean expressions ✔
Print lines by number ✔
Show proximity of matches to other matches ✔, in ack 3
Build output for each line based on match groups ✔ ✔
Limit length of output lines ✔ ✔
Underline matches to show matches w/o color ✔
Search in gzip files ✔ ✔
Searching ack ag git-grep GNU grep rg
Ignore case ✔ ✔ ✔ ✔ ✔
Smart case searching (case-insensitive unless the pattern contains a capital letter) ✔ ✔ ✔
Re-enable case-sensitive search over case-insensitive or smart-case search ✔ ✔ ✔ ✔
Match whole words ✔ ✔ ✔ ✔ ✔
Invert match ✔ ✔ ✔ ✔ ✔
Match entire line only ✔ ✔
Specify pattern explicitly ✔ ✔ ✔ ✔
Read patterns from a file ✔ ✔ ✔
Specify multiple patterns with boolean expressions ✔
Match patterns across newlines ✔ ✔
Print specific lines by number ✔
Regular expressions ack ag git-grep GNU grep rg
Use fixed strings, not regular expressions, for a literal match ✔ ✔ ✔ ✔ ✔
Use basic regular expressions ✔ ✔
Use extended regular expressions ✔ ✔
Use Perl (or Perl-compatible) regular expressions ✔ ✔ ✔ ✔ ✔
Search output ack ag git-grep GNU grep rg
Print only filenames that contain matches ✔ ✔ ✔ ✔ ✔
Print only filenames that do not contain matches ✔ ✔ ✔ ✔ ✔
Show only the part of a line that matched ✔ ✔ ✔ ✔
Specify output for each line match ✔ ✔
Print the filename for each match ✔ ✔ ✔ ✔ ✔
Suppress the prefixing filename on output ✔ ✔ ✔ ✔ ✔
Print paths relative to the project top directory ✔
Prefix the line number to matching lines ✔ ✔ ✔ ✔
Suppress line numbers ✔ ✔ ✔
Print a heading of each file's name before its matches ✔ ✔ ✔ ✔
Specify filename to show for matches on STDIN ✔
Show the column number of the first match ✔ ✔ ✔
Print lines of context after matches ✔ ✔ ✔ ✔ ✔
Print lines of context before matches ✔ ✔ ✔ ✔ ✔
Print lines of context before and after matches ✔ ✔ ✔ ✔ ✔
Show number of lines matching per file ✔ ✔ ✔ ✔ ✔
Print null byte as separator between filenames ✔ ✔ ✔ ✔ ✔
Stop searching in each file after NUM matches ✔ ✔ ✔ ✔
Stop searching after one match of any kind ✔
Print the byte offset within the file before each line ✔ ✔
Suppress error messages about nonexistent or unreadable files ✔ ✔ ✔ ✔
Limit length of output lines ✔ ✔
Do not output matched lines ✔ ✔ ✔
Print stats (files scanned, time taken, etc.) ✔ ✔
File presentation ack ag git-grep GNU grep rg
Enable color output ✔ ✔ ✔ ✔ ✔
Underline matches ✔
Set colors for various output items ✔ ✔ ✔ ✔ ✔
Pipe output through a pager or other command ✔ ✔
Separate match output with blank lines unless they are on adjacent lines ✔
Group together all matches in a file ✔ ✔ ✔
Specify group separator ✔
Show the function name of the match ✔
Show the function in which a match was found ✔
Print a break between results from different files ✔ ✔
Flush output on every line ✔ ✔ ✔
File finding ack ag git-grep GNU grep rg
Only print the files selected, without searching ✔ ✔
Show which types each file has ✔
List searchable files that match a pattern ✔ ✔ ✔
Read the list of files to search from FILE ✔
Sort the found files lexically ✔ ✔
Read the list of files to search from STDIN ✔
Limit search to filenames matching a pattern ✔ ✔
Search hidden files ✔ ✔
File inclusion/exclusion ack ag git-grep GNU grep rg
Search only files of a given type ✔ ✔ ✔
Exclude files of a given type ✔ ✔
Recurse into subdirectories ✔ ✔ ✔ ✔
Recurse into subdirectories, following symlinks ✔ ✔
No descending into subdirectories ✔ ✔ ✔
Add/remove directory from list of ignored dirs ✔ ✔ ✔
Don't respect ignore files (.gitignore, .ignore, etc) ✔
Ignore files larger than a given size ✔
Specify files to search ✔ ✔
Ignore files/directories matching ✔ ✔ ✔
Add filter for ignoring files ✔ ✔
Include only files of recognized types ✔ ✔
Follow symlinks ✔ ✔ ✔
Don't follow links to other devices ✔ ✔ ✔
Search all types of files ✔
Limit directory search depth ✔ ✔ ✔
Search binary files ✔ ✔
Treat files as binary ✔
Don't search in binary files ✔
Treat binary files as if they were text ✔ ✔
Search all text files ✔ ✔
Search all files ✔ ✔
Skip rules found in VCS ignore files (.gitignore, .hgignore, etc) ✔ ✔ ✔
File type specification ack ag git-grep GNU grep rg
Create a filetype, replacing the previous specs ✔
Add specifications to an existing filetype ✔ ✔
Remove a file type ✔ ✔
Ignore default type definitions ✔
Display all known types ✔ ✔ ✔
Miscellaneous ack ag git-grep GNU grep rg
Print all lines, whether matching or not ✔ ✔ ✔
Outputs a default ackrc for your customization to standard output ✔
Dump information on which options are loaded ✔ ✔
Specify a configuration file to use ✔
Ignore environment variables and global configuration files ✔ ✔
Treat standard input as a pipe ✔
Search contents of compressed files (e.g. gzip) ✔ ✔
Specify input file encoding ✔