grep
grep(Global Regular Expression Print)命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
基本语法
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
主要选项
基本选项
-i
: 忽略大小写-v
: 反向匹配,显示不匹配的行-n
: 显示行号-c
: 只显示匹配行的计数-l
: 只显示包含匹配的文件名-L
: 只显示不包含匹配的文件名-h
: 多文件搜索时不显示文件名-H
: 显示文件名(默认)
上下文选项
-A num
: 显示匹配行后num行-B num
: 显示匹配行前num行-C num
: 显示匹配行前后num行
正则表达式选项
-E
: 使用扩展正则表达式(等同于egrep)-F
: 将模式作为固定字符串(等同于fgrep)-P
: 使用Perl兼容正则表达式
其他有用选项
-r
: 递归搜索目录-w
: 匹配整个单词-x
: 匹配整行-o
: 只显示匹配的部分-q
: 安静模式,不输出内容--color
: 高亮显示匹配的文本
基本使用示例
简单搜索
# 在文件中搜索字符串
grep "error" /var/log/messages
# 忽略大小写搜索
grep -i "error" /var/log/messages
# 显示行号
grep -n "error" /var/log/messages
# 反向匹配,显示不包含"error"的行
grep -v "error" /var/log/messages
多文件搜索
# 在多个文件中搜索
grep "error" /var/log/*.log
# 递归搜索目录
grep -r "config" /etc/
# 只显示文件名
grep -l "error" /var/log/*.log
# 不显示文件名
grep -h "error" /var/log/*.log
计数和统计
# 统计匹配行数
grep -c "error" /var/log/messages
# 统计匹配的文件数
grep -l "error" /var/log/*.log | wc -l
# 显示不匹配的文件
grep -L "error" /var/log/*.log
正则表达式使用
基本正则表达式
# 匹配以"error"开头的行
grep "^error" /var/log/messages
# 匹配以"error"结尾的行
grep "error$" /var/log/messages
# 匹配包含数字的行
grep "[0-9]" /var/log/messages
# 匹配空行
grep "^$" /var/log/messages
# 匹配任意字符
grep "er.or" /var/log/messages
扩展正则表达式
# 使用扩展正则表达式
grep -E "error|warning|critical" /var/log/messages
# 匹配重复字符
grep -E "co+l" file.txt # 匹配col, cool, coool等
# 匹配可选字符
grep -E "colou?r" file.txt # 匹配color或colour
# 匹配特定次数
grep -E "o{2,4}" file.txt # 匹配2-4个连续的o
字符类
# 匹配字母
grep "[a-zA-Z]" file.txt
# 匹配数字
grep "[0-9]" file.txt
grep "[[:digit:]]" file.txt
# 匹配字母数字
grep "[[:alnum:]]" file.txt
# 匹配空白字符
grep "[[:space:]]" file.txt
# 匹配标点符号
grep "[[:punct:]]" file.txt
实用应用场景
日志分析
# 查找错误日志
grep -i "error\|fail\|critical" /var/log/messages
# 查找特定时间段的日志
grep "Dec 25" /var/log/messages
# 查找IP地址
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /var/log/access.log
# 查找HTTP状态码
grep -E "\" [45][0-9]{2} " /var/log/access.log
# 统计访问最多的IP
grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /var/log/access.log | sort | uniq -c | sort -nr | head -10
系统管理
# 查找运行的进程
ps aux | grep nginx
# 查找监听的端口
netstat -tuln | grep :80
# 查找大文件
find / -size +100M | grep -v /proc
# 查找配置文件中的特定设置
grep -r "ServerName" /etc/apache2/
# 查找用户账户
grep "username" /etc/passwd
代码搜索
# 查找函数定义
grep -rn "function_name" /path/to/code/
# 查找TODO注释
grep -rn "TODO\|FIXME\|HACK" /path/to/code/
# 查找特定的导入语句
grep -r "import.*pandas" /path/to/python/
# 查找SQL查询
grep -r "SELECT.*FROM" /path/to/code/
文本处理
# 提取邮箱地址
grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
# 提取URL
grep -oE "https?://[^\s]+" file.txt
# 提取电话号码
grep -oE "[0-9]{3}-[0-9]{3}-[0-9]{4}" file.txt
# 查找重复行
grep -n "pattern" file.txt | cut -d: -f1 | uniq -d
高级技巧
上下文搜索
# 显示匹配行前后3行
grep -C 3 "error" /var/log/messages
# 显示匹配行前5行,后2行
grep -B 5 -A 2 "error" /var/log/messages
# 在显示的上下文中高亮其他模式
grep -C 3 "error" /var/log/messages | grep --color=always -E "warning|error|critical"
多模式搜索
# 使用多个-e选项
grep -e "error" -e "warning" /var/log/messages
# 从文件读取模式
echo -e "error\nwarning\ncritical" > patterns.txt
grep -f patterns.txt /var/log/messages
# 逻辑与搜索(同时包含两个模式的行)
grep "error" /var/log/messages | grep "database"
性能优化
# 使用固定字符串搜索(更快)
grep -F "error.log" /var/log/messages
# 限制搜索深度
grep -r --max-depth=2 "pattern" /etc/
# 排除特定文件类型
grep -r --exclude="*.tmp" "pattern" /path/
# 排除特定目录
grep -r --exclude-dir=".git" "pattern" /path/
实用脚本示例
日志监控脚本
#!/bin/bash
# log_monitor.sh
LOG_FILE="/var/log/messages"
PATTERNS="error|fail|critical|warning"
# 实时监控新的错误日志
tail -f $LOG_FILE | grep -i -E "$PATTERNS" --color=always
系统检查脚本
#!/bin/bash
# system_check.sh
echo "=== 检查系统错误 ==="
grep -i "error\|fail" /var/log/messages | tail -10
echo "=== 检查磁盘使用 ==="
df -h | grep -E "9[0-9]%|100%"
echo "=== 检查内存使用 ==="
free -h | grep Mem | awk '{if($3/$2 > 0.8) print "内存使用率过高: " $3 "/" $2}'
echo "=== 检查网络连接 ==="
netstat -tuln | grep LISTEN | grep -E ":80|:443|:22"
配置文件验证脚本
#!/bin/bash
# config_check.sh
CONFIG_DIR="/etc/nginx/sites-available"
echo "=== 检查Nginx配置 ==="
for config in $CONFIG_DIR/*; do
echo "检查文件: $config"
# 检查语法错误
nginx -t -c $config 2>&1 | grep -q "syntax is ok" || echo "语法错误: $config"
# 检查常见配置项
grep -q "server_name" $config || echo "缺少server_name: $config"
grep -q "listen" $config || echo "缺少listen指令: $config"
done
常见错误和注意事项
转义特殊字符
# 搜索包含特殊字符的文本
grep "\$" file.txt # 搜索美元符号
grep "\*" file.txt # 搜索星号
grep "\[" file.txt # 搜索左方括号
grep "\\\\" file.txt # 搜索反斜杠
处理二进制文件
# 跳过二进制文件
grep -I "pattern" *
# 强制处理二进制文件
grep -a "pattern" binary_file
# 只搜索文本文件
grep -r --include="*.txt" "pattern" /path/
性能考虑
# 大文件搜索时使用固定字符串
grep -F "exact_string" large_file.txt
# 限制搜索结果数量
grep -m 10 "pattern" file.txt
# 使用并行搜索(GNU grep)
grep --parallel=4 "pattern" large_file.txt
相关命令
awk
- 模式扫描和处理语言sed
- 流编辑器find
- 查找文件sort
- 排序文本uniq
- 过滤重复行
grep是Linux系统中最常用的文本搜索工具之一,掌握其用法对日常工作非常重要。