三剑客之二 Sed小记
sed #增删改查均可,主要是替换
格式: sed 找谁(过滤的内容) 干啥(对过滤到的内容做的动作)
参数选项:
-n #取消默认输出
-r #支持扩展正则
1.过滤内容p print
*sed按行操作,默认会逐行读取执行,每一条都会输入到屏幕,执行到3p时在输出一次所以就会显示2次
[root@web01 ~]# sed '3p' 2.txt
root oldboy good
stundent oldboy
oldboy
oldboy
oldgirl root
dog cat
oldboy
ROOT
old
[root@web01 ~]# sed -n '3p' 2.txt #取消默认输出
oldboy #取消默认输出后只执行输入指令,只显示第三行
显示多行:
总结:取行时需要加上-n选项,取消默认输出
sed可以指定行来显示,单行,多行,均可
某某行和某某行用分号隔开,每个数字后均要加上p
某某行到某某行用逗号分隔,最后的数字加上p即可
2.按照内容模糊匹配 过滤字符串
[root@web01 ~]# cat new.txt
roottt
root\oldboy
oldgirl
[root@web01 ~]# sed -n '/root/p' new.txt #匹配内容时需要用//包起来
#非精确匹配,会匹配包含这个词语的词组
roottt
root
*成对匹配,匹配范围*
范围匹配总结:
成对匹配,刚好一对就截止第2个词语结束,不管后面有无内容都不在显示,如果第一对匹配结束,后面内容中出现第1个匹配词而无第二个匹配此会默认显示后面所有内容,以此类推。
n和p 是一对CP,有n则有P
n #取消默认输出
p #打印,输出
3. 删除
[root@oldboy~]# sed "3d" 123.txt #删除第3行
[root@oldboy~]# sed "1,3d" 123.txt #删除第一行到第三行
ps: -d删除不针对源文件,源文件查看时保持不变
[root@web01 ~]# cat 2.txt
root oldboy good
stundent oldboy
oldboy
oldgirl root
dog cat
oldboy
ROOT
[root@web01 ~]# sed '/oldboy/d' 2.txt #匹配内容后删除
oldgirl root
dog cat
ROOT
#要针对源文件操作,加上-i 参数
[root@oldboy~]# sed -i "3d" 123.txt #真正删除第3行
[root@oldboy~]# sed -i "3,$d" 123.txt #删除第3行到末尾的内容
增删改查 (重要)
a append #在过滤到行的下面插入内容
格式:
sed '3a 插入内容' oldboy.txt # 在第三行的后面插入内容 内容在第四行
i insert #在过滤到内容的上一行插入(在当前行插入内容)
格式:
sed '3i 插入内容' oldboy.txt # 在第三行插入新的内容 内容在第三行
c 替换 把顾虑到内容的行进行替换
格式:
sed '3c 替换的内容' oldboy.txt # 把第三行的内容替换掉
a 追加内容 #在第三行的后面插入oldboy
[root@oldboy~]#sed '3a oldboy' oldboy.txt
I am lizhenya teacher!
I teach linux.
test
oldboy
# 在第一行到第3行之间追加内容good
[root@oldboy~]#sed "1,3a good 1.txt #第1行,第2行,第3行后面都会插入good
i 插入内容 在当前行上面插入新的内容 oldboy
[root@oldboy~]#sed '3i oldboy' oldboy.txt #3行上面,第2行后面
I am lizhenya teacher!
I teach linux.
oldboy
test
[root@oldboy~]#sed '$i oldboy' oldboy.txt # 最后一行的上面插入oldboy
[root@oldboy~]#sed '1,3i oldboy' oldboy.txt # 在第1,第2,第3上面都插入
oldboy
I am lizhenya teacher!
oldboy
I teach linux.
oldboy
test
c 将过滤到的内容进行替换 #把整行替换成oldboy
[root@oldboy~]#sed '3c oldboy' oldboy.txt
I am lizhenya teacher!
I teach linux.
oldboy
[root@oldboy~]#sed '8c SELINUX=enfrcing' /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enfrcing
[root@web01 ~]# sed '1,5coldboy' passwd
#将第1行到第5行的内容删除替换成oldboy
oldboy
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
4.替换
vim 替换:
s/// # 当前光标所在行的第一个内容
s///g # 替换当前行的所有匹配到的内容
%s///g # 全局替换
sed替换:
///, ###, @@@ #同样的三个特殊符号都能使用,具体根据文件内容选择
sed s/// #只替换每行的第一个匹配到的内容
sed 's///g' #全局替换
sed替换实例:
[root@web01 ~]# cat 2.txt
root oldboy good
stundent oldboy
oldboy
oldgirl root
dog cat
oldboy
ROOT
old
[root@web01 ~]# sed s#oldboy#oldboyedu# 2.txt
#每行的第一个匹配到的都会替换
root oldboyedu good
stundent oldboyedu
oldboyedu
oldgirl root
dog cat
oldboyedu
ROOT
old
补充:指定替换某行的第一个
5. sed 后向引用() ##重要!!
1.如何使用sed 给123456加上<123456>
[root@oldboy~]#echo 123456
123456
[root@oldboy~]#echo 123456|sed 's#123456#<123456>#g'
<123456>
2.使用sed的后向引用 ()里面的内容正则匹配 调用第一个括号使用\1来代表 第二个括号\2
[root@oldboy~]#echo 123456|sed -r 's#(.*)#\1#g'
123456
[root@oldboy~]#echo 123456|sed -r 's#(123)(456)#\1#g'
123
[root@oldboy~]#echo 123456|sed -r 's#(123)(456)#\2#g'
456
如何取出eth0的IP地址() 扩展正则 需要加 -r
1.如何取出ip地址所在的行
2.ip行之后如何把ip地址在()中匹配
3.调用
1)使用ipadd 后向引用 .* 匹配当前整行
[root@oldboy~]#ip add|sed -n 9p|sed -r 's#(.*)#\1#g'
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@oldboy~]#ifconfig eth0|sed -nr '2s#(.*)#\1#gp'
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
2)复制整行把想要的内容括起来
[root@oldboy~]#ifconfig eth0|sed -nr '2s# inet (.*) netmask 255.255.255.0 broadcast 10.0.0.255#\1#gp'
3)把行的后面所有的内容使用.*表示
[root@oldboy~]#ifconfig eth0|sed -nr '2s# inet (.*) net.*$#\1#gp' 10.0.0.200
4)把括号前面的内容也进行正则匹配
[root@oldboy~]#ifconfig eth0|sed -nr '2s#^.*et (.*) n.*$#\1#gp'
10.0.0.200
[root@oldboy~]#ifconfig eth0|sed -nr '2s#(^.*et )(.*)( n.*$)#\1#gp'
inet
[root@oldboy~]#ifconfig eth0|sed -nr '2s#(^.*et )(.*)( n.*$)#\2#gp'
10.0.0.200
[root@oldboy~]#ifconfig eth0|sed -nr '2s#(^.*et )(.*)( n.*$)#\3#gp'
netmask 255.255.255.0 broadcast 10.0.0.255
把第一行和第七行替换
[root@web01 ~]# sed -nr 's#(.*)(:x.*:)(/.*)#\3\2\1#gp' 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
[root@web01 ~]# stat hosts #取出第三行里面的2051
File: ‘hosts’
Size: 7 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 67174920 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-07-15 22:57:05.203789452 +0800
Modify: 2020-07-15 22:56:53.719789917 +0800
Change: 2020-07-15 22:56:53.719789917 +0800
Birth: -
[root@web01 ~]# stat hosts|sed -rn '3s#(.*h/)(.*)(d\t.*$)#\2#gp'
2051
后向引用小结:
(1) 整行以字母开头,可以不加^,直接用.*去匹配 比如例题种的(.*h/)
(2)当行中出现空格,尽量错开空格取其前后,无法错开按照空格可以用.*,确定不了空格的字符数可以尝试用Tab键