三剑客包含:grep sed awk,此章节为sed
相比于grep过滤查询,sed除查询外,更偏向处理数据,实际工作中,在大型文件不适合打开编辑再保存的前提下用sed直接修改某一处更加简便,也避免了大型文档修改保存时间长有数据丢失的情况。
sed工作原理
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
特点
( 1)非交互,基于模式匹配的过滤及修改文本。
(2)逐行处理,太大的文件使用sed会显得格外有优势。
(3)可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种编辑。
(4)脚本化,在Shell脚本编程中使用sed比vim方便。
sed命令常见选项
-n | 静默模式,屏幕不再全部显示,只显示经过sed特殊处理的那一行 |
-e | 允许在该选项后加一条新的编辑指令 |
-f | 将sed的操作写在一个文件内 |
-r | 支持扩展正则表达式 -I 正则 |
-i | 直接修改读取的文件内容 而不是由屏幕输出 用于编辑修改 |
-h | 输出帮助信息 |
常见command选项
a\ | 新增,a后可以接字串,字串会在下一行出现 \是转义回车的作用 sed -r '2a\ 1111\ 3333333\ 444444' passwd 第2行开始加入这3行 |
c\ | 替换整行或多行 # sed -r '2caaaaaaaa' passwd 将第二行替换为aaaaaaa |
d | 删除 # sed -r '3,$d' passwd 删除第三行到最后一行 |
i\ | 插入内容 # sed -r '2iaaaaaaaa' passwd 在原本第二行之前插入这行aaaaaa |
p | 打印,由于默认就会输出处理后的内容所以加了打印会每一行输出两次? |
s | 查找替换 # sed -r 's/root/aofa/g' passwd 替换全部root |
n | 获取下一行输入行,用下一个命令处理新的行而不是第一个命令 |
! | 反向选择未选定的行 |
暂存空间hHGg
暂存和取用命令:h覆盖暂存空间 H追加暂存空间 g覆盖行 G追加行
实战举例
# sed -r '/^#/d' /etc/samba/smb.conf | 删除配置文件中#号注释行 |
# sed -r '/^[ \t]*$/d' space.txt | 删除无内容空行 |
# sed -ri '$a\chroot_local_user=YES' /etc/vsftpd/vsftpd.conf | 在最后一行后新插入一行新字符串 |
# sed -r '2,6s/^/#/' a.txt | 找到2到6行,把开始换成# |
# sed -r "1a$var1" /etc/hosts | sed中使用外部变量 |
# sed -r '/^bin/5,d' space.txt | 以bin开头的行 删除到第5行 |
# sed -r '/root/!d' space.txt | 除root外的其他行都删除 |
# sed -r '1~2d' space.txt | 删除所有奇数行,从1行开始每隔2行删除 |
# sed -r ‘1,5s/(.*)/#\1/' space.txt | 指定行前边加#号 |
# sed -r '/adm/{n;s/sbin/uuu/}' space.txt | n获取下一行 搜索adm的下一行把sbin替换成uuu |
# sed ’1!G;h;$!d‘ space.txt | 将txtx文件内容倒序,原文本行顺序倒写 |