三剑客之二 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键
 

posted @ 2021-08-16 17:27  芒果~~  阅读(29)  评论(0编辑  收藏  举报