16.三剑客老二sed

1.sed格式

sed 选项 找谁+动作干嘛 file

2.sed参数选项

  • sed的选项参数
选项说明
-n取消默认输出,只与p过滤内容时使用 sed -n ‘3p’ /etc/passwd
-r支持扩展正则
-i修改文件内容,最好把-i放到最后
-i.bak先进行备份,然后修改文件内容.这个选项放在最后 sed -i.bak ‘s#bigbao#oldbao#g’ sed.txt
  • sed的动作
动作说明
p打印输入print,sed -n ‘3p’ /etc/passwd
d删除内容del,
==s###g====替换,s是替换,g是全局。 不带g只替换一行第一个内容,除了三个#也可以是三个别的符号///==
//p //,//p//过滤 //,//过滤范围 从哪里来到哪里去 范围匹配不到第二个就一直匹配 也就是匹配不到全部打印出来
;分号指定行过滤sed -n ‘2p ;5p’ sed.txt 过滤出第二第五行
ased ‘3a oldboy’ # 在第3行追加内容,上面
ised ‘3i oldboy’ # 在第3行插入内容,下面
csed ‘3c oldboy’ # 将第3行完全替换
wsed ‘3w w.txt’ # 将第3行保存到新文件中

3.sed案例题

3.1 -n 取消默认输出

案例

#  案例1  看/root/passwd的第二行
sed  -n  '2p'  /root/passwd


#  案例2  显示文件中的最后一行
sed  -n  '$p'  /root/passwd

3.2 -r 支持正则

  • 加-r 支持扩展正则符号

3.3 -i 修改源文件

  • 加-i 修改源文件

3.4 -i.bak 修改的同时并备份

#  案例1   修改文件内容之前进行备份,然后修改文件内容
[root@oldboyedu a]# sed -i.bak  's#root#oldboy#g'  passwd.txt 
[root@oldboyedu a]# ls
passwd.txt  passwd.txt.bak

3.5 过滤行打印动作p ; 分号 , 逗号

案例

#  案例1   显示文件中的第3到第5行使用逗号分隔
[root@oldboyedu ~]# sed -n '3,5p'   /etc/passwd
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


#  案例2   显示文件中第6行到文件的最后一行
[root@oldboyedu ~]# sed -n '6,$p'   /etc/passwd
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


#  案例3   使用指定行取出第2和第5行
[root@oldboyedu ~]# sed -n '2p;5p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

3.6 //p //,//p 模糊查找,过滤和过滤范围打印动作

注意//,//范围查找: 如果有两个结尾则只匹配到第一个,如果找不到结尾则输出文件的全部,成对出现

#  案例1   查找包含root的行
[root@oldboyedu ~]# sed -n /root/p /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


#  案例2   查找包含adm的行
[root@oldboyedu ~]# sed -n /adm/p /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
administrator:x:1000:1000::/home/administrator:/bin/bash


#  案例3   查找以r开头的行
[root@oldboyedu ~]# sed -n /^r/p /etc/passwd
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologi


#  案例4   查找以h结尾的行
[root@oldboyedu ~]# sed -n /h$/p /etc/passwd
root:x:0:0:root:/root:/bin/bash
administrator:x:1000:1000::/home/administrator:/bin/bash
oldboy01:x:1001:1001::/home/oldboy01:/bin/bash



#  案例5   查找文件中以r开头或者以a开头的行
[root@oldboyedu ~]# sed -rn '/(^a|^r)/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin


#  案例6   查找出bin和adm之间的行
[root@oldboyedu ~]# sed -n /^bin/,/^adm/p /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

#  案例7   笔试题; 查找日志中的时间范围
[root@oldboyedu ~]# sed -n '/Nov 13 20:14:43/,/Nov 13 20:16:07/p' /var/log/secure 
Nov 13 20:14:43 oldboyedu groupadd[2848]: group added to /etc/group: name=www, GID=1004
Nov 13 20:14:43 oldboyedu groupadd[2848]: group added to /etc/gshadow: name=www
Nov 13 20:14:43 oldboyedu groupadd[2848]: new group: name=www, GID=1004
Nov 13 20:16:07 oldboyedu useradd[2864]: failed adding user 'www', exit code: 9

3.7 删除动作d

案例

#  案例1   指定删除第3行
[root@oldboyedu ~]# sed '3d' 1234.txt 
11111111111
22222222222
44444444444
55555555555
66666666666

#  案例2   区间范围删除3-5行
[root@oldboyedu ~]# sed '3,5d' 1234.txt 
11111111111
22222222222
66666666666

