Grep 例程大全
📚 Grep 基础语法
复制代码
grep [选项] 模式 [文件...]
grep [选项] -e 模式1 -e 模式2 [文件...]
grep [选项] -f 模式文件 [文件...]
🔧 常用选项
| 选项 |
说明 |
-i |
忽略大小写 |
-v |
反向匹配(显示不匹配的行) |
-n |
显示行号 |
-c |
统计匹配行数 |
-l |
只显示包含匹配的文件名 |
-L |
只显示不包含匹配的文件名 |
-h |
不显示文件名(多文件时) |
-H |
总是显示文件名 |
-r |
递归搜索目录 |
-R |
同 -r,但跟踪符号链接 |
-w |
匹配整个单词 |
-x |
匹配整行 |
-o |
只输出匹配的部分 |
-q |
静默模式(不输出) |
-s |
不显示错误信息 |
-E |
使用扩展正则表达式 |
-F |
固定字符串(禁用正则) |
-P |
Perl正则表达式(功能最强) |
-A n |
显示匹配行及后n行 |
-B n |
显示匹配行及前n行 |
-C n |
显示匹配行及前后各n行 |
--color |
高亮显示匹配部分 |
🔍 基础搜索
1. 简单文本搜索
复制代码
# 基本搜索
grep "pattern" file.txt
# 多个文件
grep "pattern" file1.txt file2.txt
# 当前目录所有txt文件
grep "pattern" *.txt
# 忽略大小写
grep -i "pattern" file.txt
# 显示行号
grep -n "pattern" file.txt
2. 递归搜索
复制代码
# 递归搜索当前目录
grep -r "pattern" .
# 递归搜索,只显示文件名
grep -rl "pattern" .
# 递归搜索特定类型文件
grep -r "pattern" --include="*.py" .
grep -r "pattern" --include="*.{py,js}" .
# 排除某些目录
grep -r "pattern" --exclude-dir={.git,node_modules} .
grep -r "pattern" --exclude-dir=.git --exclude-dir=node_modules .
📝 模式匹配
1. 基本正则表达式
复制代码
# 任意单个字符
grep "a.b" file.txt # a后跟任意字符再跟b
# 行首
grep "^start" file.txt
# 行尾
grep "end$" file.txt
# 空行
grep "^$" file.txt
# 包含空格的行
grep "[[:space:]]" file.txt
# 数字
grep "[0-9]" file.txt
grep "[[:digit:]]" file.txt
# 字母
grep "[a-zA-Z]" file.txt
grep "[[:alpha:]]" file.txt
# 单词字符(字母、数字、下划线)
grep "[[:alnum:]_]" file.txt
grep "\w" file.txt # 需要 -P 或 -E
2. 扩展正则表达式(-E)
复制代码
# 使用扩展正则
grep -E "pattern1|pattern2" file.txt
grep -E "(abc|def)" file.txt
# 量词
grep -E "a{3}" file.txt # 3个a
grep -E "a{3,5}" file.txt # 3-5个a
grep -E "a{3,}" file.txt # 至少3个a
grep -E "a+" file.txt # 1个或多个a
grep -E "a*" file.txt # 0个或多个a
grep -E "a?" file.txt # 0个或1个a
# 分组
grep -E "(abc)+" file.txt # abc出现一次或多次
3. Perl正则表达式(-P)
复制代码
# 使用Perl正则(功能最强)
grep -P "\d+" file.txt # 数字
grep -P "\s+" file.txt # 空白字符
grep -P "\w+" file.txt # 单词字符
grep -P "\bword\b" file.txt # 单词边界
# 非贪婪匹配
grep -P "a.*?b" file.txt # 匹配最短的a...b
# 向前向后查找
grep -P "abc(?=def)" file.txt # 匹配后面是def的abc
grep -P "(?<=abc)def" file.txt # 匹配前面是abc的def
grep -P "abc(?!def)" file.txt # 匹配后面不是def的abc
grep -P "(?<!abc)def" file.txt # 匹配前面不是abc的def
🎯 精确匹配
1. 单词匹配
复制代码
# 全单词匹配(-w)
grep -w "word" file.txt # 匹配 "word",不匹配 "words"
grep -w "is" file.txt # 匹配 "is",不匹配 "this"
# 整行匹配(-x)
grep -x "exact line" file.txt # 只匹配完全相同的行
2. 固定字符串(-F)
复制代码
# 禁用正则,按字面搜索
grep -F "a.b" file.txt # 搜索 "a.b",不把 . 当通配符
grep -F ".*" file.txt # 搜索 ".*",不匹配任意字符
# 搜索特殊字符
grep -F "$PATH" file.txt # 搜索 "$PATH"
grep -F "[test]" file.txt # 搜索 "[test]"
📊 上下文显示
1. 显示上下文
复制代码
# 显示匹配行及后2行
grep -A 2 "pattern" file.txt
# 显示匹配行及前2行
grep -B 2 "pattern" file.txt
# 显示匹配行及前后各2行
grep -C 2 "pattern" file.txt
# 组合使用
grep -A 1 -B 1 "pattern" file.txt # 前后各1行
# 带行号
grep -n -C 2 "pattern" file.txt
2. 只显示匹配部分
复制代码
# 只输出匹配的部分(-o)
grep -o "pattern" file.txt
# 统计每个匹配的数量
grep -o "pattern" file.txt | wc -l
# 提取IP地址
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt
# 提取邮箱
grep -o -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
🔄 组合使用
1. 管道组合
复制代码
# 统计出现频率
grep -o "pattern" file.txt | sort | uniq -c | sort -nr
# 过滤ps输出
ps aux | grep "python" | grep -v "grep"
# 搜索压缩文件
zgrep "pattern" file.gz
bzcat file.bz2 | grep "pattern"
# 多级过滤
grep "error" log.txt | grep -v "warning" | grep -n "fatal"
2. 多模式匹配
复制代码
# 使用 -e 指定多个模式
grep -e "pattern1" -e "pattern2" file.txt
# 使用 -f 从文件读取模式
grep -f patterns.txt file.txt
# 同时使用多个选项
grep -rin "error" --include="*.log" .
📈 统计和过滤
1. 统计功能
复制代码
# 统计匹配行数
grep -c "pattern" file.txt
# 统计多个文件的匹配总数
grep -c "pattern" *.txt
# 统计匹配次数(-o配合wc)
grep -o "pattern" file.txt | wc -l
# 显示匹配的文件名
grep -l "pattern" *.txt
# 显示不匹配的文件名
grep -L "pattern" *.txt
2. 过滤排除
复制代码
# 排除特定模式
grep -v "exclude" file.txt
# 排除多个模式
grep -v -e "pattern1" -e "pattern2" file.txt
# 排除空行和注释
grep -v "^$" file.txt | grep -v "^#"
# 排除目录
grep -r "pattern" . --exclude-dir=.git --exclude-dir=node_modules
# 排除文件类型
grep -r "pattern" . --exclude="*.min.js" --exclude="*.min.css"
🛠️ 实用例程
1. 日志分析
复制代码
# 提取特定时间段的日志
grep "2024-01-15 1[0-2]:" access.log
# 查找错误和警告
grep -E "(ERROR|WARN|FATAL)" app.log
# 查找HTTP状态码
grep -E "HTTP/1\.[01]\" [4-5][0-9][0-9]" access.log
# 统计IP访问次数
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | sort | uniq -c | sort -nr
# 查找慢查询(>5秒)
grep "execution time: [5-9][0-9][0-9][0-9]" db.log
2. 代码搜索
复制代码
# 查找函数定义
grep -n "def " *.py
grep -n "function " *.js
# 查找TODO/FIXME注释
grep -r -n "TODO\|FIXME\|XXX" --include="*.{py,js,jsx,ts,tsx}" .
# 查找未使用的导入(Python)
grep -r "import " *.py | grep -v "^\s*#" | cut -d: -f2 | sort | uniq
# 查找console.log(调试语句)
grep -r "console\.log\|print(" --include="*.{js,py}" .
# 查找硬编码的字符串
grep -r '"\(password\|secret\|key\)"' --include="*.py" .
3. 配置文件处理
复制代码
# 查找有效配置(非注释行)
grep -v "^#" config.conf | grep -v "^$"
# 查找特定配置项
grep -E "^[[:space:]]*server_name" nginx.conf
# 查找环境变量定义
grep -E "^export [A-Z_]+=" .bashrc
# 检查重复配置
grep -E "^[[:space:]]*[a-zA-Z]" config.conf | sort | uniq -d
4. 系统管理
复制代码
# 查找运行中的进程
ps aux | grep "[a]pache" # 技巧:用 [] 排除grep自身
ps aux | grep -i "mysql"
# 查找特定用户进程
ps aux | grep "^username"
# 查找大文件
find . -type f -size +100M | grep -v ".git"
# 检查端口占用
netstat -tulpn | grep ":80"
# 查找特定权限的文件
ls -la | grep "^d[rwx-]\{9\}.*root"
5. 数据处理
复制代码
# 提取CSV特定列(第3列为"error"的行)
awk -F',' '$3 == "error"' file.csv | grep "pattern"
# 提取JSON值(简单情况)
grep -o '"name":"[^"]*"' data.json
# 提取XML标签内容
grep -o '<title>[^<]*</title>' file.xml
# 提取URL
grep -o -E "https?://[a-zA-Z0-9./?=_%:-]*" file.txt
# 提取版本号
grep -o -E "[0-9]+\.[0-9]+(\.[0-9]+)?" file.txt
🎪 高级技巧
1. 彩色输出
复制代码
# 启用颜色(默认自动检测)
grep --color=auto "pattern" file.txt
# 强制启用颜色
grep --color=always "pattern" file.txt | less -R
# 自定义颜色
GREP_COLORS='mt=01;31' grep "pattern" file.txt # 红色粗体
# 可用颜色: mt=匹配文本, ms=选择匹配, mc=上下文匹配, sl=选择行, cx=上下文行, rv=反转视频, fn=文件名, ln=行号, bn=字节偏移, se=分隔符
2. 二进制文件处理
复制代码
# 在二进制文件中搜索文本
grep -a "text" binary_file
# 搜索时忽略二进制文件
grep -I "pattern" * # 等价于 --binary-files=without-match
# 强制当作文本处理
grep --binary-files=text "pattern" file
3. 多字节字符支持
复制代码
# 处理UTF-8等编码
grep -P "[\x{4e00}-\x{9fff}]" file.txt # 匹配中文字符
grep -P "[\p{Han}]" file.txt # 匹配汉字(Perl类)
# Unicode字符类
grep -P "\p{L}" file.txt # 任何字母
grep -P "\p{N}" file.txt # 任何数字
grep -P "\p{P}" file.txt # 任何标点
4. 性能优化
复制代码
# 快速搜索(固定字符串)
grep -F "exact_string" large_file.txt
# 限制搜索深度
grep -r --max-depth=2 "pattern" .
# 使用fgrep(固定字符串grep)
fgrep "fixed_string" file.txt
# 并行搜索(使用GNU parallel)
find . -name "*.log" -type f | parallel grep -H "pattern" {}
📋 实用单行命令
1. 文件处理
复制代码
# 删除空行
grep -v "^$" file.txt > newfile.txt
# 提取注释
grep "^#" config.conf > comments.txt
# 提取非注释配置
grep -v "^#" config.conf | grep -v "^$" > clean_config.conf
# 查找重复行
grep -n "^.*$" file.txt | sort -k2 | uniq -df1
# 统计单词出现次数
grep -o -w "word" file.txt | wc -l
2. 网络和安全
复制代码
# 查找SSH登录尝试
grep "Failed password" /var/log/auth.log
# 查找可疑活动
grep -E "(invalid user|authentication failure)" /var/log/secure
# 提取访问IP
grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/nginx/access.log | sort | uniq
# 查找明文密码
grep -r -i "password[[:space:]]*=" --include="*.{py,js,json,yml,yaml}" .
3. 开发调试
复制代码
# 查找未捕获的异常
grep -r "except:" --include="*.py" . | grep -v "#"
# 查找print语句(调试残留)
grep -r "print(" --include="*.py" .
# 查找过长的行(>80字符)
grep -n "^.\{81,\}$" *.py
# 查找魔法数字
grep -r -E "\b[0-9]{3,}\b" --include="*.{py,js,java}" .
🎓 组合工具
1. 与 find 组合
复制代码
# 查找包含文本的文件
find . -name "*.txt" -exec grep -l "pattern" {} \;
# 查找并处理
find . -type f -name "*.log" -exec grep -H "error" {} \;
# 使用xargs提高性能
find . -name "*.py" -type f | xargs grep -l "import os"
2. 与 sed/awk 组合
复制代码
# 提取后处理
grep "pattern" file.txt | awk '{print $1, $3}'
# 替换匹配内容
grep -l "old_pattern" *.txt | xargs sed -i 's/old_pattern/new_pattern/g'
# 统计列数据
grep "success" log.txt | awk '{sum += $3} END {print sum}'
3. 与 sort/uniq 组合
复制代码
# 统计频率
grep -o "pattern" file.txt | sort | uniq -c | sort -nr
# 去重匹配
grep -h "pattern" *.log | sort -u
# 查找共同行
grep -f file1.txt file2.txt | sort
📚 特殊技巧
1. 排除自身
复制代码
# 搜索进程时排除grep自身
ps aux | grep "[p]ython" # 技巧!匹配 "python" 但 "[p]ython" 不匹配自身
ps aux | grep "python" | grep -v "grep" # 传统方法
# 原因:[p]ython 匹配 "python",但 "grep [p]ython" 不匹配
2. 多个文件类型
复制代码
# 搜索多种文件
grep -r "pattern" --include="*.cpp" --include="*.h" .
# 使用glob模式
grep -r "pattern" --include="*.{cpp,h,cc}" .
# 排除多种文件
grep -r "pattern" --exclude="*.min.js" --exclude="*.min.css" .
3. 行号技巧
复制代码
# 显示匹配行及前后范围
grep -n -C 3 "pattern" file.txt
# 只显示行号
grep -n "pattern" file.txt | cut -d: -f1
# 显示行号范围
grep -n "pattern" file.txt | awk -F: '{print $1}' | paste -sd,
⚠️ 注意事项
1. 正则表达式差异
复制代码
# 基本正则 vs 扩展正则
grep "a\{3\}" file.txt # 基本正则,需要转义{}
grep -E "a{3}" file.txt # 扩展正则,不需要转义
grep -P "a{3}" file.txt # Perl正则,不需要转义
# 常见元字符转义
grep "\.txt$" file.txt # 转义点号匹配 ".txt"
grep -F ".txt" file.txt # 或使用固定字符串
2. 性能考虑
复制代码
# 大文件搜索技巧
grep -m 10 "pattern" large.log # 找到10个匹配后停止
# 使用更快的算法
grep -F "string" large.txt # 固定字符串比正则快
# 避免不必要的递归
grep -r --exclude-dir=.git "pattern" .
3. 编码问题
复制代码
# 处理不同编码
grep -a "pattern" file # 当作文本处理
grep -U "pattern" file # 处理Windows换行符
grep --unicode-mode "pattern" file # Unicode模式
# 设置语言环境
LANG=C grep "pattern" file # 使用C语言环境(最快)
📖 速查表
常用模式
| 模式 |
说明 |
示例 |
^ |
行首 |
^start |
$ |
行尾 |
end$ |
. |
任意单个字符 |
a.b |
* |
0次或多次 |
a*b |
+ |
1次或多次(需-E) |
a+b |
? |
0次或1次(需-E) |
a?b |
{n} |
恰好n次(需-E) |
a{3} |
{n,} |
至少n次(需-E) |
a{3,} |
{n,m} |
n到m次(需-E) |
a{3,5} |
[abc] |
字符集 |
[aeiou] |
[^abc] |
否定字符集 |
[^0-9] |
| ` |
` |
或(需-E) |
\(\) |
分组(基础) |
\(ab\)+ |
() |
分组(扩展) |
(ab)+(需-E) |
字符类
| 类 |
等价 |
说明 |
[[:alnum:]] |
[a-zA-Z0-9] |
字母数字 |
[[:alpha:]] |
[a-zA-Z] |
字母 |
[[:digit:]] |
[0-9] |
数字 |
[[:lower:]] |
[a-z] |
小写字母 |
[[:upper:]] |
[A-Z] |
大写字母 |
[[:space:]] |
[ \t\r\n\v\f] |
空白字符 |
[[:blank:]] |
[ \t] |
空格和制表符 |
[[:punct:]] |
[!"#$%&'()*+,./:;<=>?@[\]^_{|}~-]` |
标点符号 |
[[:graph:]] |
[[:alnum:][:punct:]] |
可见字符 |
[[:print:]] |
[[:alnum:][:punct:] ] |
可打印字符 |
[[:cntrl:]] |
[\x00-\x1F\x7F] |
控制字符 |
[[:xdigit:]] |
[0-9a-fA-F] |
十六进制数字 |
这个大全涵盖了 grep 的绝大多数用法,从基础搜索到高级技巧都有示例。掌握这些例程,你就能高效地处理文本搜索的各种需求!