【Linux】grep命令终极指南

grep(Global Regular Expression Print,全局正则表达式打印)是 Linux 系统中最常用、最强大的文本搜索工具之一。它能够在文件中搜索匹配指定模式的行,并将匹配的行输出。

一、基本语法

bash 复制代码
grep [选项] "搜索模式" 文件名

二、最常用的参数

参数 说明 示例
-i 忽略大小写 grep -i "error" log.txt
-v 反向匹配(显示不匹配的行) grep -v "DEBUG" log.txt
-n 显示行号 grep -n "error" log.txt
-c 只显示匹配的行数 grep -c "error" log.txt
-l 只显示匹配的文件名 grep -l "error" *.txt
-r-R 递归搜索目录 grep -r "error" /var/log/
-w 精确匹配整个单词 grep -w "error" log.txt
-A n 显示匹配行及之后n行 grep -A 3 "error" log.txt
-B n 显示匹配行及之前n行 grep -B 2 "error" log.txt
-C n 显示匹配行及前后各n行 grep -C 5 "error" log.txt
-E 使用扩展正则表达式(等同于egrep) `grep -E "error
-e 指定多个匹配模式 grep -e "error" -e "warn" log.txt
--color 高亮显示匹配内容 grep --color "error" log.txt

三、正则表达式用法

1.基本正则表达式(BRE)

BRE,Basic Regular Expression。

符号 说明 示例
^ 匹配行首 grep "^Start" file.txt
$ 匹配行尾 grep "end$" file.txt
. 匹配任意单个字符 grep "1.st" file.txt
* 匹配前一个字符0次或多次 grep "ab*c" file.txt
[] 匹配字符集中的任意一个 grep "[aeiou]" file.txt
[^] 匹配不在字符集中的字符 grep "[^0-9]" file.txt
\ 转义字符 grep "a\.b" file.txt

2.扩展正则表达式(ERE,需用-E参数)

ERE,Extended Regular Expression。

符号 说明 示例
+ 匹配前一个字符1次或多次 grep -E "a+b" file.txt
? 匹配前一个字符0次或1次 grep -E "colou?r" file.txt
` ` 或运算
() 分组 grep -E "(ab)+" file.txt
{n} 匹配前一个字符n次 grep -E "a{3}" file.txt
{n,m} 匹配前一个字符n到m次 grep -E "a{2,4}" file.txt

四、实际应用场景示例

1.日志分析

bash 复制代码
# 查找日志中的错误信息(忽略大小写)
grep -i "error" /var/log/syslog

# 查找多个关键词
grep -E "error|warning|fail" /var/log/syslog

# 显示错误行及其前后5行(便于分析上下文)
grep -C 5 "error" application.log

# 统计错误出现的次数
grep -c "ERROR" application.log

2.代码搜索

bash 复制代码
# 在当前目录递归搜索函数定义
grep -rn "function myFunc" ./

# 查找所有包含TODO的文件
grep -rl "TODO" ./src/

# 查找特定格式的代码(如邮箱)
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt

# 查找空行
grep -n "^$" file.txt

3.系统管理

bash 复制代码
# 查看已安装的软件包
dpkg -l | grep nginx

# 查看特定端口占用
netstat -tuln | grep ":80"

# 查看特定进程
ps aux | grep nginx

# 查看用户信息
grep "username" /etc/passwd

4.配置文件处理

bash 复制代码
# 查看配置项(排除注释行)
grep -v "^#" config.conf

# 排除空行和注释行
grep -v -E "^#|^$" /etc/ssh/sshd_config

# 查找特定配置
grep "Port" /etc/ssh/sshd_config

五、组合使用技巧

常用组合拳

1.查找代码中的配置,排除掉 .git 文件夹

bash 复制代码
grep -r "database" ./ --exclude-dir=".git"

2.实时监控日志报错

配合tail命令使用:

bash 复制代码
tail -f app.log | grep "error"

3.统计某个关键词出现的频次

配合wc(word count)命令:

bash 复制代码
grep -o "keyword" file.txt | wc -l

(注:-o表示只输出匹配的部分,每行一个,配合wc -l统计出现次数,而不是行数)

4.查找特定类型文件中的内容

配合find命令:

bash 复制代码
find . -name "*.java" | xargs grep "import"

5.与管道配合

bash 复制代码
# 查看内存使用并过滤
free -m | grep Mem

# 组合多个grep实现多级过滤
cat log.txt | grep "error" | grep -v "ignore"

# 查看磁盘使用并过滤
df -h | grep -v "tmpfs"

6.与 find 命令配合

bash 复制代码
# 在特定类型文件中搜索
find /var/log -name "*.log" -exec grep -l "error" {} \;

# 搜索最近修改的文件中的内容
find . -mtime -1 -type f | xargs grep "pattern"

7.统计分析

bash 复制代码
# 统计匹配行数并排序(简单记忆:-t指定分隔符,-k指定字段,-n数值排序,-r反序。)
grep -c "pattern" *.txt | sort -t: -k2 -nr

# 查找并统计IP访问次数(uniq去除相邻的重复行 -c显示每行出现的次数)
grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log | sort | uniq -c | sort -nr

六、常用实用命令速查

bash 复制代码
# 递归搜索当前目录,显示行号和文件名,忽略大小写
grep -rni "pattern" ./

# 只显示匹配的内容(不显示整行)
grep -o "[0-9]\{3\}-[0-9]\{4\}" file.txt

# 匹配整个单词,忽略大小写,显示行号
grep -win "error" log.txt

# 查找最近24小时内的错误
find /var/log -mtime -1 -type f -exec grep -l "error" {} \;

# 批量替换(配合sed)
grep -rl "old" ./ | xargs sed -i 's/old/new/g'

七、注意事项

  1. 特殊字符转义 :在正则表达式中,$*[]^|()等字符有特殊含义,需要用\转义或使用-E参数(扩展正则表达式ERE)。
  2. 引号使用:搜索模式建议用引号包裹,避免 shell 解释特殊字符:
bash 复制代码
grep "hello world" file.txt		# 推荐
grep hello world file.txt 		# 可能出错
  1. 性能优化 :在大文件中搜索时,-F(固定字符串匹配)比正则表达式更快:
bash 复制代码
grep -F "literal string" bigfile.txt
  1. 二进制文件 :默认跳过二进制文件,使用-a可将其视为文本处理。
相关推荐
巨斧空间掌门1 小时前
JDK17 下载 windows Linux
linux·运维·服务器
AI+程序员在路上2 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
learndiary3 小时前
2026.03.12~2026.03.19制作的共7个视频及简介
linux·视频·学习日记小店
JiMoKuangXiangQu3 小时前
Linux:ARM64 中断处理简析
linux·arm64 中断
小生不才yz3 小时前
【Makefile 专家之路 | 函数篇】11. 终极奥义:eval 函数——动态生成规则的“核武器”
linux
皮卡蛋炒饭.3 小时前
进程得控制
linux·运维·服务器
YMWM_3 小时前
Install pyrealsense2 on the jetson thor
linux·realsense2
BestOrNothing_20154 小时前
(3)Ubuntu 22.04 双系统安装全过程记录
linux·ubuntu22.04·双系统安装
寂柒6 小时前
Linux——基础IO
linux