Linux:shell脚本:基础使用(5)《正则表达式-sed工具》_linux脚本表达式s-CSDN博客https://blog.csdn.net/w14768855/article/details/132347574?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170842228716800197075232%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170842228716800197075232&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-132347574-null-null.nonecase&utm_term=sed&spm=1018.2226.3001.4450一些基础的案例我都写在这个文章里了
简单的概述一下:一种流编辑器,它是文本处理中非常常用的工具,能够完美的配合正则表达式使用。可删除(delete)、改变(change)、添加(append)、插入(insert)、合并、交换文件中的数据行,或读入其它文件的数据到文件中,也可替换(substuite)它们其中的字符串、或转换(tranfer)其中的字母等。
语法:sed 参数 条件 文件等
常用选项:
-n 抑制自动打印pattern space,sed默认输出全部,-n用于取消默认输出;
-i 编辑文件;
-r 支持扩展正则表达式;
常用操作符:
a 在当前行的下一行添加内容
c 将选定行替换为指定内容
d 删除选定的行
i 在当前行的上一行添加内容
p 打印指定行内容
s 替换选定字符为指定字符
1.改(案例)
带-i才对文件进行生效的修该,如果不带-i只是将源文件修改后的结果输出一下,但是不会进行修改文件
sed -i 's/old/new/g' file #所有内容进行替换,把old替换成new
sed -i '2s/old/new/g' file #将文件的第二行的所有old替换成new
sed -i '/reg/s/old/new/g' file #包含red的行里面所有的old替换成new
sed -i '/aaa/{H;d};$G' file #将包含aaa的行迁移至文件的末尾
sed -i '/aaa/{H;d};15G' file #将包含aaa的行迁移至15行后
sed -i '/aaa/w 2.file' 1.file #将1.file中包含aaa的行保存至2.file
sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-ens32#将sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-ens32
#这个文件中的所有dhcp改成static 只显示 出来但是不会写进文件里生效,意思就
#是给你看一下修该后的,但是原有数据不会被改变,你再进去配置发现一点没变
sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1#将sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-ens32
#这个文件中的所有dhcp改成static,直接修该文件,并不会显示了
sed -i 's/dhcp/static/g' ip #将所有的dhcp替换为static
sed -i '/^IP1/s/static/dhcp/g' ip #将IP1开头的行替换
sed -i '2s/static/dhcp/g' ip #第2行的所有static替换成dhcp并写入文件
sed -i '7s/disabled/enforcing/g' /etc/selinux/config #将第七行的全部disabled改为enforcing
2.删
语法:sed '/表达式/d' 文件
常用语法:sed -i '2d' file #基于行号进行删除
sed -i '/reg/d' file #基于正则进行删除
sed '/^$/d' ip #删除空行并显示在屏幕上,并不会对文件进行修改
sed -i '/IP1/d' ip #删除包含IP1的行
sed -i '/^IP2/d' ip #删除以IP2开头的行
sed -i '2d' ip #删除第二行
3.增
语法:sed ' /表达式/a "需要添加的文字"' 文件
常用语法:sed -i '2a text' file ##在某行后添加内容
sed -i '2i text' file ##在某行前添加内容
sed -i '/reg/a text' file ##结合正则在匹配行后添加内容
sed 'a IP3=static' ip #每一行后都加上IP3=staticsed '3a IP3=static' ip #只在第3行后加上IP3=static,并显示不修改sed '3i IP3=static' ip #只在第3行前加上IP3=static,显示不修改sed -i '3a IP3=static' ip #修改,不显示sed -i '/^IP3/a "test add"' ip #在以IP3开头的行后添加
4.查
语法:sed -n '/表达式/p' 文件
常用语法:sed -n '2p' file ##基于行号打印内容
sed -n '/reg/p' file ##基于正则匹配行打印内容
sed -n '3,5p' file ##查看行号范围
sed -n 'p;n' file ##查看所有奇数行
sed -n 'n;p' file ##查看所有偶数行
sed -n '1,5{p;n}' file ##查看1-5行内的奇数行
sed -n '5,${p;n}' file ##查看5-末尾行内的奇数行
sed -n '5,/aaa/p' file ##查看自第五行到末尾行的包含aaa的行
sed -n '/aaa/=' file ##输出包含aaa的行的行号,仅仅是行号
sed -n '2p' /etc/hosts ##查看第二行
sed -n '/www/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看包含www的解析记录
sed -n '/.100$/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看以.100结尾的行
sed -n '2~2p' ip ##从第二行,每隔两行显示
ifconfig eth0|sed -n '2p'|sed 's#.*dr:##g'|sed 's# Bc.*##g' ##注:当sed命令处理的内容为多行内容,则以/作为表达式的分隔,若sed命令处理的内容为单行内容,作为截取的作用,以#号作为分隔符;
10.0.0.9
ifconfig eth0|sed -n '2p'|sed -r 's#(.*dr:)(.*)(Bc.*$)#\2#g' ##-r支持扩展正则,\2将2转义,打印出第二个范围(.*)
10.0.0.9
ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*$#\1#g'
10.0.0.9
ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp'
10.0.0.9
ifconfig eth0|sed -nr '1s#^.*dr (.*)#\1#gp'
00:0C:29:33:C8:75
ifconfig eth0|sed -n '1p'|sed -r 's#(^.*dr )(.*)#\2#g'
00:0C:29:33:C8:75
ifconfig eth0|sed -n '1p'|sed 's#^.*dr ##g'
00:0C:29:33:C8:75
ifconfig eth0|sed -nr '1s#^.*t (.*) 00.*$#\1#gp'
HWaddr
stat /etc/hosts|sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
stat /etc/hosts|sed -n '4p'|sed 's#^.*ss: (##g'|sed 's#/-.*$##g'
0644
stat /etc/hosts|sed -n '4p'|sed -r 's#^.*s: \((.*)/-.*$#\1#g'
0644
stat /etc/hosts|sed -nr '4s#^.*s: \((.*)/-.*$#\1#gp'
0644
stat /etc/hosts|sed -nr '4s#(^.*s: \()(.*)(/-.*$)#\2#gp'
0644