目录
-
- 定义
- 工作流程
- 常见用法
- 常见的sed命令选项主要包含以下几种
- 常见的操作包含以下几种
- 输出内容
-
- 带行号输出所有内容 等同于 cat test.txt
- 输出第4行,或者3到5行
- 输出偶数行;奇数行
- 输出1到6行之间的偶数行,3到9行之间的奇数行
- 输出以第6行到结尾之间的偶数行(即以第6行为起始行,重新排序设置)
- 输出包含the的内容
- 输出从第3行开始到第一个包含the的行(是一个区间过程)
- 输出包含the的所在行的行号(等号用来输出行号)
- 输出以PI为开头的内容;以0到9数字为结尾的内容
- 输出包含单词home的行(<> 代表单词边界)
- 删除内容
-
- 删除第5行;删除2到4行
- 删除除了包含单词home的内容的其它所有行
- 删除以a-z小写字母为开头的内容
- 删除以.为结尾的内容
- 删除所有空行
- 替换内容
-
- 将每行中的第一个the替换为THE
- 将文件中的所有the替换为THE
- 将每行中的第2个l替换为L
- 将文件中的所有的o删除(替换为空串)
- 在每行行首插入#号
- 在每行行尾插入字符串EOF
- 在包含the的每行行首插入#号
- 将包含the的所有行中的o替换为O
- 修改内容
-
- 将包含the的行迁移至文件末尾,{;}用于多个操作
- 将第1-4行内容转移至第16行后
- 将包含the的行另存为文件out.file
- 将文件/etc/hostname的内容添加到包含the的每行以后
- 在第三行前面插入一个新行,内容为New
- 在包含the的每行后插入一个新行,内容为New
- 在文件最后结尾后插入一个新行,内容为New
- 在第三行后插入一个新行,内容为New1,后换行插入一个新行,内容为new2
- 使用脚本编辑文件
-
- 使用sed脚本将多个编辑指令存放到文件中执行
- sed直接操作文件示例
定义
sed (Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除替换,添加,移动等),最后输出所有行或者仅输出处理的某些行。
工作流程
- 读取:sed 从输入流(文件,管道,标准输入)中读取一行内容并存储到临时的缓存区中(又称模式空间,pattern space)。
- 执行:默认情况下。所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注:默认情况下所有的sed命令都是在模式空间内执行的,由此输入的文件并不会发生任何变化,除非是用重定向存储输出。
常见用法
- sed [选项] ‘操作’ 参数
- sed [选项] -f scriptfile 参数
常见的sed命令选项主要包含以下几种
- -e script(脚本命令) : 指定sed编辑命令
- -f scriptfile(文件) : 指定的文件中是sed编辑命令
- -h 或 --help :显示帮助
- -n,–quiet 或 silent :表示仅显示处理后的结果
- -i :直接编辑文本文件(会对文件产生变化)
常见的操作包含以下几种
- a: 增加,在当前行下面增加一行指定内容
- c:替换,将选定行替换为指定内容
- d:删除,删除选定的行
- i:插入,在选定行上面插入一行指定内容
- p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。(输出)
- s:替换,替换指定字符
- y:字符转换
输出内容
带行号输出所有内容 等同于 cat test.txt
[root@server2 ~]# nl test.txt | sed -n 'p'
输出第4行,或者3到5行
[root@server2 ~]# nl test.txt | sed -n '4p'
[root@server2 ~]# nl test.txt | sed -n '3,5p
输出偶数行;奇数行
[root@server2 ~]# nl test.txt | sed -n 'n;p'
[root@server2 ~]# nl test.txt | sed -n 'p;n'
输出1到6行之间的偶数行,3到9行之间的奇数行
[root@server2 ~]# nl test.txt | sed -n '1,6{n;p}'
[root@server2 ~]# nl test.txt | sed -n '3,9{p;n}'
输出以第6行到结尾之间的偶数行(即以第6行为起始行,重新排序设置)
[root@server2 ~]# nl test.txt | sed -n '6,${n;p}'
输出包含the的内容
[root@server2 ~]# sed -n '/the/p' test.txt
输出从第3行开始到第一个包含the的行(是一个区间过程)
[root@server2 ~]# nl test.txt | sed -n '3,/the/p'
输出包含the的所在行的行号(等号用来输出行号)
[root@server2 ~]# sed -n '/the/=' test.txt
输出以PI为开头的内容;以0到9数字为结尾的内容
[root@server2 ~]# sed -n '/^PI/p' test.txt
[root@server2 ~]# sed -n '/[0-9]$/p' test.txt
输出包含单词home的行(<> 代表单词边界)
[root@server2 ~]# sed -n '/\<home\>/p' test.txt
[root@server2 ~]# grep 'home' test.txt
- 注:nl :命令用于计算文件的行数
删除内容
删除第5行;删除2到4行
[root@server2 ~]# nl test.txt | sed '5d'
[root@server2 ~]# nl test.txt | sed '2,4d'
仅在外部输出删除,不会对源文件产生影响
删除除了包含单词home的内容的其它所有行
[root@server2 ~]# nl test.txt | sed '/home/!d'
3 The home of Football on BBC Sport online.
删除以a-z小写字母为开头的内容
[root@server2 ~]# sed '/^[a-z]/d' test.txt
删除以.为结尾的内容
[root@server2 ~]# sed '/\.$/d' test.txt
删除所有空行
[root@server2 ~]# vi test.txt
[root@server2 ~]# sed '/^$/d' test.txt
替换内容
将每行中的第一个the替换为THE
[root@server2 ~]# sed 's/the/THE/' test.txt
将文件中的所有the替换为THE
[root@server2 ~]# sed 's/the/THE/g' test.txt
将每行中的第2个l替换为L
[root@server2 ~]# sed 's/l/L/2' test.txt
将文件中的所有的o删除(替换为空串)
[root@server2 ~]# sed 's/o//g' test.txt
在每行行首插入#号
[root@server2 ~]# sed 's/^/#/' test.txt
在每行行尾插入字符串EOF
[root@server2 ~]# sed 's/$/EOF/' test.txt
在包含the的每行行首插入#号
[root@server2 ~]# sed '/the/s/^/#/' test.txt
将包含the的所有行中的o替换为O
[root@server2 ~]# sed '/the/s/o/O/g' test.txt
- 注:H:复制到剪切板 g,
- G :将剪切板中的数据覆盖/追加至指定行
- w:保存为文件
- r:读取指定文件
- a:追加指定内容
修改内容
将包含the的行迁移至文件末尾,{;}用于多个操作
[root@server2 ~]# sed '/the/{H;d};$G' test.txt
将第1-4行内容转移至第16行后
[root@server2 ~]# sed '1,4{H;d};16G' test.txt
将包含the的行另存为文件out.file
[root@server2 ~]# sed '/the/w out.file' test.txt
[root@server2 ~]# ls -lh
[root@server2 ~]# cat out.file
将文件/etc/hostname的内容添加到包含the的每行以后
[root@server2 ~]# sed '/the/r /etc/hostname' test.txt
在第三行前面插入一个新行,内容为New
[root@server2 ~]# sed '3iNew' test.txt
在包含the的每行后插入一个新行,内容为New
[root@server2 ~]# sed '/the/aNew' test.txt
在文件最后结尾后插入一个新行,内容为New
[root@server2 ~]# sed '$aNew' test.txt
在第三行后插入一个新行,内容为New1,后换行插入一个新行,内容为new2
(中间的\n表示换行)
[root@server2 ~]# sed '4aNew1\nnew2' test.txt
- 注意:\n 和\r的区别:
\n 换行符,是另起一新行(光标换行)
\r 回车符,光标回到一旧行的开头(覆盖前一个)
使用脚本编辑文件
使用sed脚本将多个编辑指令存放到文件中执行
[root@server2 ~]# vi opt.list
1,5H 1到5行剪切
1,5d 1到5行删除
17G 17行追加
[root@server2 ~]# sed -f opt.list test.txt
sed直接操作文件示例
编写一个脚本,用来调整vsftpd 服务配置,要求禁止匿名用户,但允许本地用户
[root@server2 ~]# useradd dada
[root@server2 ~]# passwd dada
[root@server2 ~]# useradd xiaoxiao
[root@server2 ~]# passwd xiaoxiao
[root@server2 ~]# vi ftp.sh
#!/bin/bash
A=vsftpd
FTP=/etc/vsftpd/vsftpd.conf
yum -y install $A
sed -i -e '/local_enable/s/NO/YES/g' $FTP
sed -i -e '/write_enable/s/NO/YES/g' $FTP
sed -i -e 's/^#chroot_local_user=YES/chroot_local_user=YES/g' $FTP
sed -i '$aallow_writeable_chroot=YES' $FTP
sed -i -e '/listen/s/NO/YES/g' $FTP
sed -i -e '/listen_ipv6/s/YES/NO/g' $FTP
systemctl start $A
netstat -anpt | grep $A
[root@server2 ~]# chmod +x ftp.sh
[root@server2 ~]# ./ftp.sh
客户机上安装ftp进行访问
[root@server1 ~]# yum -y install ftp
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): dada
ftp> exit
[root@server1 ~]# ftp 20.0.0.11
Name (20.0.0.11:root): xiaoxiao
ftp> exit
验证成功