#  案例3   删除包含root的行
[root@oldboyedu ~]# sed '/root/d' 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


#  案例4   删除以n结尾的行
[root@oldboyedu ~]# sed '/n$/d' passwd 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync



#  案例5   删除以a开头的行
[root@oldboyedu ~]# sed '/^a/d' 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



#  案例6   删除从root开始到adm之间的行
[root@oldboyedu ~]# sed '/^root/,/^adm/d' passwd 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync



#  案例7   删除文件中的a-z
[root@oldboyedu ~]# sed '/[a-z]/d' passwd
  空

#  案例8   排除/删除文件中的空行和带注释的行
[root@oldboyedu ~]# sed '/^$/d;/^#/d' 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@oldboyedu ~]# sed -r '/^$|^#/d' /etc/selinux/config 
SELINUX=enforcing
SELINUXTYPE=targeted
SETLOCALDEFS=0

3.8 替换动作s###g

​ sed ‘s#替换谁#替换成谁#g’ file

​ sed -n ‘3 s#替换谁#替换成谁#g p’ file 第三行

案例

#  案例1   将root替换成oldboy
[root@oldboyedu ~]# sed 's#root#oldboy#g' passwd 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash


#  案例2   替换每行出现的第一个单词root替换成oldboy
[root@oldboyedu ~]# sed 's#root#oldboy#' passwd2.txt 
oldboy:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


#  案例3   替换文件中的: 为-
[root@oldboyedu ~]# sed 's#:#-#g' passwd2.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



#  案例4   替换文件中的:为空格
[root@oldboyedu ~]# sed 's#:#   #g' passwd2.txt 
root   x   0   0   root   /root   /bin/bash
bin   x   1   1   bin   /bin   /sbin/nologin
daemon   x   2   2   daemon   /sbin   /sbin/no


#  案例5   替换文件中的:或者/ 为空格
[root@oldboyedu ~]# sed 's#:/# #g' passwd2.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


#  案例6   替换:/为空格
[root@oldboyedu ~]# sed 's#:/#  #g' passwd2.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



#  案例7   删除文件中的a-z
[root@oldboyedu ~]# sed 's#[a-z]##g'  passwd2.txt
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://


#  案例8   删除a-z之外的所有内容
[root@oldboyedu ~]# sed 's#[^a-z]##g'  passwd2.txt
rootxrootrootbinbash
binxbinbinsbinnologin
daemonxdaemonsbinsbinnologin


#  案例9   将第4行的nologin替换为bash
[root@oldboyedu ~]# sed -n '4 s#nologin#bash#g p' passwd2.txt 
adm:x:3:4:adm:/var/adm:/sbin/bash


#  案例10  将第3行-6行的x替换成A
[root@oldboyedu ~]# sed -n '3,6 s#x#A#g p' passwd2.txt 
daemon:A:2:2:daemon:/sbin:/sbin/nologin
adm:A:3:4:adm:/var/adm:/sbin/nologin
lp:A:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:A:5:0:sync:/sbin:/bin/sync


#  案例11  查找到包含root的行将x替换成X
[root@oldboyedu ~]# sed -n '/root/ s#x#A#g p' passwd2.txt 
root:A:0:0:root:/root:/bin/bash


#  案例12  面试题+笔试题,隐藏话术i,文件中root 替换成oldboy 
[root@oldboyedu ~]# sed -n 's#root#oldboy#g p' passwd2.txt 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
注:若果要修改源文件使用-i选项


#  案例13  将3-5行进行注释
[root@oldboyedu ~]# sed '3,5 s#^#\##g  p' passwd2.txt 
[root@oldboyedu ~]# sed '3,5 s/^/#/g  p' passwd2.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
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync


#  案例14  指定注释shutdown的行
[root@oldboyedu ~]# sed 's#^shutdown#\#shutdown#g' passwd2.txt 
root:x:0:0:root:/root:/bin/bash
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
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

3.10 动作c i a 插入行选项

案例

#  案例1  在第3行的下面插入oldboy111
[root@oldboyedu ~]# sed '3a oldboy111' 1234.txt 
11111111111
22222222222
33333333333
oldboy111
44444444444
55555555555



#  案例2  在第3行上面插入oldboy222字符
[root@oldboyedu ~]# sed '3i oldboy222' 1234.txt 
11111111111
22222222222
oldboy222
33333333333
44444444444
55555555555


