sed工具详解
NAME:
sed – stream editor for filtering and transforming text(实现文本替换和过滤功能)
类型: 行编辑器(流)
特点: 把文件中的每一行加载到内存中,匹配模式,把能够匹配到模式的内容输出到屏幕,不修改原文件
工作模式:
每一次读取一行文本,复制到模式空间(sed工作区间 pattern space ),先输出到屏幕,判断文本能否被模式匹配到,被匹配到的行执行编辑操作,编辑的结果标准输出; 没有被模式匹配到的行,直接标准输出,可以被隐藏;
保持空间:被匹配的行保存到保持空间 实现与模式空间进行操作
格式:
sed [OPTION]… ’script‘ [input-file]…
一次处理多行文本
常用选项 OPTION:
-n:不输出模式空间中的内容到屏幕
-e script,–expression=script:多点编辑; 一条命令中,可执行两条匹配规则,-e连接 例:sed -e ‘1~2p’ -e "3d" /etc/fstad
-f PATH/TO/SED_SCRIPT_FILE 执行命令脚本 每行一个编辑命令
-r:支持使用扩展正则表达式
-i[SUFFIX]:直接编辑原文件 建议使用: i.bak sed 自动备份文件
地址定界命令:
(1)空地址:对全文进行处理
(2)单地址:
#指定行
/patten/:被此模式匹配到的每一行
(3)地址范围
#,#:起始行到结束行
#,+#: 3,+8 从3.加8行,包含第3 行
#,/pat1/: 从第几行到模式1匹配的行
/pat1./pat2/ 模式1到模式2之间的行
$:最后一行
(4)步进:~
1~2:所有奇数行
2~2:所有偶数
(5)& 单词追加
追加的内容前加&,以为着前面的内容保留
追加的内容后加&,以为着后面的内容保留
编辑命令:
d:删除 例:sed ‘1~2d’ /etc/passwd
p:打印模式空间内容 指定行会显示两遍 命令加上-n使用
a \text: 在被匹配到的行后面追加文本“text”,支持使用\n实现多行追加
i \text: 在被匹配到的行前面插入文本“text”,支持使用\n实现多行插入
c \text:把匹配到的行替换为此处指定的文本“text”;
w /pATH/TO/SOMEFILE:保存模式空间内的行至指定的文件中
r/PATH/FROM/SOMFILE:文件合并,读取指定文件的内容至当前文件被模式匹配到的行后面
=:为模式匹配到的行打印行号
!:条件取反
模式后面,命令前面
s///:查找替换,其分隔符可自行指定,,常用@@@,###
s前面加执行范围,%表示全部 ,可写数字圈定范围
替换标记
g:全局替换
w /PATH/TO/SOMMEFILE:将替换成功的行保存至指定文件中
p:显示替换成功的行
练习:
删除 /boot/grub/grub2.conf文件中所有以空白字符开头的行的行首的所有空白字符
[root@wen-7 ~]# sed 's@^[[:space:]]\+@@ ' /boot/grub2/grub.cf
删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符
[root@wen-7 ~]# sed 's@^#[[:space:]]*@@' /etc/fstab
输出一个绝对路径给sed,去除其目录,其行为类似于dirname;
[root@wen-7 tmp]# echo "/etc/passwd" | sed 's@^.*\<@@' passwd
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:把保持空间中的内容覆盖至模式空间中
G:把保持空间中的内容追加至模式空间中
x:把模式空间与保持空间中的内容互换
n:覆盖读取匹配到的行的下一行至模式空间中;原行被覆盖
N:追加读取匹配到的行的下一行至模式空间中,原文后追加
d:删除模式空间中的行
D:删除多行模式空间中的所有行;
实例:
sed -n ‘n;p’ FILE:显示偶数行 (第一行匹配,第二行把第一行覆盖输出,(第三行匹配,第四行把第三行覆盖输出)
sed '1!G;h;$!d' FILE:逆序显示文件的内容 ()
sed -n '1!G;h;$p' FILE :逆序显示文件
sed ‘$!d’ FILE:取出文件的最后一行
sed ‘$!N;$!D’ FILE:取出文件最后两行
sed ‘/^$/d;G' FILE :删除原有的空白行,在所有非空白行后添加一个空白行
sed ‘n;d’ FILE :显示奇数行
练习:
1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
[root@wen-7 base]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then source $prefix/custom.cfg; fi ### END /etc/grub.d/41_custom ###
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@wen-7 base]# sed 's@^#[[:space:]]*@@g' /etc/fstab /etc/fstab Created by anaconda on Tue Jul 19 18:59:02 2016 Accessible filesystems, by reference, are maintained under '/dev/disk'
3、在/root/install.log每一行行首增加#号
A .[root@wen-7 base]# sed -n 's@^@#@gp' /root/.bash_logout ## ~/.bash_logout # B. [root@wen-7 ~]# sed 's@^@&#@' /root/install.log
4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@wen-7 base]# sed -n 's@^[^#]@&#@gp' /etc/fstab #dev/mapper/centos-root / xfs defaults 0 0 #UID=d9988fae-8ee0-434e-9caa-bd3bd20324a3 /boot xfs defaults 0 0 #dev/mapper/centos-swap swap swap defaults 0 0
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
目录名:
A root@wen-7 base]# echo "/etc/fstab" | sed 's@[^/]\+$@@g' B [root@wen-7 ~]# echo "/etc/issue"| sed 's@[^/]\+$@@' C echo "/etc/issue"| sed -r 's@(.*/)([^/]+/)$@ /1@' D [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'
基名:
A [root@wen-7 ~]# echo "/etc/issue"|sed 's@^.*\<@@' B [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\2@ C [root@wen-7 ~]# echo "/etc/issue"| sed -r 's@(.*/)([^/]+/?)$@\1@'
6、利用sed 取出ifconfig命令中本机的IPv4地址
centos6.8: [root@wen-6 ~]# ifconfig|sed -n 2p |sed -r 's/.*addr:(.*) Bca.*/\1/' 172.18.19.210 centos7.2: [root@wen-7 tmp]# ifconfig|sed -n 2p |sed -r 's/.*inet(.*) netmask.*/\1/' 172.18.19.219
7、统计centos安装光盘中Package目录下的所有rpm文件 以.分隔倒数第二个字段的重复次数
A [root@wen-7 ~]# ls /mnt/base/*.rpm | sed -r 's@.*\.([^.]+)\.rpm$@\1@'|sort| uniq -c 1524 i686 1416 noarch 3578 x86_64 B ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c
原创文章,作者:wencx,如若转载,请注明出处:http://www.178linux.com/32107