sed [opeion] inputfil…
sed行编辑器,可以编辑可以查找,逐行处理pattern space 模式空间,内置print操作,逐行处理时打印该命令,可编译一个或多个文件。
常用选项:
-n 不输出模式空间内容到屏幕
-e 多点编辑
-f /path 从指定文件读取脚本
-r 使用扩展正则表达式
-i.bak 备份文件并编辑
script:‘地址命令’
sed ‘’ passwd sed 默认执行打印当前操作
如: sed passwd 会直接报错没有执行script是不被允许的
script:
(1)不给地址: 对全文进行处理
(2) 单地址:
#: 指定的行,$:最后一行
sed -n $p /etc/passwd
sed -n 5$p /etc/passwd
(3)地址范围:
#,#
sed -n 3,6/p /etc/passwd
#,+#
sed -n 3,+3p /etc/passwd
/path1/, /path2/
sed -n ‘/s/,/f/p’ /etc/passwd
#, /path1/
sed -n ‘3,/^f/p’ /etc/passwd
(4)~ : 步长
1~2 奇数行
2~2 偶数行
sed匹配时是贪婪模式,匹配到的不一定就是s开头到f到头的数据 ,因为sed是逐行处理
常用编辑命令
d 删除匹配的行
p 打印
a[]text 后面追加
i[]text 前面追加
c[]text 替换单行或多行文本
w /path 保存匹配的行到指定文件
r /path 读取文本文件的内容到匹配到行后
= 为匹配结果打印行号
!匹配结果取反
查找和替换
s/// s### s@@@
替换标记
g 全局替换
p 打印
w /path 替换后的行保存到指定文件
使用示例:
注: 下面例子用都是实验用,有些修改配置文件的操作没有真正发送修改,修改需加上 -i 参数在sed 命令后
sed查找本地ip地址
[centos7@localhost ~]# ifconfig | sed -n '2p'|sed 's/^.*[a-z]\{1,\}//'
192.168.146.129
[centos7@localhost ~]# ifconfig ens33 | sed -n '2s/^.*inet //;s@ netmask.*$@@p '
192.168.146.129
[centos7@localhost ~][centos7@localhost ~][centos7@localhost ~]# ifconfig | sed -n '2s/^.*[a-z]\{1,\}//p'
192.168.146.129
[centos7@localhost ~]# ifconfig ens33 |sed -n '2p'| sed -e 's/^.*inet //' -e 's@ netmask.*$@@'
192.168.146.129
[root@centos7 testdir]# ifconfig | sed -n '2p' |sed -rn 's/(^[^0-9]+)([0-9.]+)( .*$)/\2/p'
192.168.146.129
[root@centos7 testdir]# ifconfig | sed -rn '2s/(^[^0-9]+)([0-9.]+)( .*$)/\2/p'
192.168.146.129
[root@centos7 testdir]# ifconfig | sed -rn '2s/^[^0-9]+([0-9.]+) .*$/\1/p'
192.168.146.129
查找apche配置文件中所有注释的行,并输出至/data/http.conf文件中
[centos7@localhost ~]# sed -n '/^#/p' /etc/httpd/conf/httpd.conf > /data/http.conf
取出<ViretualHost></ViretualHost>段落间的#
[root@CentOS6 ~]# sed -n '/#<VirtualHost/,/#<\/VirtualHost/s@#@@p' /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /www/docs/dummy-host.example.com
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
#取出/etc/sysconfig/network-scriopts的文件名
[root@CentOS6 ~]# echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@\1@'
/etc/sysconfig/
取出/etc/sysconfig/network-scripts的基名
[root@CentOS6 ~]# echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@\2@'
network-scripts
在段落 linux16 开头的行后追加net.ifnames=0参数
[root@centos7 tmp]# sed -rn '/[[:space:]]+linux16/s#.*#& net.ifnames=0#p' grub.cfg
linux16 /vmlinuz-3.10.0-957.27.2.el7.x86_64 root=UUID=4e5fa6b8-db8c-4422-a29f-d168f4a6da16 ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 net.ifnames=0
linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=UUID=4e5fa6b8-db8c-4422-a29f-d168f4a6da16 ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8 net.ifnames=0
linux16 /vmlinuz-0-rescue-ca693e843c684f2e9b7ac4a69c5c4702 root=UUID=4e5fa6b8-db8c-4422-a29f-d168f4a6da16 ro crashkernel=auto rhgb quiet net.ifnames=0
## & 前面匹配到的结果
在GRUB_CMDLINE_LINUX="crashkernel=auto rhgb" "前插入指定文本net.ifnames=0
错误示范
[root@centos7 tmp]# sed -rn '/^GRUB_CMDLINE/s#.*#& net.ifnames=0#p' /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet" net.ifnames=0
正确配置一
[root@centos7 tmp]# sed -r '/^GRUB_CMDLINE/s#"$# net.ifname"#' /etc/default/grub
配置二
[root@centos7 data]# sed -rn '/^GRUB_CMDLINE/s#"$# net.ifname=0"#p' grub
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifname=0"
[centos7 data]# sed -rn ‘/^GRUB_CMDLINE/s#"$# net.ifname=0"#p’ grub
GRUB_CMDLINE_LINUX=“crashkernel=auto rhgb quiet net.ifname=0”