sed练习

1、格式:
         sed ‘编辑命令’ 文件 1 文件 2...
2、常用选项:
         -e:  指定要执行的命令,只有一个编辑命令时可省略
         -n :不输出模式空间的内容到屏幕,不对原文件进行修改
         -i :直接编辑原文件,不输出结果

         -r :支持使用扩展正则表达式
3、编辑命令格式:
       /[地址 1[,地址 2]]/操作 [参数]

      \t :表示tab键(空格)

     \n:不换行

      [[:space:]]:表示空格

(1)地址:可为行数、正则表达式、$,没有地址代表全文
(2)操作:
     p 打印(输出)
    d 删除(整行)
    s 替换(字符串)
    c 替换(整行)
    r 读取指定文件(到行后)
    a append,追加指定内容到行后
     i insert,追加指定内容到行前
    w 另存为
   n 表示读入下一行内容
   H 复制到剪贴板
   g 将剪贴板中的内容覆盖到指定行
   G 将剪贴板中的内容追加到指定行后

=================================================================

实例1:

要求把/etc/passwd中sbin/nologin替换成1111/2222

[root@localhost ~]# sed 's#sbin/nologin#1111/2222#g' /etc/passwd

 

实例2:取出/etc/passwd中前三行的用户名及登录类型

[root@localhost ~]# nl /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# sed -nr '1,3 s/(.*)(:.*){5}:(.*)/\1\3/gp' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin

 

实例3:取出ifconfig中的ens33的Ip

