grep用法
grep [选项] "搜索模式" 文件名/目录
“grep -E ”“egrep”“grep +\转义”
grep "a\+" grep_test.txt
egrep "a+" grep_test.txt
grep -E "a+" grep_test.txt
基础用法
- grep "Hello" grep_test.txt # 搜索文件中含 "Hello" 的行
- grep -i "hello" grep_test.txt # -i忽略大小写,匹配 Hello/HELLO/hello 等
- grep -n "Error" grep_test.txt # -n 显示行号,显示含 "Error" 行的行号+内容
- grep -v "Hello" grep_test.txt # -v反向匹配,输出不含 "Hello" 的所有行
- grep -c "aaa" grep_test.txt # -c统计匹配行的数量,统计含 "aaa" 的行总数
- grep -o "Hello" grep_test.txt # -o仅输出所有匹配的 "Hello" 字符串
- grep -q "Error" grep_test.txt && echo "存在错误行" # -q静默模式,匹配成功返回 0,执行后续命令
- grep -x "1. Hello World" grep_test.txt # -x仅匹配完全等于 "1. Hello World" 的行
- grep -A 2 "Error" grep_test.txt # 显示匹配行及后续 2 行(A=After)
grep -B 1 "Error" grep_test.txt # 显示匹配行及前面 1 行(B=Before)
grep -C 1 "Error" grep_test.txt # 显示匹配行及前后各 1 行(C=Context) - grep "Error" grep_test.txt grep_test_dir/log1.txt # 多个文件同时搜索:搜索两个文件中的 "Error"
- grep -l "Error" grep_test.txt grep_test_dir/* # -l输出含 "Error" 的所有文件名
- grep -h "Error" grep_test.txt grep_test_dir/log1.txt #-h 仅输出匹配内容,不显示文件名
- grep -r "Error" grep_test_dir/ # (-r/-R)递归搜索 grep_test_dir 下所有文件中的 "Error"
- grep -r --exclude="*.conf" "Error" grep_test_dir/ # --exclude排除 .conf 后缀文件
- grep -r --exclude-dir="tmp" "Error" ./ # 递归搜索当前目录,--exclude-dir排除 tmp 目录
- cat grep_test.txt | grep "World" # 从标准输入读取(|代表管道输入),搜索含 "World" 的行
- grep -n "^$" grep_test.txt # (^$)查找所有纯空行并显示行号
- grep "[[:space:]]" grep_test.txt # (空格 / Tab)匹配含空格或 Tab 的所有行
- grep "^1." grep_test.txt # (^ 锚点)匹配行首内容,匹配以 "1." 开头的行
- grep "空格$" grep_test.txt # ($ 锚点,匹配行尾内容)匹配以 "空格" 结尾的行(注意行尾空格)
正则表达式精准匹配复杂模式
- grep "Err.r" grep_test.txt # 匹配 "Err" 后接任意 1 个字符,再接 "r"(如 Error)
- grep "a*" grep_test.txt # 多个前导字符(*),匹配零个或多个 "a"(所有行都满足,因空也匹配)
- grep "a\+" grep_test.txt # (+,需转义,匹配一个或多个前导字符)匹配一个或多个连续 "a"(如 aaa、aa)
- grep "a\{2\}" grep_test.txt # ({n},需转义:匹配指定次数)匹配恰好 2 个连续 "a"
- grep "a\{2,\}" grep_test.txt #({n,},需转义:匹配至少 n 次) 匹配至少 2 个连续 "a"
- grep "a\{1,3\}" grep_test.txt #({n,m},需转义:匹配 n-m 次) 匹配 1-3 个连续 "a"
- grep -E "a{2,3}" grep_test.txt # (-E):无需转义 +、{}、| 等元字符,直接用 {2,3} 无需转义
- grep -E "Error|Warning" grep_test.txt # (或逻辑 |,扩展正则)匹配含 "Error" 或 "Warning" 的行
- grep "[0-9]" grep_test.txt # 字符集匹配([]):匹配任意一个指定字符,匹配含任意数字的行
grep "[a-zA-Z]" grep_test.txt # 匹配含任意字母的行 - grep "[^0-9]" grep_test.txt # 反向字符集([^]):匹配除指定字符外的任意字符,匹配含非数字字符的行
- grep -w "Hello" grep_test.txt # 等价于 grep "\bHello\b",(\b单词边界:仅匹配完整单词)仅匹配完整单词 "Hello"(不匹配 "HelloWorld")
- grep "\Babc\B" grep_test.txt # (\B非单词边界:仅匹配非完整单词)匹配 "abc" 前后不是单词边界的场景(如 "xabcx")
- grep -oE "[0-9]{3}-[0-9]{4}-[0-9]{4}" grep_test.txt # 仅提取手机号格式字符串
- grep -oE "[a-zA-Z0-9_]+@[a-zA-Z0-9]+\.[a-zA-Z]+" grep_test.txt # 提取邮箱地址
- grep -E "[0-9]{4}/[0-9]{2}/[0-9]{2}" grep_test.txt # 匹配 YYYY/MM/DD 格式日期
- grep "你好" grep_test.txt # 直接匹配中文字符
- grep "a\\\b" grep_test.txt #匹配 "a\b"(\ 需转义为 \\,终端中需写 \\\\ 或用单引号包裹)
grep 'a\\b' grep_test.txt # 单引号中无需多重转义,直接写 a\\b 匹配 a\b - grep -oE "(13[0-9])-[0-9]{4}-[0-9]{4}" grep_test.txt #分组匹配() 分组匹配手机号前 3 位(13x 开头)
- grep -Po "aaa(?= bbb)" grep_test.txt #前瞻匹配, 匹配 "aaa" 且后面紧跟 " bbb"(仅输出 aaa)
- grep -Po "(?<=bbb )aaa" grep_test.txt # 后顾匹配,匹配 "aaa" 且前面紧跟 "bbb "(仅输出 aaa)
文件 / 目录精准搜索
- grep -r --relative "Error" grep_test_dir/ # 递归搜索,显示相对路径+匹配内容
- grep -r --include="*.txt" "Error" ./ # 递归搜索当前目录,仅搜索 .txt 后缀文件
- grep -a "keyword" binary_file # 搜索二进制文件中的字符串(需确保文件含可读字符串)
- grep -rI "Error" ./ # 递归搜索,跳过二进制文件
- grep -b "Hello" grep_test.txt # 显示每个匹配 "Hello" 在该行的字节偏移量
- echo -e "Error\nWarning" > patterns.txt && grep -f patterns.txt grep_test.txt # 搜索 patterns.txt 中所有模式
- grep -if patterns.txt grep_test.txt # 忽略模式文件中字符串的大小写
- grep -r --ignore-case-filenames "error" ./ # 递归搜索,文件名不区分大小写
- grep -C 1 --group-separator="=====" "Error" grep_test.txt # 上下文之间用 ===== 分隔
- grep -v "^$" grep_test.txt | grep "Hello" # 先过滤空行,再搜索 "Hello"
- grep -v "^#" grep_test.txt # 排除行首以 # 开头的注释行(常用)
- grep -v -e "^$" -e "^#" grep_test.txt # 排除空行(-e 模式1)和注释行(-e 模式2)(常用)
- grep -cH "Error" grep_test.txt grep_test_dir/* # 输出每个文件的匹配行数(H=显示文件名)
- ln -s grep_test.txt link.txt && grep -L "Error" link.txt # 搜索符号链接指向的文件,显示无匹配的文件名
- grep -r --no-follow "Error" ./ # 递归搜索,不跟随符号链接
- grep -r --include="*log*" "Error" ./ # 递归搜索文件名含 log 的文件,include 常用
- grep -nH "Error" grep_test.txt grep_test_dir/* # 显示文件名+行号+匹配内容
- gzip -c grep_test.txt > grep_test.txt.gz && zgrep "Hello" grep_test.txt.gz # 搜索 .gz 压缩文件
- zgrep -r "Error" ./ --include="*.gz" # 递归搜索 .gz 压缩文件中的 "Error"
- grep -w "foo bar" grep_test.txt # 匹配 "foo" 和 "bar" 之间有任意空白字符的行
- sort grep_test.txt | uniq -d | grep -f - grep_test.txt # 先找重复行,再在原文件中定位
- sort grep_test.txt | uniq -u | grep -f - grep_test.txt # 查找仅出现一次的行
- grep -E "[0-9]" grep_test.txt | grep -E "[a-zA-Z]" # 同时含数字和字母的行
- grep -E ".{50,}" grep_test.txt # 匹配长度大于等于 50 个字符的行
- grep -vE ".{20,}" grep_test.txt # 匹配长度小于 20 个字符的行
- grep -E "\(.*[^)]$" code.txt # 匹配行首有 ( 但行尾无 ) 的行(可能未闭合),查找未闭合的括号(简单场景)
工作中grep高频次用法:
- grep -oE "<[^>]+>" html.txt # 提取 HTML/XML 中的所有标签
- grep "root" /etc/passwd # 查找 root 用户信息
grep -v "/bin/false" /etc/passwd # 查找可登录的用户(排除 /bin/false shells) - grep -rE "password|secret|key" /etc/ # 递归搜索 /etc 下含密码/密钥相关关键词的文件
- grep -iE "error|fail|critical" /var/log/app.log > error.log # 提取错误日志到 error.log
- grep -iE "error|fail" /var/log/app.log | grep -oE "Error [A-Za-z]+" | sort | uniq -c # 统计错误类型频次
- ps aux | grep "nginx" | grep -v grep # 查找 nginx 进程,排除 grep 自身
- grep "@" grep_test.txt # 匹配含 @ 的行(如邮箱)
grep "#" grep_test.txt # 匹配含 # 的行(如注释) - grep "2025-11-26 10:" /var/log/app.log | grep -E "10:[0-5][0-9]:" # 筛选 10 点到 11 点的日志
- grep -oE "https?://[a-zA-Z0-9.-]+\.[a-zA-Z]+" url.txt # 提取 HTTP/HTTPS URL(常用)
- grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" ip.txt # 提取文件中的 IP 地址(不严格校验合法性)
- grep "^SELINUX=" /etc/selinux/config # 查看 SELinux 配置状态(enforcing/disabled)
- grep -rE "listen [0-9]+" /etc/nginx/ # 递归查找 Nginx 监听的端口
- netstat -tuln | grep ":80" # 查找占用 80 端口的服务
- grep -E "^datadir|^socket|^port" /etc/my.cnf # 查找 MySQL 数据目录、套接字、端口配置
- grep -E " 404 | 500 " /var/log/httpd/access_log # 筛选 404(未找到)和 500(服务器错误)日志
- systemctl list-unit-files --type=service | grep "enabled" # 查找已启用的系统服务
- iptables -L -n | grep "ACCEPT" | grep -E "[0-9]+" # 查找防火墙允许访问的端口
- docker logs container_name | grep -i "error" # 查看容器日志中的错误信息
- python -m py_compile script.py 2>&1 | grep "SyntaxError" # 检查脚本语法错误
- ps aux | grep "java" | grep -v grep | grep -oE "-Xmx[0-9]+[mMgG]" # 提取 JVM 最大堆内存参数
- grep -rE "AccessKeyId|SecretAccessKey" /data/config/ # 递归查找密钥信息
- grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" /var/log/nginx/access.log | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c | sort -nr | head -10 # 统计 Top10 访问 IP
- grep -E "^error_reporting" /etc/php.ini # 查看 PHP 错误报告级别配置
- grep "Failed password" /var/log/secure # 查找 SSH 登录失败记录
- du -sh /* 2>/dev/null | grep -E "[0-9]+G" # 查找大小超过 1GB 的文件/目录
- git status | grep "modified:" # 查找 Git 仓库中已修改但未提交的文件
- grep -E ",Beijing$" data.csv # 筛选最后一列(city)为 Beijing 的行
- grep -rE "add_header Access-Control-Allow-Origin" /etc/nginx/ # 查找跨域配置
- grep -i "out of memory" /var/log/messages # 查找系统内存溢出日志
- grep -E "^#max_connections" /etc/my.cnf # 查找 MySQL 中被注释的最大连接数参数
- grep -r "." /var/spool/cron/ # 查找所有用户的定时任务
crontab -l | grep -v "^#" # 查看当前用户的定时任务(排除注释行)
sed用法
sed -i 直接修改原文件,sed默输出所有内容-n指定输出匹配行
-i.bak #(重要)在修改文件前本地创建原始文件副本
sed -n '/error/p' log.txt # 只打印匹配的行(结合-n选项)
替换
- sed -i 's/foo/bar/' file.txt # 简单替换(每行第一个匹配)
- sed -i 's/foo/bar/g' file.txt # 全局替换(所有匹配)
- sed '5s/old/new/' file.txt # 只在第5行进行替换
- sed -i '5,10 s/abc/XYZ/g' file.txt
- sed -i '5;10 s/test/TEST/' file.txt
- sed -i '$ s/END/结束/' file.txt
- sed -i.bak '2-4c 第2-4行已合并为一行' sed_test.txt # 替换第2-4行为一行
- sed '3,/stop/s/old/new/g' file.txt # 替换第3行到包含"stop"的行之间的内容
删除
- sed '/^$/d' file.txt #删除空行,不包含空格/制表符
- sed -E /^[[:space:]]*$/d file.txt # 删除空行,包含空格/制表符
- sed -E 's/^[[:space:]]*//' file.txt # 删除多余的空格
- sed -E s/^[[:space:]]*// file.txt # 删除行首空格
- sed -E s/[[:space:]]*$// file.txt # 删除行尾空格
- sed '/debug/d' file.txt # 删除包含"debug"的行
- sed '5d' file.txt # 删除第5行
- sed '10,20d' file.txt # 删除第10到20行
- sed '1d;5d' file.txt # 同时删除第1行和第5行
- sed '$d' file.txt # 删除最后一行($ 表示行尾)
- sed -i.bak '18,$d' sed_test.txt # 删除第18行到末尾
- sed -i.bak '/^#/d' sed_test.txt # 删除行首#的注释行
追加/插入
- sed '$a\这是最后一行添加的内容' file.txt # 在最后一行添加文本
- sed -i.bak 'G' sed_test.txt # 所有行后追加空行
- sed -i.bak '/Hello/a ' sed_test.txt #匹配行后追加空行
- sed '/end/a\这是追加的内容' file.txt #在包含"end"的行后追加文本
- sed -i.bak '/Hello/i ' sed_test.txt # Hello行前插入空行
- sed '/start/i\这是插入的内容' file.txt # 在包含"start"的行前插入文本
- sed -i.bak '3i 第一行插入内容\n第二行插入内容' sed_test.txt # 第3行前插入两行
其他
- sed 's/foo/bar/; s/baz/qux/' file.txt # 使用分号分隔多个命令
- sed -e 's/foo/bar/' -e 's/baz/qux/' file.txt # 使用多个-e选项:对第一个-e处理后的该行,执行第二个-e命令输出最终处理后的结果
- sed '/pattern/{s/old/new/; s/foo/bar/}' file.txt # 使用大括号分组命令
工作中sed高频次用法
- sed -E s/<[^>]*>//g file.txt # 删除HTML标签
- sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config #(常用)永久禁用SELinux 安全机制
- sed -i 's/^BOOTPROTO=.*/BOOTPROTO=static/' /etc/sysconfig/network-scripts/ifcfg-ens33#更改网卡DHCP为 static
- sed -i 's/listen 80;/listen 8080;/' /etc/nginx/nginx.conf #修改 Nginx 端口(替换监听端口)
- sed -i '/^2025-10-/d' app.log # 删除 2025年10月的日志(保留11月后)
- sed -i 's/^max_connections = 1000/max_connections = 2000/' /etc/my.cnf # MySQL 最大连接数修改
- sed -n '/ERROR/p' app.log > error.log # 提取日志中含 ERROR 的行,保存到 error.log
- sed -e '/^$/d' -e '/^#/d' /etc/sysctl.conf > sysctl.conf.clean # 清理空白行和注释行
- find /data -name "*.conf" -exec sed -i 's/old_value/new_value/g' {} \; # 递归替换所有 .conf 文件中的字符串
- sed '1d' data.csv > data_no_header.csv # 删除 CSV 文件第一行(表头)
- sed 's/\x00//g' corrupted.txt > fixed.txt # 删除文件中的空字符(\x00),修复乱码
- sed -i.bak -nE 's/.*([a-zA-Z0-9_]+@[a-zA-Z0-9]+\.[a-zA-Z]+).*/\1/p' sed_test.txt # 仅保留邮箱
- sed -i.bak -nE 's/.*([0-9]{3}-[0-9]{4}-[0-9]{4}).*/\1/p' sed_test.txt # 仅保留手机号,覆盖原文件
文本处理组合用法:
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | sort | uniq -c | sort -nr | head -3
awk '{print $1, $3}' score.txt | grep -v "数学" | awk '$2>=60{print}' | sort -k2 -nr | wc -l
grep " 401 " access.log | awk '{print $1, $4}' | tr -d '[' | sort | uniq | wc -l
grep -oE '"GET /[^ ]+"' access.log | sed 's/"GET //; s/"//g' | sort | uniq -c | sort -nr
# CSV文件处理:过滤、转换、格式化输出
cat data.csv |grep -v "#" |awk -F',' '{print $1,$3}' |tr ' ' ',' |sort -t',' -k2 -nr |column -t -s','
# 实时监控日志,多级过滤,输出到文件和屏幕
tail -f /var/log/app.log |grep -E "(ERROR|WARN)" |tee /tmp/errors.log |awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' |tee -a /varerror.log
# 分析Nginx日志:找出404错误,统计URL出现次数,排序输出
cat /var/log/nginx/access.log |grep " 404 " |awk '{print $7}' |sort |uniq -c |sort -nr |head -n 20
&spm=1001.2101.3001.5002&articleId=155278373&d=1&t=3&u=339cdc2a564447c0afc844a788545de7)
2万+

被折叠的 条评论
为什么被折叠?



