sed命令详解

一、基本介绍

sed:非交互式编辑器,一次处理一行内容

语法:sed   参数  "[定位 指令]"   文件

参数:
-e   允许多项便捷
-r   扩展正则
-n   取消默认输出(阻止输入行输出)
-i   写入文件,改变了输出流向,修改了源文件
-i.bak修改文件时会创建文件,防止错误修改
-a    指定行后添加内容
-f    指定sed脚本名称
指令:
-p 打印到屏幕
-d 删除
-I 忽略大小写
! 取反
s/// 替换
-e 识别多条指令
-c 将整行内容清楚后替换为c后面指定的内容

 !!!指令可以用;号连接

二、查找打印

文件内容如下

     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
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    20  zx:x:1000:1000:zx:/home/zx:/bin/bash
    21  nginx:x:1002:1002::/home/nginx:/sbin/nologin
    22  tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    23  saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    24  ntp:x:38:38::/etc/ntp:/sbin/nologin
    25  mysql:x:1003:1003::/home/mysql:/sbin/nologin

1.根据内容查找

   sed -n "/root/p" passwd
   1  root:x:0:0:root:/root:/bin/bash
  10  operator:x:11:0:operator:/root:/sbin/nologin

2.根据行号筛选信息

(1)查找第7行

     sed  -n  "7p" passwd   #-n阻止输入行输出
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

(2)查找3到9行

     sed -n "3,9p" passwd
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

(3)查找第5行和第十行

   sed -n "5p;10p" passwd
   5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
   10  operator:x:11:0:operator:/root:/sbin/nologin

(4)查找所有奇数行

[root@slave opt]# sed -n "1~2p" passwd  #从第一行开始每隔两行删除一行
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    11  games:x:12:100:games:/usr/games:/sbin/nologin
    13  nobody:x:99:99:Nobody:/:/sbin/nologin
    15  dbus:x:81:81:System message bus:/:/sbin/nologin
    17  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    19  chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    21  nginx:x:1002:1002::/home/nginx:/sbin/nologin
    23  saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    25  mysql:x:1003:1003::/home/mysql:/sbin/nologin

(5)查找所有偶数行

[root@slave opt]# sed -n "0~2p" passwd
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt
    10  operator:x:11:0:operator:/root:/sbin/nologin
    12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    14  systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    20  zx:x:1000:1000:zx:/home/zx:/bin/bash
    22  tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    24  ntp:x:38:38::/etc/ntp:/sbin/nologin

三、正则表达

sed和grep一样,在文件中查找模式时也可以使用正则表达式(RE)和各种元字符,正则表达式是

括在斜杠(/xxx/)的模式,用于查找和替换。

基本元字符集

^    $     .    *     [ ]    [^]     \< \>     \(\)      \{\}

扩展元字符集

?  +    {  }    |    ()

使用扩展元字符集的方式:

1.转义 如\+等

2. sed -r 

1.从第五行开始,往后打印5行,包括第5行
[root@slave opt]# sed  -n "5,+5p" passwd

2.打印passwd中开头为root,到开头为sync的行
[root@slave opt]# sed -n '/^root/,/sync/p' /etc/passwd

3.打印passwd中第8行开始,到含有/sbin/nologin的内容的行结束
[root@slave opt]# sed -n "8,/sbin\/nologin/p" passwd

4.查找以root开头的行
[root@slave opt]# sed  -n /^root/p /etc/passwd

5.查找以bash结尾的行
[root@slave opt]# sed  -n /bash$/p /etc/passwd

6.查找从第一行到首次匹配到/sync/的行
[root@slave opt]# sed -n  "1,/^sync/p" passwd

四、删除

命令 含义
1d 删除第一行的内容
1,5d 删除第一行到第5行的内容
1,+5d 删除第一行以及往下5行的内容
1d,10d 删除第一行和第十行的内容
1,$d 删除第一行到最后一行
/root/d 删除匹配到root的行
/root/ /sync/d 删除root和sync中间的所有行
/root/,10d 删除匹配到root的行到第十行的所有内容
10,/root/d 删除第十行直到匹配到root的所有内容

练习:

1.删除第2行的所有内容
[root@slave opt]# sed "2d" passwd

2.删除第1行到第5行的所有内容
[root@slave opt]# sed "1,5d" passwd

3.删除第2行以及往下6行的内容
[root@slave opt]# sed "2,+6d" passwd

4.删除第一行和第十行的内容
[root@slave opt]# sed "1d;10d" passwd

5.删除匹配到root的所有行
[root@slave opt]# sed "/root/d" passwd

