Modern CLI Tools
Use faster, ergonomic command-line tools installed on this system. Pick the tool
by target, not habit. Habit is how grep -R survives.
Quick Reference
- Search code structure —
ast-grep/sg(vs grep): AST-aware patterns, language constructs, safer refactor candidate search. - Search text —
rg(vs grep): fast literal/regex search, respects.gitignore. - Find files —
fd(vs find): simpler syntax, ignores.git. - View files —
bat(vs cat): syntax highlighting, line numbers. - List files —
eza(vs ls): icons, git status, tree view. - Replace text —
sd(vs sed): intuitive regex, preview mode. - Disk usage —
dust(vs du): visual tree, sorted by size. - Processes —
procs(vs ps): tree view, sortable columns. - Diff files —
delta(vs diff): syntax highlighting, side-by-side.
Search Decision Tree
- Code shape or language construct? Use
ast-grep/sg. - Exact text, docs, logs, comments, config keys? Use
rg. - File or directory names? Use
fd. - Legacy
grep/findonly if the modern tool is missing.
Examples
# Structural code search: ast-grep before rg
ast-grep run --pattern 'console.log($$$)' --lang javascript .
ast-grep run --pattern 'func $NAME($$$) { $$$ }' --lang go .
ast-grep scan --inline-rules 'id: await-in-func
language: javascript
rule:
kind: function_declaration
has:
pattern: await $EXPR
stopBy: end
' .
# Text search: rg instead of grep
rg "TODO" --type go # Search Go files
rg -A 3 "error" # 3 lines after match
rg -l "import" # List files only
# Find files: fd instead of find
fd "\.go$" # Find Go files
fd -e json src/ # By extension in src/
fd -x wc -l {} # Execute on matches
# View: bat instead of cat
bat main.go # With syntax highlighting
bat -n file.py # Line numbers only
# List: eza instead of ls
eza -la --git # Long format with git status
eza --tree -L 2 # Tree view, 2 levels
# Replace: sd instead of sed
sd "old" "new" file.txt # Simple replacement
sd -p "pattern" "new" file # Preview changes first
sd -p 'colour' 'color' docs/**/*.md # Preview only; do not apply without explicit ask
# Disk: dust instead of du
dust -d 2 # 2 levels deep
# Processes: procs instead of ps
procs --tree # Process tree
Rules
- For code-structure searches, try
ast-grepbeforerg. Examples: function declarations, call expressions, code inside methods, missing error handling, framework usage patterns. - For plain text, docs, logs, and config keys, use
rg; ast-grep is the wrong hammer. - For file discovery, use
fdbeforefind. - For preview-only replacement tasks, use
sd -pand state it is preview-only. Do not emit a non-previewsdcommand unless the user explicitly asked to apply. - If a modern tool is not on
PATH, fall back to the legacy equivalent and note the fallback. - Do not install missing tools silently; report what is missing and suggest the relevant install command.
Install Hints
brew install ast-grep ripgrep fd bat eza sd dust procs git-delta
npm install -g @ast-grep/cli
cargo install ast-grep
Productivity Tools
# Fuzzy finder
vim $(fd . | fzf)
rg "pattern" | fzf
# Benchmarking
hyperfine "rg pattern" "grep -r pattern"
# Code statistics
tokei .
# Markdown preview
glow README.md
# JSON/YAML processing
jq '.key' file.json
yq '.key' file.yaml