Sed
sed
参数
-n 取消默认输出
-i 修改源文件内容
-r 支持扩展正则
-e 允许多项编辑
显示行号
grep -n . /etc/passwd
cat -n /etc/passwd
sed "=" /etc/passwd
awk '{print NR,$0}' /etc/passwd
less -N /etc/passwd
打印文件第几行 n
#显示单行
[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
过滤
#过滤以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
删除文件第几行 d
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 i
'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
替换 c
'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
案例:注释定时任务
sed -n '/ntpdate/s#^###gp' /var/spool/cron/root
sed -n '2/s#^###gp' /var/spool/cron/root 把第二行注释了
案例:关闭selinux
[root@lb03 ~]# sed '7cSELINUX=enforcing' /etc/sysconfig/selinux
[root@lb03 ~]# sed '/^SELINUX=/cSELINUX=enforcing' /etc/sysconfig/selinux
案例:更改端口
[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'


浙公网安备 33010602011771号