Sed

sed

参数linux

-n 取消默认输出
-i 修改源文件内容
-r 支持扩展正则
-e 容许多项编辑

显示行号shell

grep -n . /etc/passwd
cat -n /etc/passwd
sed "=" /etc/passwd
awk '{print NR,$0}' /etc/passwd
less -N /etc/passwd

打印文件第几行 nruby

#显示单行       
[root@lb03 ~]# sed -n  '1p'  passwd 
root:x:0:0:root:/root:/bin/bash

#显示连续的多行
[root@lb03 ~]# sed -n  '1,3p'  passwd 
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

#显示不连续的多行
[root@lb03 ~]# sed -n  '1p;3p'  passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@lb03 ~]# sed -n '$p'  passwd
rlgrtueigh

过滤bash

#过滤以root开头
[root@lb03 ~]# sed  -n  '/^root/p'  passwd 
root:x:0:0:root:/root:/bin/bash
roott
[root@lb03 ~]# sed  -n  '/^ROOT/p'  passwd 
ROOT

#过滤以t为结尾的行
[root@lb03 ~]# sed  -n  '/t$/p'  passwd 
halt:x:7:0:halt:/sbin:/sbin/halt
roott
                
#过滤出字符连续的行      
[root@lb03 ~]# sed  -n  '/adm/,/ftp/p'  passwd 
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

#取出不一样的字符串
[root@lb03 ~]# sed  -n  '/adm/p;/ftp/p'  passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@lb03 ~]# sed -rn  '/adm|ftp/p'  passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

删除文件第几行 dless

sed '2,4d' /etc/passwd 删除2-4行
sed '2,$d' /etc/passwd 删除2-末尾行
sed '2d,4d' /etc/passwd 删除2行和4行
sed '1,$d' /etc/passwd 全删
sed '/root/{n;d}' /etc/passwd 删除root下一行
sed '/bin/{N;d}' /etc/passwd 删除bin上一行

追加,插入 a issh

'a'
第三行下方追加oldboy
[root@shell /server/scripts]# sed '3a oldboy' pass  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
oldboy
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

'i'
第三行上方追加alex
[root@shell /server/scripts]# sed '3i alex' pass  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
alex
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@lb03 ~]# sed  '1s/^/oldboy\n/'  test.txt
oldboy
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

#在文件的结尾加入内容
[root@lb03 ~]# sed  '$s/$/\noldgirl/'  test.txt
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
oldgirl

替换 ccode

'c'
第四整行替换为mmmmmmmm
[root@shell /server/scripts]# sed '4c mmmmmmmm' pass  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mmmmmmmm
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#包含root的行所有替换为admin
[root@lb03 ~]# sed  '/root/cadmin'  test.txt

's###g'
将lp行的nologin换成ss
[root@shell /server/scripts]# sed '/lp/s#nologin#ss#g' pass  
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/ss

将adm行的sbin换成yy (有-n 就加p)
[root@shell scripts]# sed -n '/adm/s#sbin#yy#gp' pass    
adm:x:3:4:adm:/var/adm:/yy/nologin

#替换多行 s###g
[root@lb03 ~]# sed  '1,5s#bin#shell#g'  test.txt
root:x:0:0:root:/root:/shell/bash
shell:x:1:1:shell:/shell:/sshell/nologin
daemon:x:2:2:daemon:/sshell:/sshell/nologin
adm:x:3:4:adm:/var/adm:/sshell/nologin
lp:x:4:7:lp:/var/spool/lpd:/sshell/nologin
sync:x:5:0:sync:/sbin:/bin/sync

#只替换每一行第一个匹配的 s###
[root@lb03 ~]# sed  '1,5s#bin#shell#'  test.txt
root:x:0:0:root:/root:/shell/bash
shell:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sshell:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sshell/nologin
lp:x:4:7:lp:/var/spool/lpd:/sshell/nologin
sync:x:5:0:sync:/sbin:/bin/sync

#忽略大小写替换  i
[root@lb03 ~]# sed   's#root#admin#gi'  test.txt
admin:x:0:0:admin:/admin:/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

'n N'
匹配到root下一行 而后替换
[root@shell /server/scripts]# sed '/root/{n;s#sbin#msy#g}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/msy/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

==案例==:注释定时任务server

sed -n '/ntpdate/s#^###gp' /var/spool/cron/root 
sed -n '2/s#^###gp' /var/spool/cron/root  把第二行注释了

