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 过滤出第二第五行 |
a | sed ‘3a oldboy’ # 在第3行追加内容,上面 |
i | sed ‘3i oldboy’ # 在第3行插入内容,下面 |
c | sed ‘3c oldboy’ # 将第3行完全替换 |
w | sed ‘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行