shell正则表达式智能匹配、grep智慧过滤工具、sed基本用法、sed基本操作指令实例代码
以下是 Shell 中正则表达式、grep 高级过滤、sed 基础与核心操作 的完整技术指南,内容系统、实用,适用于日志分析、文本处理、自动化脚本开发等场景。
一、Shell 正则表达式(Regex)智能匹配
⚠️ 注意:Bash 本身不直接支持完整正则,但可通过
[[ ]]、grep、sed、awk等工具使用。
1.基本元字符
| 符号 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符 | a.c → abc, a2c |
* | 匹配前一个字符 0 次或多次 | ab*c → ac, abc, abbc |
+ | 匹配前一个字符 1 次或多次(需 -E 或 egrep) | ab+c → abc, abbc(不含 ac) |
? | 匹配前一个字符 0 次或 1 次 | colou?r → color, colour |
^ | 行首锚定 | ^root → 以 root 开头的行 |
$ | 行尾锚定 | bash$ → 以 bash 结尾的行 |
\b | 单词边界(在 grep -P 或 sed -r 中可用) | \bword\b → 精确匹配单词 |
2.字符集合与范围
| 表达式 | 含义 |
|---|---|
[abc] | 匹配 a、b 或 c |
[a-z] | 匹配任意小写字母 |
[^0-9] | 匹配非数字字符 |
[[:digit:]] | 等价于 [0-9](POSIX 标准) |
[[:alpha:]] | 字母(大小写) |
[[:alnum:]] | 字母 + 数字 |
[[:space:]] | 空白字符(空格、制表符等) |
3.分组与引用(扩展正则)
| 表达式 | 含义 |
|---|---|
(abc) | 分组,可配合 ` |
| `a(b | c)d` |
\1, \2 | 反向引用(在 sed 中常用) |
✅ 启用扩展正则:
grep -E或egrepsed -r(GNU sed)或sed -E(macOS)
二、grep智慧过滤工具(文本搜索之王)
1.基础语法
grep [选项] '模式' 文件
2.常用选项
| 选项 | 作用 | 示例 |
|---|---|---|
-i | 忽略大小写 | grep -i "error" log.txt |
-v | 反向匹配(显示不匹配的行) | grep -v "^#" config.conf(过滤注释) |
-n | 显示行号 | grep -n "fail" syslog |
-r / -R | 递归搜索目录 | grep -r "password" /etc/ |
-l | 仅显示匹配文件名 | grep -l "TODO" *.sh |
-A N | 显示匹配行及后 N 行 | grep -A 2 "ERROR" app.log |
-B N | 显示匹配行及前 N 行 | grep -B 1 "Exception" app.log |
-C N | 显示上下文 N 行 | grep -C 1 "timeout" app.log |
-E | 使用扩展正则(推荐) | `grep -E "error |
-o | 仅输出匹配部分 | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" access.log(提取 IP) |
3.智慧过滤实战示例
✅ 提取所有 IPv4 地址
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log ✅ 过滤有效日志(排除空行和注释)
grep -vE "^\s*$|^#" nginx.conf
✅ 统计错误次数
grep -i "error" app.log | wc -l
✅ 查找包含多个关键词的行
grep -E "login.*failed|authentication error" auth.log
三、sed基本用法与核心操作指令
sed= Stream Editor,逐行处理文本流,常用于替换、删除、插入、提取。
1.基本语法
sed [选项] '命令' 文件 # 或 cat file | sed '命令'
2.常用选项
| 选项 | 作用 |
|---|---|
-n | 抑制默认输出(配合 p 打印) |
-i | 直接修改原文件(慎用!建议先备份) |
-e | 多命令(如 sed -e 's/a/b/' -e 's/c/d/') |
-r / -E | 启用扩展正则(GNU sed 用 -r,macOS 用 -E) |
3. 四大核心操作指令
(1) 替换(s///)——最常用!
# 基本格式:s/旧/新/[标志] sed 's/foo/bar/' file # 替换每行第一个 foo sed 's/foo/bar/g' file # 全局替换(g = global) sed 's/foo/bar/2g' file # 从第2个开始全局替换 sed -i 's/old/new/g' file # 直接修改文件
✅ 特殊符号:
&:代表匹配到的整个字符串echo "123" | sed 's/[0-9]*/(&)/' # 输出 (123)
\1,\2:反向引用分组echo "John,Doe" | sed 's/\([^,]*\),\(.*\)/\2 \1/' # 输出 Doe John
(2) 删除(d)
sed '2d' file # 删除第2行 sed '1,5d' file # 删除1-5行 sed '/error/d' file # 删除包含 error 的行 sed '/^$/d' file # 删除空行
(3) 打印(p)——配合 -n 使用
sed -n '2p' file # 仅打印第2行 sed -n '/success/p' file # 打印含 success 的行
(4) 追加/插入(a/i)
sed '2a\NEW LINE' file # 在第2行后追加 sed '2i\NEW LINE' file # 在第2行前插入
4. sed 实战示例
✅ 批量替换配置项
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
✅ 提取特定字段(类似 cut)
# 提取 /etc/passwd 中用户名(第一列) sed 's/:.*//' /etc/passwd
✅ 删除 HTML 标签
sed 's/<[^>]*>//g' webpage.html
✅ 格式化日期(YYYY-MM-DD → DD/MM/YYYY)
echo "2025-12-18" | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\/\1/'
# 输出:18/12/2025
四、组合使用:grep + sed 强大联动
# 从日志中提取错误IP并去重
grep "Failed password" /var/log/auth.log | \
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | \
sort | uniq -c | sort -nr
# 修改所有 .sh 文件中的解释器路径 sed -i '1s|^#!/bin/sh$|#!/bin/bash|' *.sh
关键总结表
| 工具 | 核心用途 | 推荐用法 |
|---|---|---|
| 正则 | 模式匹配基础 | 用 -E 启用扩展正则 |
| grep | 查找匹配行 | grep -E -v -n -r 组合使用 |
| sed | 编辑文本流 | s///g 替换、d 删除、-i 谨慎使用 |
💡 黄金法则:
- grep 用于“找”,sed 用于“改”;
- 先用
grep筛选,再用sed处理;- 修改文件前务必 备份 或先 不加
-i预览!
到此这篇关于shell正则表达式智能匹配、grep智慧过滤工具、sed基本用法、sed基本操作指令的文章就介绍到这了,更多相关shell正则表达式操作指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
linux shell数据重定向(输入重定向与输出重定向)详细分析
这篇文章主要介绍了linux shell数据重定向(输入重定向与输出重定向)详细分析,需要的朋友可以参考下2015-10-10
Linux命令行和shell脚本编程宝典 Richard Blum
Linux命令行和shell脚本编程宝典,主要介绍了linux一些命令的使用2012-09-09


最新评论