基础用法
运行 grep
grep "pattern" file.txt # search in file grep "error" *.log # search multiple files grep "hello" file1.txt file2.txt # explicit file list cat file.txt | grep "pattern" # pipe input dmesg | grep -i "usb" # filter command output
常用选项
-i不区分大小写
-v反向匹配——打印不匹配的行
-c打印匹配行数
-n显示行号
-l仅列出含匹配的文件名
-L仅列出不含匹配的文件名
-w仅匹配完整单词
-x仅匹配整行
正则模式
基础正则(BRE)
.任意单个字符
*前一元素零个或多个
^行首
$行尾
[abc]字符类——a、b、c 之一
[^abc]否定类——非 a、b、c
[a-z]范围——小写字母
\<, \>词边界(GNU)
\( \), \1捕获组与反向引用
BRE 示例
grep '^#' file.conf # lines starting with # grep 'error$' file.log # lines ending with error grep '^$' file.txt # blank lines grep 'col[ou]r' file.txt # match color or colour
扩展正则
扩展正则(ERE)
+前一元素一个或多个
?前一元素零个或一个
{n}精确重复 n 次
{n,m}重复 n 到 m 次
(a|b)交替——匹配 a 或 b
( )分组(无需反斜杠)
ERE 示例
grep -E '[0-9]{3}-[0-9]{4}' f # phone number pattern grep -E '(error|warn|fatal)' f # multiple patterns grep -E '^[A-Z][a-z]+' f # capitalized words grep -P '\d{1,3}\.\d{1,3}' f # Perl regex: IP fragments
上下文行
上下文示例
grep -B 3 "error" app.log # 3 lines before match grep -A 5 "FAIL" test.log # 5 lines after match grep -C 2 "crash" kern.log # 2 lines before and after grep --group-separator="---" -C 1 "err" f # custom separator
上下文选项
-B N显示匹配前 N 行
-A N显示匹配后 N 行
-C N显示匹配前后各 N 行
--group-separator=str匹配组之间的分隔符(默认 --
--color=auto在终端高亮匹配内容
递归搜索
递归示例
grep -r "TODO" . # recursive from current dir grep -rn "FIXME" src/ # recursive with line numbers grep -r --include="*.py" "import" . # only .py files grep -r --exclude="*.log" "error" . # skip .log files grep -r --exclude-dir=node_modules "require" .
递归选项
-r / --recursive递归搜索目录
-R类似 -r 但跟随符号链接
--include=glob仅搜索匹配 glob 的文件
--exclude=glob跳过匹配 glob 的文件
--exclude-dir=dir跳过匹配名称的目录
--include-dir=dir仅搜索匹配名称的目录
计数与列出
计数与列出示例
grep -c "error" *.log # count matches per file grep -l "TODO" src/*.py # list files with TODOs grep -L "test" src/*.py # files missing "test" grep -o "http[^ ]*" page.html # extract matching parts only grep -c '' file.txt # count total lines (like wc -l)
输出选项
-c每个文件的匹配行数
-l仅打印含匹配的文件名
-L仅打印不含匹配的文件名
-o仅打印匹配的部分
-H / -h显示 / 隐藏文件名前缀
-Znull 分隔输出(配合 xargs -0)
反向匹配
取反与排除
grep -v "^#" config.conf # remove comment lines grep -v "^$" file.txt # remove blank lines grep -v -e "debug" -e "trace" app.log # exclude two patterns grep -v "pattern" f | grep "other" # chain: NOT A, then B
过滤策略
-v反向匹配——选出不匹配的行
-v with -e排除多个模式
pipe chain链式 grep 实现复杂过滤
grep -v '^$' | grep -v '^#'去除空行和注释行
-v with -c统计不匹配的行数
多模式
多模式示例
grep -e "error" -e "warning" app.log grep -E "error|warning|fatal" app.log grep -f patterns.txt file.txt # patterns from file grep -w -e "GET" -e "POST" access.log
模式选项
-e pattern指定模式(可多次使用)
-f file从文件读取模式(每行一个)
-E 'a|b|c'ERE 交替匹配多个模式
-F固定字符串——无正则,速度更快
-G基础正则(默认模式)
-PPerl 兼容正则(PCRE)
性能
性能技巧
-F (fgrep)固定字符串模式——字面量搜索最快
LC_ALL=C grep绕过 locale,ASCII 数据快 2-10 倍
--include/--exclude打开文件前先缩小搜索范围
-m N每个文件匹配 N 次后停止
-q静默模式——第一次匹配即退出(脚本用)
ripgrep (rg)兼容替代;大仓库速度更快
性能示例
LC_ALL=C grep -F "exact string" huge.log grep -r -m 1 "needle" /var/log/ # stop after first hit grep -rq "pattern" . && echo "found" # boolean test grep -r --include="*.go" "func main" .
常用模式
一行命令
grep -rn "TODO\|FIXME\|HACK" src/ # find code markers grep -oP '(?<=")[^"]+(?=")' f # extract quoted strings grep -E '^\s*$' f | wc -l # count blank lines grep -c '' *.py | sort -t: -k2 -rn # sort files by line count grep -rn --include="*.yaml" "password" . # audit for secrets
实用示例
IP 地址grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}'
邮箱地址grep -oE '[a-zA-Z0-9._%+-]+@[a-z.-]+'
URLgrep -oE 'https?://[^ ]+'
标记间的行grep -A999 'START' f | grep -B999 'END'
唯一匹配grep -oE 'pattern' f | sort -u
按模式计数grep -c 'pat1' f; grep -c 'pat2' f