1. 首页 > Linux教程 > 正文

Linux教程FG057-grep命令(文本搜索/过滤/正则匹配)

本文档风哥主要介绍Linux系统中grep命令的使用方法,包括文本搜索、过滤、正则表达式匹配等,结合RHEL LINUX 10系统环境,提供详细的命令示例和输出结果,适合Linux运维人员在学习和生产环境中使用。更多视频教程www.fgedu.net.cn

参考Red Hat Enterprise Linux 10官方文档中的System administration章节

Part01-基础概念与理论知识

1.1 grep命令的基本概念

grep命令是Linux系统中最强大的文本搜索工具之一,用于在文件中搜索匹配指定模式的行。grep支持基本正则表达式(BRE)和扩展正则表达式(ERE),可以搜索文件内容、过滤命令输出、查找日志信息等。grep是Global Regular Expression Print的缩写,是Linux运维人员必须掌握的核心命令。

grep命令的特点:

  • 支持正则表达式
  • 可以搜索多个文件
  • 支持递归搜索目录
  • 可以显示行号
  • 支持反向匹配
  • 支持颜色高亮

1.2 grep命令的语法格式

grep命令的基本语法格式如下:

# grep命令基本语法
grep [选项] 模式 [文件…]

# 语法说明:
# 模式:要搜索的文本模式或正则表达式
# 文件:要搜索的文件名,可以指定多个文件
# 如果不指定文件,则从标准输入读取

1.3 grep命令的常用参数

grep命令的常用参数如下:

# grep命令常用参数

# -i, –ignore-case
# 忽略大小写
grep -i “error” /var/log/messages

# -v, –invert-match
# 反向匹配(显示不匹配的行)
grep -v “DEBUG” /var/log/app.log

# -n, –line-number
# 显示行号
grep -n “error” /var/log/messages

# -c, –count
# 只显示匹配的行数
grep -c “error” /var/log/messages

