sed工作原理:sed从文件中读取出来一行,并不会直接进行编辑处理而是会放在自己的模式空间内进行处理,处理的结果将会送到标准输出,默认情况下sed可以对每行文本进行处理,也可以让sed处理符合条件的行,我们可以利用正则表达式做文本过滤,模式空间有两种输出结果,一种是可以匹配到的,会根据编辑要求进行处理,例如删除,过滤字符串。另外一种则是匹配失败的,会直接进行标准输出。
sed常用选项:
-n:不输出模式空间中的内容至屏幕;不会把模式空间内的信息输出出来。
-e:多点编辑;可以同时编辑多个匹配条件
-f:/PATH/SED_SCRIPT_FILE 每行一个编辑命令;读取文件内的筛选条件
-R:支持使用扩展表达式;使用苦战表达式
-i: 直接编辑源文件;操作比较危险,会直接更改原文件。
地址定界:
(1)空地址:对全文进行处理;
(2)单地址:
#:指定行;
[root@nzg7 ~]# sed -n '2p' /etc/passwd
/pattern/;被此模式匹配到的每一行;
[root@nzg7 ~]# sed -n '/^root/p' /etc/passwd
(3)地址范围:
#,#:
[root@nzg7 ~]# sed -n '1,2p' /etc/passwd
#,+#:向后+#行
[root@nzg7 ~]# sed -n '1,+2p' /etc/passwd
#,/pat1/:
[root@nzg7 ~]# sed -n '1,/^nologin/p' /etc/passwd
/pat1/,/pat2/
[root@nzg7 ~]# sed -n '/^root/,/^nologin/p' /etc/passwd
(4)步进:~
1~2:所有奇数行
[root@nzg7 nzg]# sed -n '1~2p' f1
2~2:所有偶数行
[root@nzg7 nzg]# sed -n '2~2p' f1
编辑命令:
d:删除;
[root@nzg7 nzg]# sed '2~2d' f1 删除偶数行
p: 显示模式空间中的内容;
[root@nzg7 nzg]# sed -n '2~2p' f1 显示匹配结果
a \text:在行后面追加文本"text",支持使用\n实现多行追加;
[root@nzg7 nzg]# sed '100a \luyubo' f1
[root@nzg7 nzg]# sed '100a \luyubo\nnaozhongge' f1
i \text;在行前面插入文本"text",支持使用\n实现多行插入; 加.可以实现备份
[root@nzg7 nzg]# sed '100i \luyubo' f1
[root@nzg7 nzg]# sed '100i \luyubo\nnaozhongge' f1
c \text:把匹配等到的行替换为此处指定的文本“text”;
[root@nzg7 nzg]# sed '100c \luyubo' f1
[root@nzg7 nzg]# sed '100c \luyubo\nnaozhongge' f1
W /PTAH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
[root@nzg7 nzg]# sed -n '/^[^#]/w /home/nzgqq' /etc/fstab
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;
[root@nzg7 nzg]# sed -n '/^[^#]/r /home/nzgqq' /etc/fstab
= 为模式匹配到的行打印行号;
[root@nzg7 nzg]# sed '/^[^#]/=' /etc/fstab
!条件取反;
地址定界!编辑命令;
[root@nzg7 nzg]# sed -n '/^[^#]/!p' /etc/fstab
s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;
例如:删除/etc/grub2.conf文件中所有以空白开头的行行首的 空白字符
[root@nzg7 nzg]# sed -n 's@^[[:space:]]\+@@p' /etc/grub2.cfg
替换标记:
g:全局替换;
[root@nzg7 nzg]# sed -n 's@[[:digit:]]@q@pg' f1
w:/PATH/TO/SOMEFILE; 将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
[root@nzg7 nzg]# sed -n 's@[[:digit:]]@q@pgw /home/f22' f1
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n: 覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
高级编辑命令示例:
sed -n 'n;p' FILE 显示偶数
sed '1!G;h;$!d' FILE 倒序显示
sed '$!N;$!D' FILE 显示最后两行
sed '$!d' FILE 显示最后1行
sed 'G' FILE 每行后面插入空格
sed 'g' FILE 全部替换空格
sed '/^$/d;G' FILE 每行后面插入空格
sed 'n;d' FILE 显示奇数
sed -n '1!G;h;$p' FILE 倒序显示
练习题案例:
1.删除/etc/grub2.conf文件中所有以空白开头的行行首的 空白字符
[root@nzg7 nzg]# sed 's@^[[:space:]]\+@@p' /etc/grub2.cfg
2.删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@nzg7 nzg]# sed 's@^#[[:space:]]\+@@p' /etc/fstab
3.在/root/install.log每一行行首增加#号
[root@nzg7 ~]# sed 's@^@#@' install.log
4.、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@nzg7 ~]# sed -r 's@.*@#&@' install.log
[root@nzg7 ~]# sed 's@^@#@' install.log
5.处理/etc/fstab路径,使用sed命令取出其目录名和基名
[root@nzg7 ~]# echo "/etc/fstab" | sed -r 's@^(/.*/)([^/]+/?)@\1@'
[root@nzg7 ~]# echo "/etc/fstab" | sed -r 's@^(/.*/)([^/]+/?)@\2@'
6.利用sed 取出ifconfig命令中本机的IPv4地址
[root@nzg7 ~]# ifconfig | sed -n '/\<inet\>/p' | sed -r 's@inet (([0-9]+\.){3}[0-9]+).*@\1@'
[root@nzg7 ~]# ifconfig | sed -n '/\<inet\>/p' |sed -r 's@inet @@'| sed -r 's@netmask.*@@'
7.统计centos安装光盘中Package目录下的所有rpm文件的 以.分隔倒数第二个字段的重复次数
[root@localhost Packages]# ll *.rpm |sed -r 's@.*\.([^.]+)\.rpm$@\1@' |sort |uniq -c
原创文章,作者:闹钟哥,如若转载,请注明出处:http://www.178linux.com/32459