sed命令使用详解
环境:centos7
使用sed-格式
命令行格式
sed [options] 'command' file(s)
option: -e;-n
command: 行定位 (正则)+sed命令(操作)
格式行格式举例
sed -n '/root/p'
sed -e '10,20p' -e 's/false/true/g'
基本操作命令
-p (打印相关的行)记住要和参数-n 配合
sed -n 'p' passwd
sed ---行定位
定位一行: x;行号 /pattern/ 正则
sed -n '10p' passwd
sed -n '/root/p' passwd
定位几行:
x,y; x行到y行
/pattern/,x; x y都可以用正则来表示
x,y! ;表示不取x到y的行即取反
nl passwd |sed -n '10,20p' #nl开启行号
nl passwd |sed -n '/operator/,/libstoragemgmt/p' # 打印从operator开始到libstoragemgmt结尾的行
nl passwd |sed -n '5,10!p' #打印5到10行以外的其他行
nl passwd |sed -n '10!p' #打印10行以外的其他行
定位间隔几行:firs~step
nl passwd |sed -n '2~3p' #表示第二行开始中间每间隔3行输出 (25812 的行)
sed---操作命令
基本操作命令(2)
-a (新增行) / i (插入行)
-c (替代行)
-d (删除行)
nl passwd |sed '2a ======' #在第2行后面添加=====的一行内容
1 2 3 4 5 | [root@tmp] # nl passwd |sed '2a ======' 1 root:x:0:0:root: /root : /bin/bash 2 bin:x:1:1:bin: /bin : /sbin/nologin ====== 3 daemon:x:2:2:daemon: /sbin : /sbin/nologin |
nl passwd |sed '2,5a ======' #在第2行到5行每行后面添加=====的一行内容
1 2 3 4 5 6 7 8 9 10 | [root@tmp] # nl passwd |sed '2,5a ======' 1 root:x:0:0:root: /root : /bin/bash 2 bin:x:1:1:bin: /bin : /sbin/nologin ====== 3 daemon:x:2:2:daemon: /sbin : /sbin/nologin ====== 4 adm:x:3:4:adm: /var/adm : /sbin/nologin ====== 5 lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin ====== |
nl passwd |sed '2i ======' #在第5行前面插入=====的一行内容
1 2 3 4 | [root@tmp] # nl passwd |sed '2i ======' 1 root:x:0:0:root: /root : /bin/bash ====== 2 bin:x:1:1:bin: /bin : /sbin/nologin |
nl passwd |sed '2c ======' #将第二行替换成=====的一行内容
1 2 3 4 | [root@tmp] # nl passwd |sed '2c ======' 1 root:x:0:0:root: /root : /bin/bash ====== 3 daemon:x:2:2:daemon: /sbin : /sbin/nologin |
nl passwd |sed '1,2c ======' #将多行替换成=====的一行内容
1 2 3 | [root@ tmp] # nl passwd |sed '1,2c ======' ====== 3 daemon:x:2:2:daemon: /sbin : /sbin/nologin |
nl passwd |sed '1,2d' #删除1,2行
nl passwd |sed '/root/d' #删除带root的行
1 2 3 4 | [root@tmp] # nl passwd |sed '/root/d' 2 bin:x:1:1:bin: /bin : /sbin/nologin [root@tmp] # nl passwd |sed '1,2d' 3 daemon:x:2:2:daemon: /sbin : /sbin/nologin |
系统优化
sed '$a port 10022 \nallowrootlogin no' sshd_config.conf #表示在文件末尾添加两行
$表示文件末尾 \n 表示换行
1 2 3 4 | [root@tmp] # sed '1i port 10022 \nallowrootlogin no' passwd #第一行前添加两行 port 10022 allowrootlogin no root:x:0:0:root: /root : /bin/bash |
sed '$a \ port 10022 \n allowrootlogin no' sshd_config.conf #美化添加空格a后面需要转义空格
1 2 3 4 | # ForceCommand cvs server port 10022 allowrootlogin no [root@tmp] # sed '$a \ port 10022 \n allowrootlogin no' /etc/ssh/sshd_config |
sed '/^$/d' d.txt #删除空行 /^$/ 正则表达式空行
sed -n '/Error/p' log.txt #日志文件中查找错误行 正则匹配错误行
sed替换命令
-s:替换命令
-g:(全局) 替换所有的匹配字符
sed 's/false/true/' passwd
sed 's/false/true/g' passwd
sed获取服务器ip(思路:获取行,替换ip前后面内容)
1 2 3 4 5 6 7 8 9 10 11 | [root@~] # ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.27.0.7 netmask 255.255.240.0 broadcast 172.27.15.255 inet6 fe80::5054:ff:fe3c:c92e prefixlen 64 scopeid 0x20<link> ether 52:54:00:3c:c9:2e txqueuelen 1000 (Ethernet) RX packets 1115181672 bytes 312544971311 (291.0 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1033162772 bytes 520647988228 (484.8 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@~] # ifconfig eth0|sed -n '/inet /p'|sed 's/inet//'|sed 's/netmask.*$//' 172.27.0.7 |
sed高级操作命令
-{ }:多个sed命令,用;分开
1 | nl passwd | sed '{10,20d;s /faluse/true/g } #删除10到20行 并且替换faluse为true |
-n: 读取下一个输入行(用下一个命令处理)sed是一行一行输入 -n表示下一行
和nl passwd|sed -n '1~2p' 跳行命令相似
1 2 3 | [root@tmp] # nl passwd|sed -n '{n;p}' #第一行的下一行为第二行 2 bin:x:1:1:bin: /bin : /sbin/nologin 4 adm:x:3:4:adm: /var/adm : /sbin/nologin |
-& :替换固定字符串 列子 sed 's/A/A12/' 改为使用固定字符串 sed 's/A/&12/'
1 2 3 4 5 6 7 | #下面使用&处理passwd,将用户后面加两个空格 [root@tmp] # sed 's/^[a-z]\+/& /' passwd root :x:0:0:root: /root : /bin/bash bin :x:1:1:bin: /bin : /sbin/nologin daemon :x:2:2:daemon: /sbin : /sbin/nologin adm :x:3:4:adm: /var/adm : /sbin/nologin lp :x:4:7:lp: /var/spool/lpd : /sbin/nologin |
案例一:大小写转换
将用户名的首字母转换为大小/小写字母
(元字符\u \l \U \L :转换为大写/小写字符)
1 2 3 4 5 | [root@tmp] # sed 's/^[a-z]\+/\u&/' passwd #首字母大小 Root:x:0:0:root: /root : /bin/bash Bin:x:1:1:bin: /bin : /sbin/nologin Daemon:x:2:2:daemon: /sbin : /sbin/nologin Adm:x:3:4:adm: /var/adm : /sbin/nologin |
案例二: 将文件夹下的.txt 文件转换为大写
1 2 3 4 5 6 7 8 | [root@SmartCommunity-Node01 tmp] # ls *.txt a_w.txt b.txt cal .txt d.txt #\W代表元字符[a-zA_Z_0-9] [root@SmartCommunity-Node01 tmp] # ls *.txt|sed 's/^\w\+/\U&/' A_W.txt B.txt CAL.txt D.txt |
案例三:数据筛选
“获取passwd中user、uid和gid”
1 2 3 4 5 | [root@tmp] # sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/USER:\1 UID:\2 GID\3/' passwd USER:root UID:0 GID0 USER:bin UID:1 GID1 USER:daemon UID:2 GID2 USER:adm UID:3 GID4 |
-\( \) :替换某种(部分)字符串(\1 ,\2)
s/w1w2w3/w2/ :w1w2w3 替换成w2
使用()改写 s/w1\(w2\)w3/\1/
案例:获取服务器ip
\([0-9.]\+\) 代表ip
1 2 3 4 | [root@tmp] # ifconfig eth0|sed -n '/inet /p' inet 172.27.0.7 netmask 255.255.240.0 broadcast 172.27.15.255 [root@tmp] # ifconfig eth0|sed -n '/inet /p'|sed 's/inet \([0-9.]\+\).*$/\1/' 172.27.0.7 |
-r : 复制指定文件插入到匹配行
-w :复制匹配行拷贝指定文件里
源文件 <--互操作--> 目标文件
1 2 3 4 5 6 7 8 | [root@tmp] # echo -e 'dfg\nabc' > f.txt [root@tmp] # more f.txt dfg abc [root@tmp] # echo -e '123\n456' >e.txt [root@tmp] # more e.txt 123 456 |
#将文件f.txt读入到e.txt的第一行后面
1 2 3 4 5 | [root@tmp] # sed '1r f.txt' e.txt 123 dfg abc 456 |
w:写操作会改变写的文件(注意)
1 2 3 4 5 6 7 8 9 10 11 | [root@tmp] # sed 'w f.txt' e.txt #将e文件内容写入f (f相当于e的mv) 123 456 [root@tmp] # more f.txt 123 456 [root@tmp] # sed '1w f.txt' e.txt #将e的第一行写入f (f就只有e的第一行内容) 123 456 [root@tmp] # more f.txt 123 |
-q: 退出sed
1 2 3 4 | [root@tmp] # nl passwd |sed '/daemon/q' #读到daemon就退出 1 root:x:0:0:root: /root : /bin/bash 2 bin:x:1:1:bin: /bin : /sbin/nologin 3 daemon:x:2:2:daemon: /sbin : /sbin/nologin |
脚本格式
sed -f scriptfile file(s)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)