[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.115 netmask 255.255.255.0 broadcast 192.168.200.255

[root@localhost ~]# ifconfig ens33 | sed -nr '2 s/(.*)t(.*)n(.*)/\2/gp'             //(.*)t指到t结束(.*)n指到n结束
192.168.200.115

 

实例4:取出 /etc/passwd中前5行最后一个数

[root@localhost ~]# sed -n '1,5 s/\(.*\)\(.\)/\2/gp' /etc/passwd
h
n
n
n
n

实例:删除/etc/rc.d/rc.local t文件中的以#开头,且后面跟了至少一个空白字符的行的#和空白字符

[root@localhost tmp]# sed -i 's/^#[[:space:]]//g' /etc/rc.d/rc.local          //[[:space:]]表示空格

[root@localhost ~]# cat /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

[root@localhost ~]# cat /etc/rc.d/rc.local
#!/bin/bash
THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
It is highly advisable to create own systemd services or udev rules
to run scripts during boot instead of using this file.
#
In contrast to previous versions due to parallel execution during boot
this script will NOT be run after all other services.
#
Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
that this script will be executed during boot.

touch /var/lock/subsys/local

 

 实例:将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#

第一种:[root@localhost ~]# sed -i -r "s/(^[[:space:]]+)/#\1/g" /tmp/rc.sysinit 

 

第二种:[root@centos6 15:08:14 ~]#cp /etc/rc.d/rc.sysinit /tmp
[root@centos6 15:16:08 ~]#sed -n '13,13p' /etc/rc.sysinit
. /etc/sysconfig/network
[root@centos6 15:16:25 ~]#sed 's/\(^[[:space:]]\)/#\1/g' /tmp/rc.sysinit | sed -n '13,13p'
# . /etc/sysconfig/network
————————————————
版权声明:本文为CSDN博主「子何」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010134758/article/details/80486741

 

 

实例:将/etc/yum.repos.d/CentOS-Media.repo(随便找一个)文件中所有的enabled=0或gpgcheck=0的最后的0修改为1

[root@localhost ~]# sed -i -e 's/enabled=0/enabled=1/' -e 's/gpgcheck=0/gpgcheck=1/' /etc/yum.repos.d/CentOS-Media.repo 

实例:显示/etc/passwd文件中位于第偶数行的用户的用户名。

[root@localhost ~]# awk -nr 'NR%2==0 {print}' /etc/passwd

实例:复制/boot/grub2/grub.cfg至/tmp/grub.cfg目录中,删除/tmp/grub.cfg文件中的行尾的空白字符。

 [root@localhost tmp]# sed -i 's/^[ \t]*//g' /tmp/grub.cfg

实例:复制/boot/grub2/grub.cfg至/tmp/grub.cfg目录中,删除/tmp/grub.cfg文件中的行首的空白字符。

 [root@localhost tmp]# sed -i 's/^ \t]*$//g' /tmp/grub.cfg

======================================================

实例5:

[root@localhost ~]# cat test.txt

fd
hdopkw
gsgksogmssegs
dgs$aag,s
gskrt5wsgskto46
door
010-525252
0792-5252626
ip 192.168.200.111
0444-5151515

SA5aag4aga
515151166

复制4和5行到第10行下

[root@localhost ~]# sed -i '4,5H;10G' test.txt

 

输出ip

[root@localhost ~]# sed -n '/[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}/p' test.txt [0-9]\{3\}表示0-9随机数字最多匹配3位数.要转义用\
ip 192.168.200.111 

 

输出电话号码

[root@localhost ~]# sed -n '/[0-9]\{4\}-[0-9]\{7\}/p' test.txt [0-9]\{4\}表示0-9随机数字表示最多匹配4位数
010-525252
0792-5252626
0444-5151515

 

输出以小字母开头的行

[root@localhost ~]# sed -n '/^[a-z]/p' test.txt ^[a-z]表示以[a-z]的随机字母开头 P表示打印输出 fd hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door ip 192.168.200.111

 

输出带$符的行

[root@localhost ~]# sed -n '/\$/p' test.txt 表示过滤有$的行数此处$此处$要转义用\ dgs$aag,s

 

输出3到5行的内容

[root@localhost ~]# sed -n '3,5p' test.txt gsgksogmssegs dgs$aag,s gskrt5wsgskto46
输出最后一行

[root@localhost ~]# sed -n '$p' test.txt
515151166
删除第一行

[root@localhost ~]# sed '1d' test.txt hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 ip 192.168.200.111 0444-5151515
SA5aag4aga
515151166
 
删除空行

[root@localhost ~]# sed '/^$/d' test.txt ^$表示空d表示删除 fd hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 ip 192.168.200.111 0444-5151515 SA5aag4aga 515151166

 

删除1行和3行

[root@localhost ~]# sed -e '1d;3d' test.txt hdopkw dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 ip 192.168.200.111 0444-5151515 SA5aag4aga
515151166
 
将ip替换成inet addr

[root@localhost ~]# sed 's/ip/inet addr/g' test.txt fd hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 inet addr 192.168.200.111 0444-5151515 SA5aag4aga 515151166
给以ip开头的行添加#号

[root@localhost ~]# sed '/^ip/s/^/#/' test.txt //两正斜杠表示过滤· fd hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 #ip 192.168.200.111 0444-5151515 SA5aag4aga 515151166
在每一行的末尾添加EOF

[root@localhost ~]# sed 's/$/EOF/' test.txt fdEOF hdopkwEOF gsgksogmssegsEOF dgs$aag,sEOF gskrt5wsgskto46EOF doorEOF 010-525252EOF 0792-5252626EOF ip 192.168.200.111EOF 0444-5151515EOF EOF SA5aag4agaEOF 515151166EOF
将第二行替换成AAAAAAA

[root@localhost ~]# sed '2cAAAAAAA' test.txt c表示替换 fd AAAAAAA gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 ip 192.168.200.111 0444-5151515 SA5aag4aga 515151166
在第二行前追加NNNNNNNNN

[root@localhost ~]# sed '2iNNNNNNNN' test.txt i表示插入 fd NNNNNNNN hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 ip 192.168.200.111 0444-5151515 SA5aag4aga 515151166
将2到5行另存到out.txt中 

[root@localhost ~]# sed '2,5w out.txt' test.txt w表示另存为 [root@localhost ~]# nl out.txt 1 hdopkw 2 gsgksogmssegs 3 dgs$aag,s 4 gskrt5wsgskto46
将带有ip的剪切到最后一行

[root@localhost ~]# sed '/ip/{H;d};$G' test.txt H表示复制d是删除G是粘贴 fd hdopkw gsgksogmssegs dgs$aag,s gskrt5wsgskto46 door 010-525252 0792-5252626 0444-5151515 SA5aag4aga 515151166 ip 192.168.200.111

 

posted @ 2019-09-03 17:02  Room、C  阅读(202)  评论(0编辑  收藏  举报