三剑客(sed)篇

211 阅读5分钟

sed

参数说明
-n取消默认sed输出,常于sed内置命令p一起使用
-i将修改结果写入文件
-e多次编辑,多个条件,多个匹配
-r支持正则扩展
内置命令
内置命令字符说明
aAppend, 对文本追加,在指定行后面添加一行或多行文本
d删除匹配行
i插入文本,在指定行前添加一行或多行文本
p打印匹配内容,常与p和-n一起使用
s/正则/替换内容/g匹配正则内容,然后替换内容,结尾g表示全局匹配
匹配范围
范围说明
空地址全文处理
单地址指定文件某一行
/pattern/被模式匹配到的每一行
范围区间5,10 五到10行,8,+9 第8行向后9行
步长12, 表示1,3,5,7,9 22 两个步长,表示2,4,6,8,10行

输出文件第2行到第5行的内容
[root@localhost ~]# sed -n '2,5p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
匹配包含root的行
[root@localhost ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
删除含有nologin的行

不会修改源文件,只会修改内存中的数据

[root@localhost ~]# sed '/nologin/d' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
www:x:1000:1000::/home/www:/bin/bash
删除第7行到末尾的内容
[root@localhost ~]# cat -n /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
     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  www:x:1000:1000::/home/www:/bin/bash
    21  saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
    22  nginx:x:996:995:Nginx web server:/var/lib/nginx:/sbin/nologin
    
[root@localhost ~]# sed '7,$d' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
替换文本
[root@localhost ~]# sed 's/hello/goupi/g' a.txt 
goupi world
helllllloworld
192.168.183.15

[root@localhost ~]# sed 's#hello#goupi#g' a.txt 
goupi world
helllllloworld
192.168.183.15

[root@localhost ~]# sed 's@hello@goupi@g' a.txt 
goupi world
helllllloworld
192.168.183.15
[root@localhost ~]# sed 's/\/sbin\/nologin/不可登录/g' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:不可登录
daemon:x:2:2:daemon:/sbin:不可登录
adm:x:3:4:adm:/var/adm:不可登录
lp:x:4:7:lp:/var/spool/lpd:不可登录
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:不可登录
operator:x:11:0:operator:/root:不可登录
games:x:12:100:games:/usr/games:不可登录
ftp:x:14:50:FTP User:/var/ftp:不可登录
nobody:x:99:99:Nobody:/:不可登录
systemd-network:x:192:192:systemd Network Management:/:不可登录
dbus:x:81:81:System message bus:/:不可登录
polkitd:x:999:998:User for polkitd:/:不可登录
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:不可登录
postfix:x:89:89::/var/spool/postfix:不可登录
chrony:x:998:996::/var/lib/chrony:不可登录
www:x:1000:1000::/home/www:/bin/bash
saslauth:x:997:76:Saslauthd user:/run/saslauthd:不可登录
nginx:x:996:995:Nginx web server:/var/lib/nginx:不可登录

多个条件,多次编辑 -e
[root@localhost ~]# sed -e 's/192/10/g' -e 's/hello/goupi/g' a.txt
goupi world
helllllloworld
10.168.183.15

修改写入文件
[root@localhost ~]# sed -e 's/192/10/g' -e 's/hello/goupi/g' a.txt -i
[root@localhost ~]# cat a.txt 
goupi world
helllllloworld
10.168.183.15

在文件的第2行追加指定内容
[root@localhost ~]# cat a.txt 
goupi world
helllllloworld
10.168.183.15

[root@localhost ~]# sed '2a 我想要钱' a.txt 
goupi world
helllllloworld
我想要钱
10.168.183.15

在文件第1行前面插入指定内容
[root@localhost ~]# cat a.txt 
goupi world
helllllloworld
10.168.183.15

[root@localhost ~]# sed '1i 宇智波斑快掏钱' a.txt 
宇智波斑快掏钱
goupi world
helllllloworld
10.168.183.15

添加多行文本
[root@localhost ~]# sed '1i 佐助: 秽土转生吧,鼬!\n大蛇丸:好滴,老铁' a.txt 
佐助: 秽土转生吧,鼬!
大蛇丸:好滴,老铁
goupi world
helllllloworld
10.168.183.15

每一行追加指定内容
[root@localhost ~]# sed 'a -----------' a.txt
goupi world
-----------
helllllloworld
-----------
10.168.183.15
-----------
匹配ip地址
[root@localhost ~]# ifconfig ens192 | sed -n '2p' | sed 's/.*inet//' | sed 's/netmask.*//'
 192.168.101.28
使用-e
[root@localhost ~]# ifconfig ens192 | sed -e '2s/.*inet//' -e '2s/netmask.*//p' -n
 192.168.101.28