文本三剑客之sed

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”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>