Shell脚本:三剑客(sed)

目录

一、sed

1、基本用法

 2、sed脚本格式

 3、搜索替代


一、sed

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快

1、基本用法

sed     [option]...       'script;script;...'        [input  file...]

               选项         自身脚本语法         支持标准输入管道

 常用选项:

  • -n 不输出模式空间内容到屏幕,即不自动打印
  • -e 多点编辑
  • -f FILE 从指定文件中读取编辑脚本
  • -r, -E 使用扩展正则表达式
  • -i.bak 备份文件并原处编辑
  • -s           将多个文件视为独立文件,而不是单个连续的长文件流
[root@localhost ~]#sed 
#提示错误
[root@localhost ~]#sed ''
####默认将输入内容打印出来
aaa
aaa
dd
dd
dd
dd
[root@localhost ~]#sed '' /etc/fstab 
####查看文件内容
#
# /etc/fstab
# Created by anaconda on Fri Aug  6 20:57:12 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e9364e9b-a85b-49d7-9652-3a56202e14c8 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]#sed '' </etc/fstab 
####支持重定向
#
# /etc/fstab
# Created by anaconda on Fri Aug  6 20:57:12 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e9364e9b-a85b-49d7-9652-3a56202e14c8 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@localhost ~]#cat /etc/issue |sed ''
#####也支持管道符
\S
Kernel \r on an \m

 2、sed脚本格式

单引号中间需要写脚本;脚本格式如下

'地址+命令'组成


1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
   #:指定的行,$:最后一行
   /pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
   #,#     #从#行到第#行,3,6 从第3行到第6行
   #,+#   #从#行到+#行,3,+4 表示从3行到第7行
   /pat1/,/pat2/    第一个正则表达式和第二个正则表达式之间的行
   #,/pat/  从#号行为开始找到 pat为止 
   /pat/,#  找到#号个pat为止
4. 步进:~
     1~2 奇数行
     2~2 偶数行
     
命令
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q           结束或退出sed
[root@localhost ~]#seq 10 | sed 'p'
#带有自动打印功能,p又再打印一遍
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
[root@localhost ~]#seq 10 | sed -n 'p'
#-n 选项关闭自动打印功能
1
2
3
4
5
6
7
8
9
10

#如何加入地址
直接显示第三行
[root@localhost ~]#seq 10 | sed -n '3p'
#直接显示第3行
3
[root@localhost ~]#ifconfig ens33|sed -n 2p
#直接显示第二行内容
        inet 192.168.91.100  netmask 255.255.255.0  broadcast 192.168.91.255


###还支持正则表达式

[root@localhost ~]#sed '/root/p' /etc/passwd
###自动打印需要关闭否则会全部打印
root:x:0:0:root:/root:/bin/bash
省略多行。。。。。。。。
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

[root@localhost ~]#sed -n '/root/p' /etc/passwd
##将包含root的行打印出来   /root(需要匹配的内容)/p(打印)  文件名  
###与 grep root /etc/passwd 功能相同
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 

 

 

 

 

####如何显示范围  行号,行号
[root@localhost ~]#seq 10|sed -n '3,6p'
###显示范围
3
4
5
6
[root@localhost ~]#seq 10|sed -n '3,+4p'
##3 往后加4行
3
4
5
6
7


###还可以匹配 两个正则表达式之间的行
举例子
[root@localhost ~]#cat /etc/passwd
###我想显示b开头 和f开头中间的行
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin

[root@localhost ~]#sed -n '/^b/,/^f/p' /etc/passwd
###     基本格式     '/表达式1/,/表达式2/p' (不要忘记打印)p  文件名
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
####匹配方式   如果有多个复合条件的表达式
先开始找b开头一直找到f开头
然后再重新找b开头,一找到f开头,没有f开头就全显示
重复循环

 

#奇数偶数表示
[root@localhost ~]#seq 10|sed -n '1~2p'

[root@localhost ~]#seq 10|sed -n '2~2p'

[root@localhost ~]#seq 10|sed -n '3~3p'

-d选项删除
[root@localhost ~]#seq 10 |sed '3d'
###将第三行删除

##修改文件内容,常常用于修改配置文件
-i   与  -i.bak
修改文件  修改文件前先备份
[root@localhost ~]#seq 10 >test.txt
[root@localhost ~]#cat test.txt 

[root@localhost ~]#sed -i '2~2d' test.txt 
[root@localhost ~]#cat test.txt 

[root@localhost ~]#sed -i '2~2d' test.txt 
[root@localhost ~]#cat test.txt 

 

 

[root@localhost ~]#seq 10 |sed '2a \ hehe\nhaha'
###\表示空格    \n 表示换行
1
2
 hehe
haha
3
4
...

[root@localhost ~]#seq 10 |sed '2ihehe'
#第二行前面插入hehe
1
hehe
2
....

[root@localhost ~]#seq 10 |sed '2ihehe'
#第二行前面插入hehe
1
hehe
2
....

[root@localhost ~]#seq 10 |sed '2chehe'
#第二行替换成hehe
1
hehe
3
4
...

[root@localhost ky15]# seq 10 |sed -n '2!p'
#取反
1
3
4
...


 

 3、搜索替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写

 

[root@localhost ~]#sed 's/root/admin/g' /etc/passwd


[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/'
##分组 s//代表查找替换  ()代表分组    \1 代表留下的组
123
[root@localhost ~]#echo 123xyzabc |sed -r 's/(123)(xyz)(abc)/\1\2/'
123xyz
[root@localhost ~]#echo 123xyzabc |sed -r 's/(123)(xyz)(abc)/\1\3/'
123abc

[root@localhost ~]#ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
192.168.91.100

[root@localhost selinux]#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^/]+)@\2@p'
ifcfg-ens33

[root@localhost selinux]#cat 1.txt 2.txt 
123
456
123
abc
[root@localhost selinux]#sed -i -e 's/123/cba/' 1.txt  -e 's/abc/789/' 2.txt 

 

 

 

 提取版本号:

 

 改配置文件

调用变量来改文件
[root@localhost selinux]#name=root
[root@localhost selinux]#sed -nr '/$name/p' /etc/passwd
#使用双引号
[root@localhost selinux]#sed -nr "/$name/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost selinux]#sed -nr '/'$name'/p' /etc/passwd
#变量上家上单引号
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值