文件查看编辑命令 grep
grep 是 Linux 中最常用的文本搜索工具之一,名字来源于 "global regular expression print",就是在文件中找你要的内容,然后把包含这些内容的行显示出来。
1. 基本语法
grep [选项] "搜索内容" 文件名
最简单的用法就是这样:
grep "hello" file.txt
这会在 file.txt 文件中搜索包含 "hello" 的所有行。
2. 基本搜索操作
- 在单个文件中搜索
# 在文件中搜索特定文本
grep "error" log.txt
# 搜索多个文件
grep "error" log1.txt log2.txt log3.txt
# 使用通配符搜索多个文件
grep "error" *.txt
grep "error" /var/log/*.log
- 显示行号
用 -n
选项可以显示匹配行的行号:
grep -n "error" log.txt
- 忽略大小写
用 -i
选项忽略大小写:
grep -i "ERROR" log.txt
# 这样 error、Error、ERROR 都能匹配到
- 显示不匹配的行
用 -v
选项显示不包含搜索内容的行:
grep -v "debug" log.txt
# 显示所有不包含 "debug" 的行
3. 递归搜索
- 在目录中递归搜索
用 -r
或 -R
选项在整个目录树中搜索:
# 在当前目录及其子目录中搜索
grep -r "TODO" .
# 在指定目录中递归搜索
grep -r "function" /home/user/code/
# 只搜索特定类型的文件
grep -r --include="*.py" "def " /home/user/code/
- 排除特定文件或目录
# 排除特定文件类型
grep -r --exclude="*.log" "error" .
# 排除特定目录
grep -r --exclude-dir="node_modules" "import" .
# 排除多个目录
grep -r --exclude-dir={node_modules,build,dist} "import" .
4. 控制输出格式
- 只显示匹配的文件名
# 只显示包含匹配内容的文件名
grep -l "error" *.txt
# 显示不包含匹配内容的文件名
grep -L "error" *.txt
- 统计匹配数量
# 统计匹配行的数量
grep -c "error" log.txt
# 统计匹配的文件数量
grep -l "error" *.txt | wc -l
- 显示上下文
# 显示匹配行的前后各3行
grep -C 3 "error" log.txt
# 只显示匹配行的前3行
grep -B 3 "error" log.txt
# 只显示匹配行的后3行
grep -A 3 "error" log.txt
5. 正则表达式基础
- 基本正则表达式
# 匹配行首
grep "^error" log.txt
# 匹配行尾
grep "error$" log.txt
# 匹配任意字符
grep "er.or" log.txt
# 能匹配 error、eraor、er1or 等
# 匹配任意数量的字符
grep "er.*or" log.txt
- 字符类
# 匹配数字
grep "[0-9]" log.txt
grep "[[:digit:]]" log.txt
# 匹配字母
grep "[a-zA-Z]" log.txt
grep "[[:alpha:]]" log.txt
# 匹配数字或字母
grep "[[:alnum:]]" log.txt
# 匹配空白字符
grep "[[:space:]]" log.txt
- 重复匹配
# 使用扩展正则表达式 (-E 选项)
grep -E "colou?r" text.txt
# 匹配 color 或 colour
grep -E "go{2,4}" text.txt
# 匹配 goo、gooo、goooo
grep -E "(ab)+" text.txt
# 匹配 ab、abab、ababab 等
6. 扩展正则表达式 (-E 选项)
使用 -E
选项可以使用扩展正则表达式,功能更强大:
# 或操作
grep -E "error|warning" log.txt
# 匹配包含 error 或 warning 的行
# 分组
grep -E "(http|https)://[a-zA-Z0-9.-]+" log.txt
# 匹配 URL
# 匹配数字范围
grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" log.txt
# 简单的IP地址匹配
# 单词边界
grep -E "\bword\b" text.txt
# 只匹配完整的单词 "word"
7. 固定字符串搜索 (-F 选项)
当你要搜索的内容包含特殊字符时,用 -F
选项按字面意思搜索:
# 搜索包含特殊字符的内容
grep -F "*.txt" log.txt
grep -F "$HOME" log.txt
grep -F "[error]" log.txt
8. 多模式搜索
- 使用文件指定搜索模式
把要搜索的内容写在文件里,然后用 -f
选项:
# 创建模式文件
echo -e "error\nwarning\nfatal" > patterns.txt
# 使用模式文件搜索
grep -f patterns.txt log.txt
- 同时搜索多个模式
# 使用扩展正则表达式
grep -E "error|warning|fatal" log.txt
# 分别搜索每个模式
grep -e "error" -e "warning" -e "fatal" log.txt
9. 高亮显示匹配结果
# 高亮显示匹配的部分
grep --color=always "error" log.txt
# 设置环境变量让 grep 总是高亮显示
export GREP_OPTIONS='--color=always'
10. 处理二进制文件
# 把二进制文件当作文本文件处理
grep -a "text" binary_file
# 跳过二进制文件
grep -I "text" *
11. 限制输出
# 只显示前10个匹配结果
grep "error" log.txt | head -10
# 匹配到第一个结果就停止
grep -m 1 "error" log.txt
# 静默模式,不显示输出,只返回状态码
grep -q "error" log.txt
12. 退出状态码
grep 命令的退出状态码很有用:
# 0: 找到匹配
# 1: 没找到匹配
# 2: 发生错误
# 在脚本中使用
if grep -q "error" log.txt; then
echo "发现错误"
else
echo "没有错误"
fi
13. 特殊字符的处理
当搜索内容包含特殊字符时:
# 使用单引号避免shell解释
grep '*.txt' file.txt
# 使用反斜杠转义
grep "\$HOME" file.txt
# 使用 -F 选项按字面意思搜索
grep -F '$HOME' file.txt