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
sed 工具与正则表达式的使用(shell 第四天)
来源: http://www.bubuko.com/infodetail-2582309.html