文本三剑客之sed
sed介绍
sed 简介
sed 流编辑器。sed的全称:Stream EDitor 简称sed 是个流编辑器,sed是一个行编辑器、首先它是个流编辑器是实现文本流编辑的,所谓行编辑器主要指的是它在实现文本编辑时是逐行进行处理的所以称为sed。对于sed命令而言,这是著名的,在linux中称为文本处理三剑客之一的sed,grep 是实现文本过滤的、而sed是实现文本编辑的,awk是文本报告生成器。
sed 工作模式
例如说有个文件,里面有n多行 对sed的而言它是每一次从这文件中按条件按范围读取一行,它里头是有地址定界,不管怎么讲它要么有地址定界,要么没有地址定界,如果没给出地址定界方式,表示读取全文中的每一行,那就从每一行开始说明,比较容易理解,所以对sed来讲,它是一次从文件中读取出来一行,不会编辑源文件、而是读取出来之后放在sed自己所用到的内存缓冲区当中,它默认不做就地编辑,不做原地编辑,也就是说它不去编辑源文件,而是一次从源文件中读一行出来放到sed自己内部的编辑内存缓冲空间当中,这个内部的缓冲空间称作为sed的模式空间 叫作pattem space ,依次从模式空间读一行到这个空间里来,在这个空间中完成编辑,编辑完以后该如何呢,它会将模式空间中的内容干什么,问你编辑不编辑,如果说它读到一行,刚才说过我们这里的脚本可以基于正则表达式来做查找替换等操作,如果我们这一行没有查找到、没有匹配到内容显然是不会替换的,如果没有被编辑或者被编辑了这个结果,模式空间中应该还有内容,如果不走删除的话、那模式空间中的内容无论是否被编辑了,最终的处理结果还要显示到屏幕上来要给一个输出流,这大体是它的默认工作方式
sed用法
对sed而言,它主要是一个文本编辑器,因此sed的使用格式可以是用man sed 查看它的格式和用法
[root@jenkins-server ~]# man sedSED(1) User Commands SED(1)NAME sed - stream editor for filtering and transforming textSYNOPSIS sed [OPTION]... {script-only-if-no-other-script} [input-file]... ......
常用选项
-n:不输出模式中的内容至屏幕
-e: 多点编辑功能
-f: 从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i:原处编辑,修改源文件
地址定界
1、对sed而言可以不给地址: 这种表示对每一行都做处理,也就是对全文进行处理。而且每一行都符合条件、这叫零地址或者叫zero or address2、单地址: 不是使用逗号隔开的一个范围的这种叫作单地址 例如 #:精确第几行,也就是指定的行 /pattern/:表示被此模式所能够匹配到的每一行3、地址范围 #,# 从第几行开始到第几行结束 #,+# 从第几行开始往下走几行 /pat1/,/pat2/ 从哪一行开始甚至到哪一行结束 同时/pat1/2和地址定界表示法当中的精确第几行也可以联合起来使用 #,/pat1/4、~:步进 1~2 奇数行 2~2 偶数行步进示例:[root@jenkins-server ~]# sed -n '1~2p' a.txt 135[root@jenkins-server ~]# sed -n '2~2p' a.txt 246
常用的编辑命令
d: 删除p: 显示模式空间中的内容 a \\text 在行后面追加文本,支持使用\n实现多行追加i \\text 在行前面插入文本,支持使用\n实现多行插入c \\text 替换行为单行或多行文本w /path/to/somefile:保存模式空间匹配到的行至指定文件中r /path/to/somefile:读取指定文件的文本流至模式空间匹配到的行的行后= :为模式空间中的行打印行号!:取反条件s///:支持使用其它分隔符, s@@@, s###,同时这里在实现所谓的查找替换时也一样支持sed修饰符我们称为替换标记: g:行内全局替换 p:显示替换成功的行 w:/path/to/somefile:将替换成功的结果保存至指定文件中
常用的编辑命令示例
d选项命令例子[root@jenkins-server ~]# sed '1,8d' /etc/fstab UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0[root@jenkins-server ~]# sed '/^UUID/d' /etc/fstab ## /etc/fstab# Created by anaconda on Tue Apr 21 11:11:45 2020## 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#p选项命令例子[root@jenkins-server ~]# sed '/^UUID/p' /etc/fstab # /etc/fstab# Created by anaconda on Tue Apr 21 11:11:45 2020## 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## 由于默认就会显示模式空间的内容,然后又加了p选项把符合的内容再次打印一遍,所以看到的结果每行有两行UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0#如果不想打印其他内容的话 需要加上-n不打印模式空间中的内容,只打印匹配到的内容[root@jenkins-server ~]# sed -n '/^UUID/p' /etc/fstab UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0[root@jenkins-server ~]# sed '/^UUID/d' /etc/fstab ## /etc/fstab# Created by anaconda on Tue Apr 21 11:11:45 2020## 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#a选项命令例子[root@jenkins-server ~]# sed '/^UUID/a \# hello sed.' /etc/fstab UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0# hello sed.UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0# hello sed.UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0# hello sed.[root@jenkins-server ~]# sed '/^UUID/a \# hello sed.\nwww.dklwj.com' /etc/fstab UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0# hello sed.www.dklwj.comUUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0# hello sed.www.dklwj.comUUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0# hello sed.www.dklwj.comi选项命令例子[root@jenkins-server ~]# sed '/^UUID/i \# hello sed.\nwww.dklwj.com' /etc/fstab # hello sed.www.dklwj.comUUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0# hello sed.www.dklwj.comUUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0# hello sed.www.dklwj.comUUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0c选项命令例子[root@jenkins-server ~]# sed '/^UUID/c \# hello sed.\nwww.dklwj.com' /etc/fstab# /etc/fstab# Created by anaconda on Tue Apr 21 11:11:45 2020# 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# hello sed.www.dklwj.com# hello sed.www.dklwj.com# hello sed.www.dklwj.com w选项命令例子[root@jenkins-server ~]# sed -n '/^UUID/w /tmp/fstab.txt' /etc/fstab [root@jenkins-server ~]# cat /tmp/fstab.txt UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0r选项命令例子[root@jenkins-server ~]# sed '6r /etc/issue' /etc/fstab # 在第6行后面读取/etc/issue中的内容并显示## /etc/fstab# Created by anaconda on Tue Apr 21 11:11:45 2020## Accessible filesystems, by reference, are maintained under '/dev/disk'\SKernel \r on an \m# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0=选项命令例子[root@jenkins-server ~]# sed '/^UUID/=' /etc/fstab #9UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 010UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 011UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0!选项命令例子这里的意思除了以UUID开头的行以外的行都被删除,它是被地址定界取反的[root@jenkins-server ~]# sed '/^UUID/!d' /etc/fstab UUID=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0UUID=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0UUID=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0s选项命令例子[root@jenkins-server ~]# sed -n 's/^UUID/uuid/gp' /etc/fstab uuid=6cb4e3c4-11be-449c-928a-12ef089ebe60 / xfs defaults 0 0uuid=5e3a67b5-271a-4ace-9990-6160d74f5496 /boot xfs defaults 0 0uuid=dc602b5d-5dae-4083-b395-d10ab94fa826 swap swap defaults 0 0# 如何引用原来字符串需要加上&符号即可[root@jenkins-server ~]# sed -n 's#r..t#&er#gp' /etc/passwdrooter:x:0:0:rooter:/rooter:/bin/bashoperator:x:11:0:operator:/rooter:/sbin/nologinftp:x:14:50:FTP User:/var/fterp:/sbin/nologin# 替换后的结果保存到/tmp/目录中去[root@jenkins-server ~]# sed -n 's#r..t#&er#pw /tmp/pass.txt' /etc/passwdrooter:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/rooter:/sbin/nologinftp:x:14:50:FTP User:/var/fterp:/sbin/nologin[root@jenkins-server ~]# cat /tmp/pass.txt rooter:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/rooter:/sbin/nologinftp:x:14:50:FTP User:/var/fterp:/sbin/nologin
高级命令
高级命令选项
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除多行模式空间中的所有行
高级命令选项示例
创建一个测试文件[root@jenkins-server ~]# vim a.txt123456显示偶数行[root@jenkins-server ~]# sed -n 'n;p' a.txt 246逆向显示文件内容[root@jenkins-server ~]# sed '1!G;h;$!d' a.txt 654321取出文件中最后两行[root@jenkins-server ~]# sed '$!N;$!D' a.txt 56取出文件中最后一行[root@jenkins-server ~]# sed '$!d' a.txt 6在每一行后面加一行空白行[root@jenkins-server ~]# sed 'G' a.txt 123456合并多个空白行为一个空白行[root@jenkins-server ~]# sed '/^$/d;G' a.txt 123456显示奇数行[root@jenkins-server ~]# sed 'n;d' a.txt 135逆向显示文件中的每一行[root@jenkins-server ~]# sed -n '1!G;h;$p' a.txt 654321