您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Shell sed

1. Sed 概述

Sed 全名为 Stream EDitor,顾名思义是对数据流进行编辑操作的命令,它能够遍历或流,对读入的输入流可以将其先存储在模式空间中,并将行号记录在内存中,利用模式空间中的一系列指定命令对其进行操作,待操作完成后从模式空间到 stdout,类似于在管道在其中对数据进行加工,完成后从另一头,接着读取下一行,重复往返,直至将所有标准输入读取处理完成。

Sed 相较于 grep/awk,其主要为对进行处理,可以对或标准输入数据流进行增删改查等操作,尤其适用于大或有规律的,利用此工具,能够帮助我们快捷的在编写 Shell 脚本中得心应手的对进行操作。

2. Sed 的适用场景

超大处理;

有规律的文本,例如格式化后的日志等;

对进行批量,替换等。

3. Sed 的处理模式

Sed 对输入的一行数据进行处理的模式,对整个进行重复执行此模式处理,在此说明对输入的一行数据处理的内在机制如下图所示:

首先读入流的一行到模式空间;

在模式空间内,对进行模式匹配处理;

处理后的数据;

清空当前模式空间;

读取第二行输入流到模式空间;

又开始对模式空间内的下一行输入数据进行处理。

4. 语法详解

sed 语法格式如下图所示:

sed [option] 'address command' [file …]

sed 的语法格式主要分为四个字段,options 选项,引号内有地址定界 / 命令,以及要处理的,接下来让我们详细讲解每语法字段,更全面的认识 sed 这个脚本利器。

选项为可选,利用它来为 sed 指定一些处理方式,主要的有如下:

-n: 静模式,我们知道 sed 认处理完模式空间后将到标准,利用这个这个参数仅 script 处理后的结果,不再认模式空间中的,例如:打印 /etc/passwd 的第三行

[root@shell workspace]# sed -n '3p' /etc/passwddaemon:x:::daemon:/sbin:/sbin/nologin

在此直接定界 3,然后 command 为 p 打印,由于不想 /etc/passwd 的全部,因此了 - n 选项。

* -e:<script>或--expression=<script> 以选项中指定的script来处理输入的文本,可以同时执行多个脚本;
* -f:对制定的直接进行sed的command操作;
* -i:直接原,我们都知道sed认不对进行,只是读入一行到模式空间中,处理完成后,此参数为也直接了源;
* -r:扩展正则表达式,而不是使用认的基础正则表达式。类比grep命令的egrep,更加快捷简洁的使用扩展正则表达式,因为有些元字符不用再使用反斜线"\\"了。

地址定界用来指定读入的边界或步长。

startline,endline:指定读入的开始行于结束行号。

/regexp/: 利用正则表达式匹配到的行进行处理,例如:打印 /etc/passwd 从以 root 开始到 sync 结束的

[root@shell workspace]# sed -n '/^root/,/^sync/p' /etc/passwdroot:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync

在此利用了匹配元字符 ^ 用来匹配行首,此在正则表达式中已经进行了详细解释。

/pattern1/,/pattern2/: 第一次被 pattern1 匹配到的行开始,直到被 pattern2 匹配到的行结束,例如:打印 /etc/passwd 的第四行到第七行的

[root@shell workspace]# sed -n '3,7p' /etc/passwddaemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/syncshutdown:x:::shutdown:/sbin:/sbin/shutdown

linenuber: 直接指定行号,需要处理哪一行。

startline,+n: 从那一行开始,往后 n 行结束,例如:打印 /etc/passwd 的从第三行开始往后的 2 行的

[root@shell workspace]# sed -n "3,+2p" /etc/passwddaemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin

startline~step: 指定步长,每隔 step 步进行处理,常用在奇偶数处理,例如:打印奇数行

seq 10 |sed -n '1~2p'

seq 来以数字为的 10 行,然后利用 ~2 作为步长打印。

具体对指定的进行怎样的处理,例如对模式空间内的进行增删改查具体的操作。

i:insert,在制定或匹配到的行前面新行为 string,i\string
为 /etc/passwd 中的第一行前面一行为 "####",例如:

[root@shell workspace]# sed '1i####' /etc/passwd####root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin.....

a:append,在指定或匹配到的行后面追加新行,为 string,a\string
为 /etc/passwd 的第一行后面 "aaa",例如:

[root@shell workspace]# sed '1a###' /etc/passwdroot:x:::root:/root:/bin/bash###bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin

d:delete,符合地址定界条件的的行

/etc/inittab 中注释行,例如:

sed '/^#/d' /etc/inittab

直接利用元字符匹配铆定以#开头的行进行操作,注意此处没有直接,如果 -i 选项,则直接对源进行,一般需要先备份,然后操作以免误操作原始。

s:s/pattern/string/修饰符: 查找并替换,认只替换每行中第一次被模式匹配到的字符串 ,如果修饰符为 g, 则为全部替换。
替换 /etc/passwd 中的 root 为大写,例如:

[root@shell workspace]# sed 's/root/ROOT/g' /etc/passwdROOT:x:::ROOT:/ROOT:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin...

替换 /etc/inittab 中 "id:3:initdefault:" 一行中的数字为 5,例如:

sed 's/id:[0-9]/id:5/g' /etc/inittab

在此利用元字符匹配 [0-9] 的数字进行替换为 id:5

p:print,认 sed 对模式空间内的处理完毕后,将的结果在标准, p 命令,相当于了原文,又一次了模式匹配处理后的。

打印 /etc/passwd 的第三行,指定行号,例如:

[root@shell workspace]# sed -n '3p' /etc/passwddaemon:x:::daemon:/sbin:/sbin/nologin

在此直接定界 3,然后 command 为 p 打印,由于不想 /etc/passwd 的全部,因此了 - n 选项。

5. 实例

目前服务器 Ubuntu 版本为 ubuntu ,现又 1000 台服务器需要去开启 root 远程。

开启 ubuntu 服务器的远程即其的 /etc/ssh/sshd_con 的 prohibit-password 为 yes 即可,重启 sshd 服务即可,利用脚本逻辑处理。

核心利用 sed :

if [ ${ostype} == 'Ubuntu' ];thensed -i 's/prohibit-password/yes/g' /etc/ssh/sshd_con# 重启ssh服务service sshd restart[ $? -eq ] && echo "${OSTYPE} sshd 开启成功" >>${LOG_FILE}
fi

6. 注意事项

sed 中利用于正则表达式配合可以得到 1+1 大于二的,配合使用更加丰富强大;

sed 常用于,如果为可以利用 grep,因为 grep 检索效率最高,如果为格式化建议使用 awk;

sed 在的时候尽可能先不要 -i options,以免将源始异常难以恢复。

7. 小结

sed 的非常强大,它是我们 shell 编程中对不可或缺的利器,配合正则表达式常用来批量大,或有一定格式规律的,其还有很多高级。如果学有余力建议去 man 手册详细学习查看,在利用 sed 工具的时候需要时刻脑海中牢记求语法格式,万变不离其宗,遵循语法举一反三能够达到学生事半功倍的。


联系我
置顶