==案例==:关闭selinuxblog

[root@lb03 ~]# sed '7cSELINUX=enforcing'  /etc/sysconfig/selinux
[root@lb03 ~]# sed '/^SELINUX=/cSELINUX=enforcing'  /etc/sysconfig/selinux

==案例==:更改端口ip

[root@lb03 ~]# sed  '/^#Port/cPort 666'  /etc/ssh/sshd_config
[root@lb03 ~]# sed  '17cPort 666'  /etc/ssh/sshd_config

将内容写到新的文件中 w

[root@lb03 ~]# sed  -n  '/root/w file.txt'  passwd 
[root@lb03 ~]# cat file.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
roott
[root@lb03 ~]# sed  -n  '1w file1.txt'  passwd 
[root@lb03 ~]# cat file1.txt 
root:x:0:0:root:/root:/bin/bash

容许多项编辑 e

[root@lb03 ~]# sed  '1,10d' passwd  |sed  's#root#123#g'
[root@lb03 ~]# sed  -e  '1,10d'  -e 's#root#123#g'  passwd

[root@lb03 ~]# sed -n  '1!p'  passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@lb03 ~]# sed   '1!d'  passwd
root:x:0:0:root:/root:/bin/bash

暂存和取用 h H g G

'h' 
取第一行放暂存区 替换最后一行
[root@shell /server/scripts]# sed '1h;$g' pass  
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
root:x:0:0:root:/root:/bin/bash

取第二行放暂存区 替换第三行
[root@shell /server/scripts]# sed '2h;3g' pass  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

'G' 
把第一行放到暂存区 在最后一行调用 (不是替换,是追加)
[root@shell /scripts]# sed '1h;$G' pass  
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
root:x:0:0:root:/root:/bin/bash

'{h}' 
把第一行内容放暂存区并删除 最后一行调用
[root@shell /server/scripts]# sed -r '1{h;d};$G' pass 
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:x:0:0:root:/root:/bin/bash

'g'
把第一行放暂存区 从第二行到最后一行替换
[root@shell /server/scripts]# sed -r '1h;2,$g' pass 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

'H'
[root@shell /server/scripts]# sed -r '1h;2,3H;$G' pass
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
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

在有空格等的文件中所有加注释

[root@lb03 ~]# cat file.txt
    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
    #    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
#####mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin

[root@lb03 ~]# sed  's/^[ \t#]*/#/g'  file.txt
#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
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin

sed 后向引用

所有注释

[root@shell /server/scripts]# sed  's/.*/#&/g'  acce  = sed -r  's/(.*)/#\1/g'  passwd
(.*:全部字符 #&:注释并执行.* 若是不加# 就会默认所有替换成#  就是一例#)    #\1:换成# 第一个括号里的值
#当前IP为:111.78.80.213 对应出现的次数是: 2
#当前IP为:42.114.204.31 对应出现的次数是: 1
#当前IP为:101.132.102.45 对应出现的次数是: 22

[root@shell /server/scripts]# sed  's/.*/&/g'  acce  = sed -r  's/(.*)/\1/g'  acce
(.*:全部字符 \1:第一个括号的值)
当前IP为:111.78.80.213 对应出现的次数是: 2
当前IP为:42.114.204.31 对应出现的次数是: 1
当前IP为:101.132.102.45 对应出现的次数是: 22

==案例==:取ip地址

[root@shell /server/scripts]# ip a s eth0   s是指定网卡
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group 
    link/ether 00:0c:29:55:c6:31 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.3/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe55:c631/64 scope link 
       valid_lft forever preferred_lft forever

[root@lb03 ~]# ip a s eth0 |sed -nr '3s#(.*t )(.*)(/.*)#\2#gp'
10.0.0.3
-n 取消默认输出
-r 支持扩展正则
3     s#(.*t )        (.*)      (/.*)#      \2#gp
第3行  开始到空格结束    输出剩余   从/开始到结束  值是第2个括号里的

==案例==:把passwd文件中的第一列与第七列进行位置调换

[root@lb03 ~]# sed  -r  's#(.*)(:x.*:)(.*)#\3\2\1#g'  passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
sed -r 's#(.*)#\1 alex#g' 1.txt
echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;`echo $RANDOM|md5sum|cut -c1-8`|passwd --stdin \1#g'

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息