# -l, –files-with-matches
# 只显示包含匹配内容的文件名
grep -l “error” /var/log/*.log

# -L, –files-without-match
# 只显示不包含匹配内容的文件名
grep -L “error” /var/log/*.log

# -r, –recursive
# 递归搜索目录
grep -r “error” /var/log/

# -R, –dereference-recursive
# 递归搜索目录,跟随符号链接
grep -R “error” /var/log/

# -w, –word-regexp
# 匹配整个单词
grep -w “error” /var/log/messages

# -x, –line-regexp
# 匹配整行
grep -x “error” /var/log/messages

# -A N, –after-context=N
# 显示匹配行后N行
grep -A 5 “error” /var/log/messages

# -B N, –before-context=N
# 显示匹配行前N行
grep -B 5 “error” /var/log/messages

# -C N, –context=N
# 显示匹配行前后各N行
grep -C 5 “error” /var/log/messages

# -E, –extended-regexp
# 使用扩展正则表达式
grep -E “error|warning” /var/log/messages

# -F, –fixed-strings
# 将模式视为固定字符串
grep -F “error*” /var/log/messages

# -P, –perl-regexp
# 使用Perl正则表达式
grep -P “\d{3}-\d{4}” /var/log/messages

# –color=WHEN
# 高亮显示匹配内容
grep –color=auto “error” /var/log/messages

# -e PATTERN, –regexp=PATTERN
# 指定多个模式
grep -e “error” -e “warning” /var/log/messages

# -f FILE, –file=FILE
# 从文件读取模式
grep -f patterns.txt /var/log/messages

# -q, –quiet, –silent
# 静默模式,不输出任何内容
grep -q “error” /var/log/messages

# -s, –no-messages
# 不显示错误信息
grep -s “error” /nonexistent

# -o, –only-matching
# 只显示匹配的部分
grep -o “[0-9]\+” /var/log/messages

# -m N, –max-count=N
# 最多显示N个匹配
grep -m 10 “error” /var/log/messages

Part02-生产环境规划与建议

2.1 grep命令使用场景规划

在生产环境中,grep命令主要用于以下场景:

# grep命令使用场景规划

# 1. 日志分析场景
# – 搜索错误日志
# – 搜索特定时间段的日志
# – 搜索特定IP地址的访问记录
# – 搜索特定用户的操作记录

# 2. 配置文件搜索场景
# – 搜索配置项
# – 搜索注释行
# – 搜索空行
# – 搜索特定参数

# 3. 代码搜索场景
# – 搜索函数定义
# – 搜索变量使用
# – 搜索特定字符串
# – 搜索TODO标记

# 4. 系统管理场景
# – 搜索进程信息
# – 搜索用户信息
# – 搜索网络连接
# – 搜索文件内容

2.2 grep命令安全使用建议

在生产环境中使用grep命令时,需要注意以下安全建议: from LinuxDBA视频:www.itpux.com

grep命令安全使用建议:

  • 搜索敏感文件时注意权限控制
  • 避免搜索密码等敏感信息
  • 递归搜索时注意目录范围
  • 大文件搜索时注意性能影响
  • 使用正则表达式时注意转义
  • 搜索结果过多时使用管道分页

2.3 grep命令最佳实践

grep命令在生产环境中的最佳实践:

# grep命令最佳实践

# 1. 搜索时显示行号和颜色
# grep -n –color=auto “error” /var/log/messages

# 2. 搜索时忽略大小写
# grep -i “error” /var/log/messages

# 3. 搜索多个模式
# grep -E “error|warning|critical” /var/log/messages

# 4. 搜索时显示上下文
# grep -C 3 “error” /var/log/messages

# 5. 递归搜索目录
# grep -r “TODO” /path/to/project/

# 6. 搜索时排除特定文件
# grep -r –exclude=”*.log” “error” /var/log/

# 7. 搜索时排除特定目录
# grep -r –exclude-dir=”.git” “TODO” /path/to/project/

# 8. 搜索压缩文件
# zgrep “error” /var/log/app.log.gz

Part03-生产环境项目实施方案

3.1 基本搜索操作

grep命令在RHEL LINUX 10系统中的基本搜索操作示例:

# grep命令基本搜索操作示例

# 1. 搜索文件中的关键字
# grep “error” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
Apr 2 10:00:05 server01 systemd[1]: error: Starting Daily apt download activities…

# 2. 显示行号
# grep -n “error” /var/log/messages
123:Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
456:Apr 2 10:00:05 server01 systemd[1]: error: Starting Daily apt download activities…

# 3. 忽略大小写
# grep -i “ERROR” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
Apr 2 10:00:05 server01 systemd[1]: error: Starting Daily apt download activities…

# 4. 反向匹配
# grep -v “DEBUG” /var/log/app.log
2026-04-02 10:00:01 INFO [main] Application starting…
2026-04-02 10:00:02 WARN [main] Configuration file not found

# 5. 统计匹配行数
# grep -c “error” /var/log/messages
15

# 6. 只显示文件名
# grep -l “error” /var/log/*.log
/var/log/messages
/var/log/syslog
/var/log/app.log

# 7. 显示匹配内容前N行
# grep -B 2 “error” /var/log/messages
Apr 2 09:58:00 server01 kernel: [UFW ALLOW] IN=eth0 OUT=
Apr 2 09:59:00 server01 kernel: [UFW ALLOW] IN=eth0 OUT=
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=

# 8. 显示匹配内容后N行
# grep -A 2 “error” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
Apr 2 10:00:02 server01 systemd[1]: Started Session 123 of user root.
Apr 2 10:00:03 server01 sshd[12345]: Accepted publickey for root

# 9. 显示匹配内容前后各N行
# grep -C 2 “error” /var/log/messages
Apr 2 09:59:00 server01 kernel: [UFW ALLOW] IN=eth0 OUT=
Apr 2 10:00:00 server01 kernel: [UFW ALLOW] IN=eth0 OUT=
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
Apr 2 10:00:02 server01 systemd[1]: Started Session 123 of user root.
Apr 2 10:00:03 server01 sshd[12345]: Accepted publickey for root

# 10. 匹配整个单词
# grep -w “error” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
(不匹配errors、error_log等)

# 11. 高亮显示匹配内容
# grep –color=auto “error” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
(error会高亮显示)

# 12. 只显示匹配的部分
# grep -o “[0-9]\+” /var/log/messages
10
00
01
10
00
05

3.2 正则表达式搜索

使用正则表达式进行高级搜索:

# 正则表达式搜索示例

# 1. 搜索以特定字符串开头的行
# grep “^error” /var/log/messages
error: [UFW BLOCK] IN=eth0 OUT=

# 2. 搜索以特定字符串结尾的行
# grep “failed$” /var/log/messages
Apr 2 10:00:01 server01 kernel: Connection failed

# 3. 搜索包含数字的行
# grep “[0-9]” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=

# 4. 搜索IP地址
# grep -E “[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: from 192.168.1.100

# 5. 搜索邮箱地址
# grep -E “[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}” /var/log/app.log
2026-04-02 10:00:01 INFO User admin@fgedu.net logged in

# 6. 搜索日期格式
# grep -E “[0-9]{4}-[0-9]{2}-[0-9]{2}” /var/log/app.log
2026-04-02 10:00:01 INFO Application started

# 7. 搜索时间格式
# grep -E “[0-9]{2}:[0-9]{2}:[0-9]{2}” /var/log/app.log
2026-04-02 10:00:01 INFO Application started

# 8. 搜索空行
# grep “^$” /etc/app.conf
(显示所有空行)

# 9. 搜索非空行
# grep -v “^$” /etc/app.conf
(显示所有非空行)

# 10. 搜索注释行
# grep “^#” /etc/app.conf
# This is a comment
# Another comment

# 11. 搜索非注释行
# grep -v “^#” /etc/app.conf
key1=value1
key2=value2

# 12. 搜索多个模式(或)
# grep -E “error|warning|critical” /var/log/messages
Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT=
Apr 2 10:00:02 server01 kernel: warning: Low disk space
Apr 2 10:00:03 server01 kernel: critical: Out of memory

# 13. 搜索特定长度的行
# grep -E “^.{80,}$” /var/log/messages
(显示长度至少80个字符的行)

# 14. 搜索重复字符
# grep -E “a{2,}” /var/log/messages
(显示包含至少2个连续a的行)

# 15. 搜索单词边界
# grep -E “\berror\b” /var/log/messages
(只匹配单词error,不匹配errors、error_log等)

3.3 高级用法实战

grep命令的高级用法和技巧:

# grep命令高级用法示例

# 1. 递归搜索目录
# grep -r “TODO” /path/to/project/
/path/to/project/main.py: # TODO: Implement error handling
/path/to/project/utils.py: # TODO: Add documentation

# 2. 递归搜索并显示文件名和行号
# grep -rn “TODO” /path/to/project/
/path/to/project/main.py:10: # TODO: Implement error handling
/path/to/project/utils.py:25: # TODO: Add documentation

# 3. 搜索时排除特定文件
# grep -r –exclude=”*.log” “error” /var/log/
/var/log/messages:Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK]

# 4. 搜索时排除特定目录
# grep -r –exclude-dir=”.git” “TODO” /path/to/project/

# 5. 搜索多个文件类型
# grep -r –include=”*.py” –include=”*.sh” “TODO” /path/to/project/

# 6. 从文件读取搜索模式
# cat > patterns.txt << EOF error warning critical EOF # grep -f patterns.txt /var/log/messages Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT= Apr 2 10:00:02 server01 kernel: warning: Low disk space Apr 2 10:00:03 server01 kernel: critical: Out of memory # 7. 搜索压缩文件 # zgrep "error" /var/log/app.log.gz 2026-04-01 10:00:01 ERROR Database connection failed # 8. 搜索二进制文件 # grep -a "error" /usr/bin/app (将二进制文件视为文本文件搜索) # 9. 搜索时显示匹配次数 # grep -c "error" /var/log/*.log /var/log/messages:15 /var/log/syslog:10 /var/log/app.log:5 # 10. 搜索并统计 # grep "error" /var/log/messages | wc -l 15 # 11. 搜索并排序 # grep "error" /var/log/messages | sort Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT= Apr 2 10:00:05 server01 systemd[1]: error: Starting Daily apt download activities... # 12. 搜索并去重 # grep "error" /var/log/messages | sort | uniq Apr 2 10:00:01 server01 kernel: error: [UFW BLOCK] IN=eth0 OUT= Apr 2 10:00:05 server01 systemd[1]: error: Starting Daily apt download activities... # 13. 搜索并保存结果 # grep "error" /var/log/messages > /tmp/error_log.txt

# 14. 搜索并发送邮件
# grep “CRITICAL” /var/log/app.log | mail -s “Critical Errors” admin@fgedu.net

# 15. 搜索并执行命令
# grep -l “error” /var/log/*.log | xargs rm -f
(删除包含error的日志文件)

Part04-生产案例与实战讲解

4.1 日志分析案例

使用grep命令进行日志分析: 学习交流加群风哥微信: itpux-com

# 日志分析案例

# 1. 分析Nginx访问日志
# 查看访问量最大的IP
# awk ‘{print $1}’ /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 10
1234 192.168.1.100
567 192.168.1.101
234 192.168.1.102

# 查看特定IP的访问记录
# grep “192.168.1.100” /var/log/nginx/access.log | head -n 10
192.168.1.100 – – [02/Apr/2026:10:00:01 +0800] “GET / HTTP/1.1″ 200 1234

# 查看HTTP状态码统计
# awk ‘{print $9}’ /var/log/nginx/access.log | sort | uniq -c | sort -rn
1234 200
567 304
234 404
89 500

# 查看404错误
# grep ” 404 ” /var/log/nginx/access.log | head -n 10
192.168.1.100 – – [02/Apr/2026:10:00:01 +0800] “GET /notfound HTTP/1.1” 404 123

# 2. 分析系统日志
# 查看SSH登录失败
# grep “Failed password” /var/log/secure
Apr 2 10:00:01 server01 sshd[12345]: Failed password for root from 192.168.1.100 port 22

# 查看SSH登录成功
# grep “Accepted” /var/log/secure
Apr 2 10:00:02 server01 sshd[12345]: Accepted publickey for root from 192.168.1.100 port 22

# 查看sudo使用记录
# grep “sudo” /var/log/secure
Apr 2 10:00:03 server01 sudo: root : TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/bin/ls

# 3. 分析应用日志
# 查看ERROR级别日志
# grep “ERROR” /var/log/app.log | tail -n 20
2026-04-02 10:00:01 ERROR [main] Database connection failed
2026-04-02 10:00:05 ERROR [main] Retry attempt 1 failed

# 查看特定时间段的日志
# grep “2026-04-02 10:” /var/log/app.log
2026-04-02 10:00:01 INFO [main] Application starting…
2026-04-02 10:00:02 INFO [main] Loading configuration…

# 查看异常堆栈
# grep -A 20 “Exception” /var/log/app.log | head -n 30
2026-04-02 10:00:01 ERROR [main] NullPointerException
at com.example.App.main(App.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

# 4. 分析邮件日志
# 查看发送失败的邮件
# grep “status=bounced” /var/log/maillog
Apr 2 10:00:01 server01 postfix/smtp[12345]: status=bounced (mail for [192.168.1.100] loops back to myself)

# 查看发送成功的邮件
# grep “status=sent” /var/log/maillog
Apr 2 10:00:02 server01 postfix/smtp[12345]: status=sent (250 OK)

4.2 配置文件搜索

使用grep命令搜索配置文件: 更多学习教程公众号风哥教程itpux_com

# 配置文件搜索案例

# 1. 搜索配置项
# grep “ServerName” /etc/httpd/conf/httpd.conf
#ServerName www.fgedu.net.cn:80

# 2. 搜索非注释配置项
# grep -v “^#” /etc/httpd/conf/httpd.conf | grep -v “^$”
ServerRoot “/etc/httpd”
Listen 80
Include conf.modules.d/*.conf

# 3. 搜索特定参数
# grep -i “listen” /etc/httpd/conf/httpd.conf
Listen 80
#Listen 12.34.56.78:80

# 4. 搜索多个配置文件
# grep -r “DocumentRoot” /etc/httpd/
/etc/httpd/conf/httpd.conf:DocumentRoot “/var/www/html”

# 5. 搜索环境变量
# grep “JAVA_HOME” /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-11

# 6. 搜索用户配置
# grep “root” /etc/passwd
root:x:0:0:root:/root:/bin/bash

# 7. 搜索组配置
# grep “docker” /etc/group
docker:x:998:user1,user2

# 8. 搜索服务配置
# grep “ExecStart” /etc/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock

# 9. 搜索网络配置
# grep “IPADDR” /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=192.168.1.100

# 10. 搜索防火墙规则
# grep “22” /etc/firewalld/zones/public.xml

4.3 故障排查案例

使用grep命令进行故障排查:

# 故障排查案例

# 1. 排查磁盘空间问题
# df -h | grep -v “tmpfs\|devtmpfs”
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 45G 5.0G 90% /
/dev/sda2 100G 80G 20G 80% /data

# 查找大文件
# find / -type f -size +100M 2>/dev/null | xargs ls -lh | grep -v “Permission denied”

# 2. 排查内存问题
# free -h | grep -v “Swap”
total used free shared buff/cache available
Mem: 7.6G 5.0G 1.0G 500M 1.6G 2.0G

# 查找占用内存最多的进程
# ps aux –sort=-%mem | head -n 10 | grep -v “USER”

# 3. 排查CPU问题
# top -b -n 1 | head -n 20 | grep -v “top”

# 查找占用CPU最多的进程
# ps aux –sort=-%cpu | head -n 10 | grep -v “USER”

# 4. 排查网络问题
# netstat -tuln | grep -v “Active\|Proto”
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

# 查看特定端口的连接
# netstat -an | grep “:80” | grep ESTABLISHED
tcp 0 0 192.168.1.100:80 192.168.1.101:12345 ESTABLISHED

# 5. 排查进程问题
# ps aux | grep “nginx”
root 1234 0.0 0.1 123456 7890 ? Ss 10:00 0:00 nginx: master process
nginx 1235 0.0 0.2 123456 7890 ? S 10:00 0:00 nginx: worker process

# 6. 排查服务问题
# systemctl status httpd | grep -i “active\|failed”
Active: active (running) since Thu 2026-04-02 10:00:00 CST; 1h ago

# 7. 排查SELinux问题
# grep “denied” /var/log/audit/audit.log | tail -n 10
type=AVC msg=audit(1612345678.123:123): avc: denied { read } for pid=12345 comm=”httpd”

# 8. 排查定时任务问题
# grep “backup” /var/log/cron
Apr 2 10:00:01 server01 CRON[12345]: (root) CMD (/usr/local/bin/backup.sh)

Part05-风哥经验总结与分享

5.1 grep命令使用技巧总结

根据多年的Linux运维经验,总结grep命令的使用技巧:

风哥提示:grep命令是Linux运维人员最常用的命令之一,掌握grep的各种参数和正则表达式用法非常重要。建议熟练掌握-i、-v、-n、-r、-E等常用参数,以及正则表达式的基本语法。在生产环境中,grep常用于日志分析、配置文件搜索、故障排查等场景,是运维人员的得力助手!

# grep命令使用技巧总结

# 1. 常用grep别名
alias grep=’grep –color=auto’
alias fgrep=’fgrep –color=auto’
alias egrep=’egrep –color=auto’

# 2. 搜索并高亮
# grep –color=always “error” /var/log/messages | less -R

# 3. 搜索多个文件并显示文件名
# grep -H “error” /var/log/*.log

# 4. 搜索并显示上下文
# grep -C 5 “error” /var/log/messages

# 5. 搜索时排除二进制文件
# grep -I “error” /path/to/directory/

# 6. 搜索时显示匹配次数
# grep -c “error” /var/log/*.log

# 7. 搜索并统计
# grep “error” /var/log/messages | wc -l

# 8. 搜索并发送邮件
# grep “CRITICAL” /var/log/app.log | mail -s “Critical Errors” admin@fgedu.net

5.2 grep命令操作检查清单

在生产环境中使用grep命令时的检查清单:

grep命令操作检查清单:

  • 确认搜索模式是否正确
  • 确认是否需要忽略大小写
  • 确认是否需要递归搜索
  • 确认是否需要显示行号
  • 确认是否需要显示上下文
  • 确认是否需要排除特定文件
  • 确认是否需要排除特定目录
  • 确认正则表达式语法是否正确
  • 确认搜索结果是否过多
  • 确认是否需要保存搜索结果

5.3 相关工具推荐

与grep命令相关的工具和替代方案: 学习交流加群风哥QQ113257174

# grep命令相关工具推荐

# 1. egrep – 扩展正则表达式grep
# egrep “error|warning” /var/log/messages
# 等同于 grep -E

# 2. fgrep – 固定字符串grep
# fgrep “error*” /var/log/messages
# 等同于 grep -F

# 3. zgrep – 搜索压缩文件
# zgrep “error” /var/log/app.log.gz

# 4. zcat + grep – 搜索压缩文件
# zcat /var/log/app.log.gz | grep “error”

# 5. ack – 专为程序员设计的grep
# ack “TODO” /path/to/project/
# 优点:自动排除版本控制目录,支持多种文件类型

# 6. ag (The Silver Searcher) – 更快的ack
# ag “TODO” /path/to/project/
# 优点:速度更快,支持更多特性

# 7. ripgrep (rg) – 最快的搜索工具
# rg “TODO” /path/to/project/
# 优点:速度最快,支持正则表达式,自动排除版本控制目录

# 8. awk – 文本处理工具
# awk ‘/error/ {print}’ /var/log/messages
# 优点:功能更强大,可以进行复杂的文本处理

风哥总结:grep命令是Linux系统中最强大的文本搜索工具之一。在生产环境中,grep命令常用于日志分析、配置文件搜索、故障排查等场景。建议熟练掌握grep的各种参数和正则表达式用法,特别是-i、-v、-n、-r、-E等常用参数。对于大型项目,建议使用ack、ag或ripgrep等更现代的搜索工具,它们速度更快,功能更强大。记住,grep是运维人员的得力助手,熟练掌握它可以大大提高工作效率!更多视频教程www.fgedu.net.cn

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息