6.删除匹配到sync的行到第10行的所有内容
[root@slave opt]# sed "/sync/,10d" passwd

7.删除匹配到以root开头和以sync开头的行的所有内容
[root@slave opt]# sed  "/^root/,/^sync/d"  /etc/passwd

删除注释和空白行

sed   -r    "/^#.*/d";/^$/d     文件 

 注: 当前的所有操作,只是在模式空间修改,如果真正修改文件, 只需要加 -i 参数

          删除时-i和-n不能同时出现

五、增加编辑命令

命令 含义
a 在行后追加内容
i 在行前追加内容
r 读入外部文件,行后追加
w 将匹配的行写入外部文件

源文件内容

111
222
333
444
555

1.在指定行后面添加信息

#在第一行后面添加
[root@slave ~]# sed "1ahello" a.txt
111
hello
222
333
444
555
#在第一行和第二行后面添加
[root@slave ~]# sed "1,2ahello" a.txt
111
hello
222
hello
333
444
555
#在最后一行添加
[root@slave ~]# sed '$a hello' a.txt #单引号
111
222
333
444
555
hello
#添加多行内容
[root@slave ~]# sed "1ahello\nworld" a.txt
111
hello
world
222
333
444
555
[root@slave ~]# sed -e "1ahello" -e "1aword" a.txt
111
hello
word
222
333
444
555

2.在指定行前插入信息

#
[root@slave ~]# sed "2ihello" a.txt
111
hello
222
333
444
555
[root@slave ~]# sed "1,2ihello" a.txt
hello
111
hello
222
333
444
555
[root@slave ~]# sed "1ihello\nworld" a.txt
hello
world
111
222
333
444
555
[root@slave ~]# sed -e "1ihello" -e "1iword" a.txt
hello
word
111
222
333
444
555

3.将/etc/hosts追加到a.txt文件的第2行后面

[root@slave ~]# sed '2r /etc/hosts' a.txt
111
222
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.36.192.66 master1
333
444
555

将/etc/inittab文件内容追加到/etc/passwd文件匹配/bin/sync行的后面
[root@slave ~]#sed '/\/bin\/rsync/r /etc/inittab' /etc/passwd

!!!再次查看a.txtf发现文件并没有被修改(此处的修改只发生在内存的模式空间中,-i覆盖源文件)

[root@slave ~]# cat a.txt
111
222
333
444
555
[root@slave ~]# sed -i "2d" a.txt
[root@slave ~]# sed -i  "1ahello" a.txt
[root@slave ~]# cat a.txt
111
hello
333
444
555

 为防止误操作,可以再修改文件前先备份-i.back,就会在目录里产生一个备份文件

[root@slave ~]# sed -i.back "1d" a.txt
[root@slave ~]# ll
总用量 68072
-rw-r--r--   1 root root       485 10月 10 11:51 aliyun.sh
-rw-------.  1 root root      1711 9月  14 11:43 anaconda-ks.cfg
-rw-r--r--   1 root root      4671 10月 16 10:42 a.sh
-rw-r--r--   1 root root        18 10月 17 09:18 a.txt
-rw-r--r--   1 root root        22 10月 17 09:15 a.txt.back

六、修改文件信息

命令 含义
1s/old/new/ 替换第1行内容old为new
1,10s/old/new/ 替换1行到10行的内容old为new
1,+5s/old/new/ 替换1行到6行的内容old为new

文件内容

[root@slave ~]# cat a.txt
111  222 111 aaa
111 aaa
333  222
444  111 111
555  222

1.将每行第一个111替换成AAA

[root@slave ~]# sed "s/111/AAA/" a.txt
AAA  222 111 aaa
AAA aaa
333  222
444  AAA 111
555  222

2.替换所有行的111位AAA

[root@slave ~]# sed "s/111/AAA/g" a.txt
AAA  222 AAA aaa
AAA aaa
333  222
444  AAA AAA
555  222

3.替换第四行所有的111为AAA

[root@slave ~]# sed "4s/111/AAA/g" a.txt
111  222 111 aaa
111 aaa
333  222
444  AAA AAA
555  222

4.替换1到4行所有的111为AAA

[root@slave ~]# sed "1,4s/111/AAA/g" a.txt
AAA  222 AAA aaa
AAA aaa
333  222
444  AAA AAA
555  222

5.替换第一行的111为AAA,第5行的222为BBB

[root@slave ~]# sed "1s/111/AAA/g;5s/222/BBB/" a.txt
AAA  222 AAA aaa
111 aaa
333  222
444  111 111
555  BBB

你可能感兴趣的:(linux,运维,服务器)