6.9 KiB
ripgrep Search Patterns Reference
Practical search patterns for efficient one-shot searches with ripgrep.
One-Shot Search Strategy
Goal: Get files + line numbers + context in ONE call.
The Primary Pattern
rg -n -C 2 -t TYPE -e 'pattern'
What this gives:
-n- Line numbers-C 2- 2 lines context before/after-t TYPE- File type filter-e 'pattern'- The search pattern
Use this as the default. Adjust only when needed.
Essential Flag Combinations
1. Standard Search with Context
rg -n -C 2 -t js -e 'functionName'
Most common pattern - gives everything needed.
2. Fixed String (Literal) Search
rg -F -n -C 2 -t js -e 'exact.string.with.dots'
Use -F when pattern has regex special chars (. * ( ) etc.)
Avoids regex escaping hell.
3. Word Boundary (Precise) Search
rg -w -n -C 2 -t js -e 'variable'
-w matches whole words only. Finds "variable" but not "variableName".
4. Case-Insensitive Search
rg -i -n -C 2 -t js -e 'pattern'
-i for case-insensitive matching.
5. List Files Only (Quick Overview)
rg -l -t js -e 'pattern' | head -20
-l lists filenames only. Pipe to head to limit.
6. Count Matches
rg -c -t js -e 'pattern'
-c shows count per file.
7. Invert Match (Find Files WITHOUT Pattern)
rg -l -t js -e 'import React' | rg -v -F -e 'import { useState }'
First find files with React, then filter out files with useState.
Or simpler:
rg -L -t js -e 'pattern'
-L lists files that do NOT match.
8. Multiple Patterns (OR Logic)
rg -n -C 2 -t js -e 'pattern1' -e 'pattern2'
Matches either pattern.
9. Specific Directory
rg -n -C 2 -t js -e 'pattern' src/components
Add directory path at end to narrow scope.
Pipe Composition Patterns
Limit Results
rg -n -t js -e 'pattern' | head -30
Get first 30 result lines.
Count Total Matches
rg -n -t js -e 'pattern' | wc -l
Sort and Deduplicate
rg -o -t js -e 'import.*from.*' | sort | uniq
-o shows only matching part. Useful for extracting patterns.
Filter Results Further
rg -n -t js -e 'function' | rg -e 'export'
Find functions, then filter to only exported ones.
File Type Filters (-t)
Common types:
-t js- JavaScript (.js, .jsx, .mjs, .cjs, .vue)-t ts- TypeScript (.ts, .tsx, .cts, .mts)-t py- Python (.py, .pyi)-t go- Go (.go)-t rust- Rust (.rs)-t java- Java (.java, .jsp, .properties)-t ruby- Ruby (.rb, .gemspec, Gemfile, Rakefile)-t c- C (.c, .h)-t cpp- C++ (.cpp, .hpp, .cc, .hh)-t sh- Shell (.sh, .bash, .zsh, .bashrc)-t html- HTML (.html, .htm, .ejs)-t css- CSS (.css, .scss)-t md- Markdown (.md, .markdown, .mdx)-t json- JSON (.json)-t yaml- YAML (.yaml, .yml)
Multiple types:
rg -t js -t ts -e 'pattern'
Glob patterns (more flexible):
rg -g '*.test.js' -e 'pattern' # Test files only
rg -g '!*.test.js' -e 'pattern' # Exclude test files
rg -g 'src/**/*.js' -e 'pattern' # Specific directory pattern
Pattern Syntax Quick Reference
Literal Search (Use -F)
rg -F -e 'exact.string'
When pattern has special chars, use -F instead of escaping.
Regex Patterns
rg -e 'function\s+\w+' # Function declarations
rg -e 'import.*from\s+["\']' # Import statements
rg -e 'class\s+\w+.*\{' # Class definitions
rg -e '^\s*#' # Lines starting with #
rg -e 'TODO:|FIXME:|XXX:' # Multiple comment markers
Common Regex Elements
\s- whitespace\w- word character\d- digit.- any character.*- zero or more any character\b- word boundary (or use-wflag)^- start of line$- end of line[abc]- character class(foo|bar)- alternation
Decision Flow
Need to search code?
│
├─ Simple pattern, no special needs?
│ → Use Grep tool (structured output)
│
├─ Need one-shot with context?
│ → rg -n -C 2 -t TYPE -e 'pattern'
│
├─ Pattern has dots, parens, special chars?
│ → rg -F -n -C 2 -t TYPE -e 'exact.string'
│
├─ Need precise word matching?
│ → rg -w -n -C 2 -t TYPE -e 'word'
│
├─ Need to find files WITHOUT something?
│ → rg -L -t TYPE -e 'pattern'
│
└─ Need to compose with other commands?
→ rg -n -t TYPE -e 'pattern' | head/wc/sort/etc
Common Workflows
"Find all uses of this function"
rg -n -C 2 -t js -e 'functionName\('
Use \( to find actual calls (not definitions).
"Which files import this package?"
rg -l -t js -e 'from ["\']package-name["\']'
"How is this class used?"
rg -n -C 3 -t py -e 'ClassName'
More context (C 3) to see usage patterns.
"Find TODOs in specific directory"
rg -n -e 'TODO:' src/
"Find files that import X but not Y"
rg -l -t js -e 'import.*from.*package-x' | rg -v -F -e 'package-y'
"Count occurrences across codebase"
rg -c -t js -e 'pattern' | rg -e ':' | wc -l
Count files with matches.
Best Practices
1. Start with Standard Pattern
rg -n -C 2 -t TYPE -e 'pattern'
Adjust only if needed.
2. Use -F for Literal Strings
Don't escape regex chars - use -F:
# BAD: rg -e 'function\(\)'
# GOOD: rg -F -e 'function()'
3. Always Use Single Quotes
# GOOD: rg -e 'pattern'
# BAD: rg -e "pattern" # Shell may interpret special chars
4. Use Type Filters
# GOOD: rg -t js -e 'pattern'
# LESS GOOD: rg -e 'pattern' # Searches everything
5. Limit Large Results
rg -n -t js -e 'common_word' | head -50
6. Use -w for Precision
# Finds "test" in "testing", "latest", etc:
rg -e 'test'
# Finds only "test" as whole word:
rg -w -e 'test'
When to Use Grep Tool Instead
Use Grep tool when:
- Simple pattern with no special flags needed
- Want structured output modes (files/content/count)
- Don't need to pipe results
- Pattern doesn't need -F, -v, or -w
Use Bash(rg) when:
- Need one-shot results with context
- Need -F (literal), -v (invert), -w (word boundary)
- Want to pipe/compose with other commands
- Need maximum control and efficiency
Default to Bash(rg) for most searches - it's more efficient for one-shot results.
Summary
Default search command:
rg -n -C 2 -t TYPE -e 'pattern'
Key flags to remember:
-F- Literal search (avoid escaping)-w- Word boundaries (precise)-v- Invert match (find files WITHOUT)-l- List files only-L- List files that DON'T match
Compose with pipes:
rg ... | head -N # Limit results
rg ... | wc -l # Count
rg ... | rg ... # Filter further
This reference provides practical patterns for efficient one-shot searches.