Linux常用命令学习笔记:grep

1. 命令概述

  • 命令名称grep(英文全拼:global regular expression print)
  • 核心功能:使用正则表达式搜索文本,显示匹配的行
  • 主要用途:文本搜索、模式匹配、日志分析、文件过滤
  • 家族成员egrep(扩展正则表达式)、fgrep(固定字符串)

2. 语法格式

grep [选项] 模式 文件...

3. 常用选项

选项说明
-i忽略大小写
-v反向匹配,显示不匹配的行
-n显示匹配行的行号
-c统计匹配行数
-l只显示包含匹配项的文件名
-L只显示不包含匹配项的文件名
-r递归搜索目录
-w匹配整个单词
-x匹配整行
-A n显示匹配行及后 n 行
-B n显示匹配行及前 n 行
-C n显示匹配行及前后各 n 行
-E使用扩展正则表达式(等同于 egrep
-F使用固定字符串(等同于 fgrep
--color高亮显示匹配内容
--help显示帮助信息
--version显示版本信息

4. 基本正则表达式语法

元字符说明
^匹配行首
$匹配行尾
.匹配任意单个字符
*匹配前一个字符 0 次或多次
[]字符集,匹配方括号内的任意字符
[^]否定字符集,不匹配方括号内的字符
转义字符
\{n\}匹配前一个字符 n 次
\{n,\}匹配前一个字符至少 n 次
\{n,m\}匹配前一个字符 n 到 m 次

5. 常用实例详解

(1) 基本搜索

# 搜索包含"error"的行
grep 'error' file.log

# 搜索包含"error"的行,忽略大小写
grep -i 'error' file.log

# 搜索包含"error"的行,显示行号
grep -n 'error' file.log

# 统计包含"error"的行数
grep -c 'error' file.log

# 只显示包含"error"的文件名
grep -l 'error' *.log

(2) 正则表达式搜索

# 搜索以"error"开头的行
grep '^error' file.log

# 搜索以"error"结尾的行
grep 'error$' file.log

# 搜索包含数字的行
grep '[0-9]' file.txt

# 搜索包含小写字母的行
grep '[a-z]' file.txt

# 搜索包含大写字母的行
grep '[A-Z]' file.txt

# 搜索不包含数字的行
grep '[^0-9]' file.txt

(3) 重复匹配

# 搜索包含至少一个数字的行
grep '[0-9]\+' file.txt

# 搜索包含0个或多个数字的行
grep '[0-9]*' file.txt

# 搜索包含3个数字的行
grep '[0-9]\{3\}' file.txt

# 搜索包含3到5个数字的行
grep '[0-9]\{3,5\}' file.txt

(4) 上下文显示

# 显示匹配行及后2行
grep -A 2 'error' file.log

# 显示匹配行及前2行
grep -B 2 'error' file.log

# 显示匹配行及前后各2行
grep -C 2 'error' file.log

6. 实际应用场景

场景一:日志分析

# 查找错误日志
grep 'ERROR\|FATAL' app.log

# 查找特定时间段的日志
grep '2023-12-19 1[0-9]:' access.log

# 查找IP地址
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log

# 查找HTTP状态码
grep ' [2-5][0-9]\{2\} ' access.log

# 查找404错误
grep ' 404 ' access.log

场景二:配置文件搜索

# 查找配置文件中的配置项
grep '^[^#]' nginx.conf  # 查找非注释行

# 查找包含"server"的配置块
grep -A 5 -B 5 'server {' nginx.conf

# 查找所有监听的端口
grep 'listen [0-9]\+;' nginx.conf

# 查找所有server_name
grep 'server_name .*;' nginx.conf

场景三:代码搜索

# 递归搜索目录中的Python文件
grep -r 'def ' *.py

# 搜索函数调用
grep -r 'function_name\(' src/

# 搜索TODO注释
grep -r 'TODO\|FIXME' src/

# 搜索import语句
grep -r '^import ' *.py

# 搜索类定义
grep -r '^class ' *.py

场景四:系统监控

# 查看系统进程
ps aux | grep 'nginx'

# 查看网络连接
netstat -tuln | grep ':[0-9]\+'

# 查看磁盘使用情况
df -h | grep '[0-9]%'

# 查看内存使用情况
free -h | grep 'Mem\|Swap'

# 查看系统负载
uptime | grep -o 'load average: [0-9.]\+'

7. 与其他命令的区别

命令特点适用场景
grep基本正则表达式简单模式匹配
egrep扩展正则表达式,支持 \|+?()复杂模式匹配
fgrep固定字符串,不支持正则表达式快速固定字符串搜索
rgrep递归搜索目录目录搜索
ag更快的搜索工具代码搜索

8. 注意事项

  1. 正则表达式grep使用基本正则表达式,部分元字符需要转义
  2. 特殊字符+?|()等字符需要转义
  3. 性能优化:使用更精确的模式可以提高搜索速度
  4. 递归搜索:使用 -r选项递归搜索目录
  5. 输出控制:使用 -l-c-n等选项控制输出格式

9. 常见问题解决

(1) 特殊字符转义

# 搜索包含"+"的行
grep '\+' file.txt

# 搜索包含"?"的行
grep '\?' file.txt

# 搜索包含"|"的行
grep '\|' file.txt

# 搜索包含"()"的行
grep '\(\)' file.txt

(2) 性能优化

# 使用更精确的模式
grep '^error:' file.log  # 比 'error' 更快

# 使用单词边界
grep -w 'error' file.log  # 只匹配整个单词

# 使用整行匹配
grep -x 'error' file.log  # 只匹配整行

(3) 大文件处理

# 使用管道分页查看
grep 'pattern' largefile.log | less

# 只显示匹配行数
grep -c 'pattern' largefile.log

# 只显示文件名
grep -l 'pattern' *.log

(4) 多文件搜索

# 搜索多个文件
grep 'pattern' file1.txt file2.txt file3.txt

# 搜索所有文本文件
grep 'pattern' *.txt

# 递归搜索目录
grep -r 'pattern' /path/to/dir

# 排除某些文件
grep -r --exclude='*.log' 'pattern' /path/to/dir

核心要点总结

  • grep是 Linux 中最常用的文本搜索工具
  • 正则表达式:支持基本正则表达式,部分元字符需要转义
  • 常用选项-i(忽略大小写)、-v(反向匹配)、-n(显示行号)、-r(递归搜索)
  • 实际应用:日志分析、配置文件搜索、代码搜索、系统监控
  • 性能优化:使用更精确的模式、单词边界、整行匹配
  • 注意事项:特殊字符需要转义,使用单引号包裹模式

grep命令是 Linux 系统管理员和开发者的必备工具,熟练掌握可以大大提高工作效率。


作 者:南烛
链 接:https://www.itnotes.top/archives/367
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