sed工具与正则表达式的使用(shell第四天)

sed工具    【流式编辑器】

—— 非交互,基于模式匹配过滤及修改文本
—— 逐行处理,并将结果输出到屏幕
——可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作


命令格式:
1)前置命令 | sed  [选项]  '条件指令'  【利用管道】
2)sed  [选项]  '条件指令'  文件.. ..

常用选项:
-n          屏蔽默认输出,默认sed会输出读取文档的全部内容

-i          sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响
[正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改]

-r (让sed支持扩展正则)



例:
-n
查看文件/etc/hosts第1行
[root@server0 ~]# sed  -n '1p'  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

查看/etc/passwd 3-6行
[root@server0 ~]# sed -n '3,6p'    /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
sync:x:5:0:sync:/sbin:/bin/sync

查看文件/etc/passwd第3行和第6行
[root@server0 ~]# sed -n '3p;6p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync


-i
删除文件进行逐条删除【实际未对文件进行修改】
[root@server0 ~]# sed  'd'  /wooo.txt
[root@server0 ~]# cat /wooo.txt
thekncxn;zcnk
dagahao the
wojiaozazahuithe  koa
修改源文件【慎用】
[root@server0 ~]# sed -i 'd' /wooo.txt
[root@server0 ~]# cat /wooo.txt


二) 认识sed工具的条件
# sed [选项] '条件指令' 文件.. ..

1)sed命令可以使用行号或正则做为条件匹配:

sed -n '3p' /etc/passwd          打印第3行

sed -n '3,5p' /etc/passwd        打印第3到5行

sed -n '3p;5p' /etc/passwd       打印第3和5行

sed -n '3,+10p' /etc/passwd      打印第3以及后面的10行

sed -n '1~2p' /etc/passwd        打印奇数行

sed -n '2~2p' /etc/passwd         打印偶数行

2)正则案例

【采用//把需要搜索的内容查找出来】
sed -n '/root/p' /etc/passwd       打印包含root的行

sed -n '/bash$/p' /etc/passwd      打印bash结尾的行[可以登陆的用户]
   

三)指令集合

【打印】p
sed  -n 'p' a.txt             输出所有行,等同于cat a.txt
sed  -n '4p' a.txt              输出第4行
sed  -n '4,7p' a.txt           输出第4~7行
sed  -n '4,+10p' a.txt        输出第4行及其后的10行内容
sed  -n '/^bin/p' a.txt        输出以bin开头的行
sed  -n '$=' a.txt            输出文件的行数

[root@server0 ~]# sed -n '$=' /etc/passwd
47            [后面无目录显示]

[root@server0 ~]# wc -l /etc/passwd
47 /etc/passwd    

【删除】d    注:练习时不需加 i ,防止文件误删!

sed  '3,5d' a.txt              删除第3~5行
sed  '/xml/d' a.txt             删除所有包含xml的行
sed  '/xml/!d' a.txt            删除不包含xml的行,!符号表示取反
sed  '/^install/d' a.txt       删除以install开头的行
sed  '$d' a.txt                 删除文件的最后一行
sed  '/^$/d' a.txt              删除所有空行

【替换】s         (s/旧内容/新内容/选项)

vim  test.txt                 练习环境
2017 2011 2018
2017 2017 2024
2017 2017 2017

sed 's/2017/xxxx/'           test.txt  替换所有行匹配的第一个2017
sed 's/2017/xxxx/g'          test.txt  替换所有的2017
sed 's/2017/xxxx/2'          test.txt  替换所有行匹配的第二个2017
sed 's/2017//2'              test.txt  将所有行匹配的第二个2017删除
sed '2s/2017/xxx/2'          test.txt  将第二行匹配的第二个2017删除
sed '2~2s/2017/xxx/g'      test.txt  替换偶数行的2017
sed -n 's/2017/x[root@svr5 ~]# vim anonftp.shxxx/p'       test.txt  打印
sed    '4,7s/^/#/'           a.txt         //将第4~7行注释掉(行首加#号)
sed    's/^#an/an/'          a.txt         //解除以#an开头的行的注释(去除行首的#号)


ifconfig | sed -n '2s/netm.*//p' | sed 's/.*t//'   查看ip
  172.25.0.11

  sed 's/\/bin\/bash/\sbin\/sh/' /etc/passwd

  sed  's#/bin/bash#/sbin/sh/#' /etc/passwd



将首字母和尾字母调换
  sed  -r  's/^(.)(.*)(.)$/\3\2\1/' /wooo.txt
【每行文本拆分为“第1个字符”、“中间的所有字符”、“倒数第1个字符”三个部分,然后通过替换操作重排顺序为“3-2-1”】

dello worlh
oa ga had
io xi za za huw

将所有大写字母加大括号
sed -r 's/([A-Z])/[\1]/' /wooo.txt
hell[O] world
d[A] ga hao
[W]o xi za za hui


编写脚本:【实现自动安装ftp软件包并配置他人可访问和上传】
    通过yum安装vsftpd软件包
    修改vsftpd服务配置,开启匿名上传
    调整/var/ftp/pub目录权限,允许ftp写入
    启动vsftpd服务,并设置开机自运行

#!/bin/bash
yum -y install vsftpd
cp /etc/vsftpd/vsftpd.conf{,.back}
sed  -i 's/^#an/an/'  /etc/vsftpd/vsftpd.conf
chmod 777 /var/ftp/pub
systemctl  restart vsftpd
systemctl  enable vsftpd

无法访问常见原因
1)防火墙未打开
2)selinux未打开
3)重启服务


sed [选项]  '条件指令'   文件.....
选项 :-n -i -r
条件:行号,/正则/
指令 :p,d,s,a,i,c

a,append追加,后
i,insert插入,前
c,把该行删除并插入



:r   读入
:w  另存为
sed '2r /etc/hosts'   tmp.txt   将文件tmp.txt读入到文件/etc/hosts的第二行
sed 'w /root/b.txt'   tmp.txt   将文件tmp.txt另存为文件root/b.txt内
sed '2w/root/b.txt'   tmp.txt   将
脚本:筛选用户并显示密码
#!/bin/bash
a=`sed -n /bash$/s/:.*//p  /etc/passwd`
for i in $a
do
pass=`grep $i /etc/shadow`
pass1=${pass#*:}
pass2=${pass1%%:*}
echo "$i ------>$pass2"
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值