likes
comments
collection
share

shell脚本中sed的用法

作者站长头像
站长
· 阅读数 5

1.sed

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

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

shell脚本中sed的用法

1.1基本用法

格式: sed [ 选项 ].... 'script;script;....'(自身脚本语法) [input file...]

常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p'  -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s  将多个文件视为独立文件,而不是单个连续的长文件流
sed ' ' /etc/fstab
##查看文件内容,sed自带打印功能

sed ''</etc/fstab
##支持重定向

cat /etc/issue |sed ''
也支持管道符

shell脚本中sed的用法

1.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 偶数行

shell脚本中sed的用法

shell脚本中sed的用法

命令:

命令
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q           结束或退出sed
[root@lzz opt]#ifconfig ens33|sed -n '2p'
        inet 192.168.223.100  netmask 255.255.255.0  broadcast 192.168.223.255

shell脚本中sed的用法

支持正则表达式
[root@localhost ~]#sed -n '/root/p' /etc/passwd
#                 命令 精确匹配root ,p为手动打印  
###自动打印需要关闭否则会全部打印

shell脚本中sed的用法

[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

也可以匹配正则表达式之间的行/ /,/ /

举例显示/etc/passwd 中b开头和f开头中间的行

先开始找b开头一直找到f开头
然后再重新找b开头,一找到f开头,没有f开头就全显示
重复循环

shell脚本中sed的用法

在脚本命令中i 代表在你列出的行号前面加入内容
[root@lzz opt]#seq 10 |sed '2ihehe'
1
hehe
2
3
4
5
6
7
8
9
10


a表达式在自己列出的行号之后加入内容
[root@localhost ~]#seq 10 |sed '2ahehe'
###第二行后追加hehe
1
2
hehe
3
4
5
6
7
8
9
10

shell脚本中sed的用法

[root@lzz opt]#seq 10 |sed '2a\\nhaha\nhehe'
###\表示空格    \n 表示换行,就相当于换了两行
1
2

haha
hehe
3
4
5
6
7
8
9
10


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

shell脚本中sed的用法

[root@localhost ky15]# seq 10 |sed -n '2!p'
#取反  ,不显示第二行的内容
1
3
4
5
6
7
8
9
10

[root@lzz opt]#seq 10 |sed '2r /etc/issue'
#将/etc/issue 中的内容直接复制到第二行后面
1
2
\S
Kernel \r on an \m

3
4
5
6
7
8
9
10

shell脚本中sed的用法

1.3sed搜索替代

格式:

sed  -i  's///'  文件名

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写
如何使用sed替换网卡内的ip地址
[root@lzzopt]#sedi.bak's/IPADDR=192.168.223.100/IPADDR=192.168.223.110/' /etc/sysconfig/network-scripts/ifcfg-ens33

shell脚本中sed的用法

[root@localhost ~]#sed 's/root/&er/g' /etc/passwd
#&指代之前的内容

shell脚本中sed的用法

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

shell脚本中sed的用法

将网卡位置的绝对路径目录与文件相分隔
[root@lzz opt]#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's#(.*)s/(.*)#\1#p'
/etc/sysconfig/network-scripts

shell脚本中sed的用法

提取以下内容的版本号
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
[root@lzz opt]#cat 11
ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar
[root@lzz opt]#cat 11 | sed -nr 's/(.*)-(.*)(.jar)/\2/p'
1.9.7
1.9.7
2.7.7
3.4
1.0
0.7.6
5.0.4
1.9.5
1.64
1.46
1.64
2.5.5

shell脚本中sed的用法

1.4sed中的变量

[root@lzz opt]#name=root
[root@lzz opt]#sed -nr '/'$name'/p' /etc/passwd
rootec:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rootec:/sbin/nologin

shell脚本中sed的用法

[root@www data]#port=8080
[root@www data]#sed -ri 's/^Listen 80/Listen '$port'/' httpd.conf

shell脚本中sed的用法

shell脚本中sed的用法