Shell 脚本应用(二)
一、sed 工具概述
1.工作流程
1)常见选项
2)常见操作
2.sed 用法示例
1)输入符合条件的文本
2)删除符合条件的文本
3)替换符合条件的文本
4)迁移符合条件的文本
5)使用脚本编辑文件
一、sed 工具概述
sed 是一种流编辑器,能够通过非交互式的方式来完成对文件的增删改查。
- sed 的执行过程:sed 编辑器逐行处理文件(或输入),并将结果发送到屏幕。
具体执行过程:
- 首先 sed 会把当前正在处理的行保存到一个临时缓存区中(也称为模式空间)。
- 然后处理临时缓冲区的行,完成后把该行发送到屏幕上。
- sed 每处理完一行就将其从临时缓冲区删除,接着将下一行读入,进行处理和显示。
- 最后当 sed 处理完输入文件的最后一行,便会结束运行。
1.工作流程
- 读取—执行—显示
常见用法
sed [选项] '操作' 参数
1)常见选项
- -e:用来匹配多个操作符。
- -f 文件 或 --file=文件名:直接将 sed 的操作写在一个文件内,-f 文件则可以运行文件内的 sed 操作。
- -n:sed 默认情况下输出全部内容,-n 是只输出匹配到的内容。
- -i:此选项会直接修改原文件,建议修改前先备份原文件。
- -i.bak:修改原文件的同时创建 .bak 的备份。
2)常见操作
- a: 增加行,在当前行下面插入内容。
- i: 增加行,在当前行上面插入内容。
- c: 将指定行中的所有内容,替换成该选项后面的字符串。
- d: 删除,删除选择的行。
- s: 替换,替换指定字符串。
- p: 打印,输出指定行。
- g: 表示行内全面替换。
- w:表示把行写入一个文件。
- G:追加到当前模板块文本的后面。
- =:打印当前行号码。
2.sed 用法示例
创建测试文件
[root@CentOS-3 ~]# vim test.txt he was short and fat. He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online. the tongue is boneless but it breaks bones.12! google is the best tools for search keyword. The year ahead will test our political establishment to the li PI=3.141592653589793238462643383249901429 a wood cross! Actions speak louder than words #woood # #woooooood # AxyzxyzxyzxyzC I bet this place is really spooky late at night! Misfortunes never come alone/single. I shouldn't have lett so tast.
1)输入符合条件的文本
输出所有内容,等同于 cat test.txt
[root@CentOS-3 ~]# sed -n 'p' test.txt
输出第 3 行
[root@CentOS-3 ~]# sed -n '3p' test.txt
输出第 3-5 行
[root@CentOS-3 ~]# sed -n '3,5p' test.txt
输出第 3 行,第 5 行,第 8 行
[root@CentOS-3 ~]# sed -n -e 3p -e 5p -e 8p test.txt
输出所有奇数行( n:表示读入下一行)
[root@CentOS-3 ~]# sed -n 'p;n' test.txt
输出所有偶数行
[root@CentOS-3 ~]# sed -n 'n;p' test.txt
输出 1-5 奇数行
[root@CentOS-3 ~]# sed -n '1,5{p;n}' test.txt
输出第 10 行至文件尾的偶数行(其实输出的是 10,11,13,15 … 等行)
[root@CentOS-3 ~]# sed -n '10,${n;p}' test.txt
输出包含 the 的行
[root@CentOS-3 ~]# sed -n '/the/p' test.txt
输出第 4 行至第 1 个包含 the 的行
[root@CentOS-3 ~]# sed -n '4,/the/p' test.txt
输出包含 the 的所在行的行号( =:用来输出行号)
[root@CentOS-3 ~]# sed -n '/the/=' test.txt
输出以 PI 开头的行
[root@CentOS-3 ~]# sed -n '/^PI/p' test.txt
输出以数字结尾的行
[root@CentOS-3 ~]# sed -n '/[0-9]$/p' test.txt
输出包含单词 wood 的行( \< ,\>:表示单词边界)
[root@CentOS-3 ~]# sed -n '/\<wood\>/p' test.txt
2)删除符合条件的文本
- nl:计算文件的行数。
删除第 3 行
[root@CentOS-3 ~]# nl test.txt | sed '3d'
删除 3-5 行
[root@CentOS-3 ~]# nl test.txt | sed '3,5d'
删除包含 cross 的行
[root@CentOS-3 ~]# nl test.txt | sed '/cross/d'
删除不包含 cross 的行
[root@CentOS-3 ~]# nl test.txt | sed '/cross/!d'
删除开头为小写字母的行
[root@CentOS-3 ~]# sed '/^[a-z]/d' test.txt
删除以 . 结尾的行
[root@CentOS-3 ~]# sed '/\.$/d' test.txt
删除空行
[root@CentOS-3 ~]# sed '/^$/d' test.txt
删除重复的空行
[root@CentOS-3 ~]# cat <<END > 1.txt 1 2 3 4 5 END [root@CentOS-3 ~]# sed -e '/^$/{n;/^$/d}' 1.txt 等同于 [root@CentOS-3 ~]# cat -s 1.txt
3)替换符合条件的文本
将每行中的第 1 个 the 替换为 THE
[root@CentOS-3 ~]# sed 's/the/THE/' test.txt
将每行中的第 2 个 l 替换为 L
[root@CentOS-3 ~]# sed 's/l/L/2' test.txt
将文件中所有的 the 替换为 THE
[root@CentOS-3 ~]# sed 's/the/THE/g' test.txt
将文件中所有的 o 删除(替换为空串)
[root@CentOS-3 ~]# sed 's/o//g' test.txt
每行开始添加 # 字符
[root@CentOS-3 ~]# sed 's/^/#/' test.txt
在包含 the 的每行行首添加#字符
[root@CentOS-3 ~]# sed '/the/s/^/#/' test.txt
在每行末尾添加 EOF 字符
[root@CentOS-3 ~]# sed 's/$/EOF/' test.txt
将 3-5 行所有的 the 替换为 THE
[root@CentOS-3 ~]# sed '3,5s/the/THE/g' test.txt
将包含 the 的行中的 o 替换为 O
[root@CentOS-3 ~]# sed '/the/s/o/O/g' test.txt
将第二行到最后一行中所有数据替换为指定数据
[root@localhost ~]# sed '2,$c\Hello World' test.txt
将指定行中数据替换
[root@localhost ~]# sed '/A/c\Hello World' 1.txt
4)迁移符合条件的文本
- H:复制到剪贴板;
- g,G:将剪贴板中的数据覆盖\追加到指定行;
- w:保存为文件;
- r:读取指定文件;
- a:追加指定内容;
将包含 the 的行迁移到行尾(;用于多个操作)
- H 复制到剪贴板 — d 删除 —$G 追加到行尾
[root@CentOS-3 ~]# sed '/the/{H;d};$G' test.txt
将 1-5 行迁移到 17 行后
[root@CentOS-3 ~]# sed '1,5{H;d};17G' test.txt
将包含 the 的行另存为新文件
[root@CentOS-3 ~]# sed '/the/w out.file' test.txt [root@CentOS-3 ~]# ls anaconda-ks.cfg out.file test.txt [root@CentOS-3 ~]# cat out.file
在包含 the 每行后添加文件 hostname 内容
[root@CentOS-3 ~]# sed '/the/r /etc/hostname' test.txt
在第 3 行后插入新行,内容为 New
[root@CentOS-3 ~]# sed '3aNew' test.txt
在包含 the 的每行后插入新行
[root@CentOS-3 ~]# sed '/the/aNew' test.txt
在第 3 行后插入多行(\n 换行符)
[root@CentOS-3 ~]# sed '3aNew1\nNew2' test.txt
5)使用脚本编辑文件
- 使用 sed 脚本,将多个编辑指令存放到文件中(每行一条编辑指令),通过 -f 调用
将1-5 行迁移到 17 行后
可以使用下列脚本实现 [root@CentOS-3 ~]# vim opt.list 1,5H 1,5d 17G [root@CentOS-3 ~]# sed -f opt.list test.txt