小破站学习笔记
掌握sed的基本用法
Sed的常用命令 打印p 删除d 插入i等
- Win下的编程开发工具
Notepad++
Ultraedit
Editplus
- linux下的工具
Vim vi
gedit nano emacs
sed用来做什么
Sed是stream editor(流编辑器)的缩写,简称流编辑器;用来处理文件的
Sed如何处理文件
Sed是一行一行读取文件内容并按要求进行处理,把处理后的结果输出到屏幕1.由于sed把每一行都保留在临时缓冲区中,对整个副本进行编辑,所以不会直接修改源文件2.Sed主要用来自动编辑一个或者多个文件,简化对文件的反复操作,对文件进行行过滤和转换操作
Sed使用方法
语法格式2种
命令行模式脚本模式
- 语法格式
Sed [options] ‘处理动作’ 文件名
-e 进行多项(多次)编辑-n 取消默认输出 不自动打印-r 使用扩展正则表达式-i 原地编辑(修改源文件)-f 指定sed脚本的文件名
- 常见处理动作 都在单引号里面
\'p\' 打印\'i\' 在指定行之前插入内容\'a\' 在指定行之后插入内容\'c\' 替换指定行所有内容\'d\' 删除指定行
- 对文件进行增,删,改,查操作
- 打印内容
sed \'\' 1.txt不对文件做任何更改sed \'p\' 1.txt会打印2次每行sed -n \'p\' 1.txt打印文件 打印一次 通常 n p 一起使用sed -n \'2p\' 1.txt打印第二行sed -n \'1,5p\' 1.txt打印一到五行sed -n \'$p\' 1.txt打印最后一行sed -n \'1p\' 1.txt打印第一行
- 增加文件内容
sed \'2ihello world\' 1.txt在文件的第二行上面插入一行hello worldsed \'ihello world\' 1.txt不写是哪一行 默认每一行都执行sed \'3ihello\\nworld\' 1.txt在文件的第三行前插入2行 分别是hello和world 换行符隔开sed \'3i\\hello\\world\\888\' 1.txt和上面效果一样 插入多行sed \'a999\' 1.txt在文件的每一行的下面加一行999sed \'$a999\' 1.txt在文件的最后一行加一行999sed \'2,4a9999\' 1.txt在文件的第二行到第四行 每一行下面都加一行999
- 修改文件内容
sed \'$chell world\' 1.txt替换文件的最后一行为hello worldc整行替换sed \'/^adm/czss\' 1.txt把文件内以adm开头的行整行替换为zsssed \'czss\' 1.txt替换文件内的所有行sed \'1,5czss\' 1.txt将一到五行替换为zss并压缩为一行显示
- 删除文件内容
sed \'4d\' 1.txt删除第四行sed \'1,4d\' 1.txt删除1到4行sed \'d\' a.txt删除所有行sed \'/[0-9]/d\' 1.txt删除包含数字的行sed -r \'/([0-9]{1,3}\\.){3}[0-9]{1,3}/d\' 1.txt删除文件内包含ip的行sed \'$d\' 1.txt删除最后一行
- 对文件进行搜索替换操作
语法
sed 选项 \'s/搜索内容/替换内容/动作\' 需要处理的文件s 表示搜索关键字 search/ 表示分隔符 可以自己定义动作一般是打印p或者全局替换g
sed -n \'s/root/ROOT/p\' 1.txt搜索root替换为ROOT 并显示sed -n \'s/^#//gp\' 1.txt搜索#替换为空 删除#sed -n \'s@/sbin/nologin@/sbin/zss\' 1.txt搜索替换 分隔符可以自定义 搜索内容涉及到/ 选哟转义的 可以用别的分隔符 就不用转义了sed -n \'1,5s/^/#/gp\' 1.txt搜索1-5行行首替换为#sed -n \'s/\\(10.1.1.\\)1/\\1254/gp\' 1.txt搜索10.1.1.1 替换为 10.1.1.254\\(10.1.1.\\) 表示为 \\1
- 其他命令
r 从另外的文件读取内容w 内容另存为& 保存查找串以便在替换串中引用 和\\(\\)相同= 打印行号! 取反 \'1,5!p\'q 退出
sed \'3r /etc/passwd\' 1.txt读取/etc/passwd下的内容放到1.txt的第三行sed \'r /etc/passwd\' 1.txt读取/etc/passwd下的内容放到1.txt的每一行sed \'$r /etc/passwd\' 1.txt读取/etc/passwd下的内容放到1.txt的最后一行sed \'1,5w 11.txt\' 1.tx把1.txt的1到5行保存到11.txt文件里sed -n \'1,5s/^/#/p\' 1.txt把文件的一到5行替换为#开头sed -n \'s/^sync/#&/gp\' 1.txt搜索以sync开头的 并把sync替换为#sync 这里&代表保留了匹配的syncsed -n \'/root/=;/root/p\' 1.txt首先打印行号 再显示匹配的行 用;分割sed -n \'1,5!p\' 1.txt打印除了1-5行的内容sed \'/shutdown/q\' 1.txt匹配到shutdown后退出
- 其他选项
-e 多项编辑-r 扩展正则-i 修改源文件
sed -ne \'/root/p\' 1.txt -ne \'/root/=\'打印匹配root的行 再打印匹配行的行号sed -ne \'/root/=\' -ne \'/root/p\' 1.txt和上面效果差不多sed -e \'5ihello world\' -e \'8a哈哈哈\' 1.txt -e \'/root/=;/zss/=\'在文件的第五行上面插入hello world,在文件的第八行下面插入哈哈哈,显示匹配到对应内容的行号sed -ne \'1p\' -ne \'5p\' 1.txtsed -ne \'1p;5p\' 1.txt打印第一行和第五行grep -Ev \'^#|^$\' 1.txtsed -e \'/^#/d\' -e \'/^$/d\' 1.txtsed \'/^#/d;/^$/d\' 1.txtsed -r \'/^#|^$/d\' 1.txt删除文件内空行 #开头的内容sed -e \'/^#/d\' -e \'/^;/d\' -e \'/^$/d\' -e \'/^\\t$/d\' -e \'/^\\t#/d\' smb.confsed -r \'/^(#|$|;\\t#|\\t$)/d\' smb.conf过滤文件中生效的行grep \'^[^a-z]\' 1.txtsed -n \'/^[^a-z]/p\' 1.txt显示不以字母开头的行grep -E \'([0-9]{1,3}\\.){3}[0-9]{1,3}\' 1.txtsed -nr \'/([0-9]{1,3}\\.){3}[0-9]{1,3}/p\' 1.txtgrep -o -E \'([0-9]{1,3}\\.){3}[0-9]{1,3}\' 1.txtsed -nr \'/([0-9]{1,3}\\.){3}[0-9]{1,3}/p\' 1.txt过滤文件中的ip地址-i 直接修改源文件比较危险 不要加n 和 p 同时使用
- -i 直接修改源文件 比较危险 不要加n 和 p 同时使用
sed结合正则使用
/key/ 查找包含关键字的行/key1/,/key2/ 匹配包含2个关键字之间的行/key/,x 从匹配关键字的行开始到文件第X行之间的行x,/kye/ 从文件的第X行开始到与关键字的匹配行之间的行x,y! 不包含x到y的行/key/! 不包含关键字的行
sed -n \'/root/p\' 1.txt查找包含root的行sed -n \'/^adm/,/^mysql/p\' 1.txt显示在以adm开头的行和以mysql开头的行之间的行sed -n \'/^ftp/,7p\' 1.txt显示以ftp开头的行到文件的第七行sed -n \'/bash$/!p\' 1.txt显示不包含bash$的行sed -nr \'/^lp|^mail/p\' 1.txt显示以lp开头或以mail开头的行
脚本格式
- 用法
# sed -f scropts.sh file或者 ./sed.sh file脚本第一行写#!/bin/sed -f1,5ds/root/hello/g3i77775i8888a999p
- 注意事项
1 脚本文件是一个sed的命令行清单2 在每行的末尾不能有任何空格 制表符 或其他文本3 如果一行中有多个命令 应该用分号隔开4 不需要且不可用引号保护命令5 #开头的行为注释
- 举例
# cat sed.sh#!/bin/sed -f2a\\*************#第二行下面加一行********************2,$s/stu/user/#第二行到最后一行的stu都改为user$a\\i love you#最后一行下面加一行 i love yous/^[a-z].*/#&/#搜索以字母开头的行 前面加#