grep

title

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系统中最常用的文本搜索工具之一,掌握其用法对日常工作非常重要。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""