#  案例3  将第3行完全替换成oldboy333字符
[root@oldboyedu ~]# sed '3c oldboy333' 1234.txt 
11111111111
22222222222
oldboy333
44444444444
55555555555



#  案例4  将第17行进行替换Port 22
[root@oldboyedu ~]# sed -n '17c Port 22' /etc/ssh/sshd_config 
Port 22

3.12 sed写入动作w

案例

#  案例1  将文件的第3行保存到新文件中s.txt
[root@oldboyedu ~]# sed '3w w.txt' 1234.txt 
[root@oldboyedu ~]# cat w.txt 
33333333333


#  案例2  将文件的第3-5行保存到新文件中s.txt
[root@oldboyedu ~]# sed '3,5w w.txt' 1234.txt 
[root@oldboyedu ~]# cat w.txt 
33333333333
44444444444
55555555555

#  案例3  模糊查找root到adm开头的行内容保存到s.txt
sed '/^root/,/^adm/w  s.txt'  /etc/passwd
[root@oldboyedu ~]# cat s.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

3.13sed后向引用

语法结构:
         sed 's#(正则)#\1#g' # \1获取第一个括号中的内容 \2获取第2个括号中的内容
         \1\2类似于变量,取的值为前面的字符串

#  案例1   echo oldboy test 使用后向引用输出test(至少3种)
echo oldboy test | sed -nr 's#^ol.* (.*)$#\1#g p'
echo oldboy test | sed -r 's#(o.*y) (.*)$#\2#g'
echo oldboy test | sed -r 's#oldboy (t.*t)#\1#g'

[root@oldboyedu ~]# echo oldboy test | sed -r 's#(oldboy) (test)#\1#g'
oldboy
[root@oldboyedu ~]# echo oldboy test | sed -r 's#(oldboy) (test)#\2#g'
test
[root@oldboyedu ~]# echo oldboy test | sed -r 's#(oldboy) (test)#\1\2#g'
oldboytest


#  案例2   获取ip地址
 ip a | sed -rn 's#.*inet (.*)/24.*33$#\1#g p'

#  案例3   批量创建用户
echo test{1..3} | xargs -n1 | sed -r 's#(.*)#useradd \1#g' |bash


#删除除了root的普通用户
awk -F: '$1!~"root"' /etc/passwd | awk -F: '$NF~"/bin/bash"{print $1}' | xargs -n1 | sed -r 's#(.*)#userdel -r \1#g' | bash
(.*):x

(.*):x.*:
(.*):x.*:


#  案例4   使用序列user{1..3}给每个用户配置密码oldboy123.com
echo ame{1..3} |xargs -n1 |sed -r 's#(.*)# echo oldboy123.com |passwd --stdin \1#g'|bash



#  案例5   echo  {0..9} 使用后向引用把每个数字加上<>  
echo {0..9} | sed -r 's#(.*)#<\1>#g'
echo {0..9} | xargs -n1 | sed -r 's#(.*)#<\1>#g'


#  案例6   调换/etc/passwd第1列和最后一列内容
sed -r 's#(.*):x.*:(.*)#\2  \1#g' /etc/passwd


#  案例7   取出stat /etc/hosts中的0644或644
[root@oldboyedu ~]# stat /etc/hosts 
  文件:“/etc/hosts”
  大小:158           块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:33569262    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2024-11-13 09:34:14.238854838 +0800
最近更改:2020-06-23 14:11:43.000000000 +0800
最近改动:2024-10-25 01:22:50.916002360 +0800
创建时间:-
[root@oldboyedu ~]# stat /etc/hosts |sed -n '4p' | sed -r 's#^.*\(([0-9]+)/.*$#\1#g'
0644

4.vim注释多行

vim批量注释:
ctrl+v 进入可视块模式
然后键盘上下键选择
选择后按大写的I 进入编辑模式
然后输入内容
完成后按两次ESC键即可

vim中替换动作

:s///g

:%s///g

:s/root/oldboy/g # 只替换光标所在行的所有root
:%s/root/oldboy/g # 将文件中所有的root替换成oldboy

5.grep参数总结

grep 参数选项
-v   # 取反
-r   # 递归过滤文件内容
-w   # 过滤的内容两边必须是空格
-E   # 支持扩展正则  egrep

-i   # 不区分大小写
-n   # 过滤到内容行号
-c   # 统计单词出现的次数
-o   # 匹配过程
-A   # 过滤到内容往下2行
-B   # 过滤到内容往上2行
-C   # 过滤到内容上下各2行
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