sed
类似于vim,是一个文本编辑器,但是sed是按行来编辑和处理
主要作用:对文本内容进行增删改查,较为强大的就是改操作
注:可以支持正则表达式,也可以支持扩展正则表达式,但不完全依赖正则表达式
sed的工作原理
包括三个过程:读取-执行-显示
读取:读取文本内容后,会把读取到的内容存放到一个临时的缓冲区(模式空间)
执行:在模式空间,根据读取的文本内容,按行执行,除非指定行号,否则会遍历所有行。依次执行,从上往下执行。
显示:执行完成之后,把执行结果打印,如果要改变生效,模式空间被修改的内容会写入到指定文件当中。如果只是操作,但是
最终不写入文件,只展示结果,展示完成之后,模式空间的数据会立即删除
sed格式和常用选项
sed -e '操作符' 文件1 -e '操作符' 文件2
只对一个文件操作时可不加 -e
常用选项:
-e:条件操作选项
-f:指定脚本文件来处理输入的文件内容。把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容。
-i:立即生效 慎用!!
-n:显示script处理之后的结果(禁止sed的默认输出)
操作符:需要用单引号''
s:替换 替换指定的字符
d:删除,删除指定的行
a:增加,在当前行的下面插入指定内容
i:增加,在指定行的上面插入指定的内容
c:替换,整行替换
y:替换,替换字符,但是替换前后的字符长度必须一致。
p:打印 (sed默认有输出)
r:使用扩展正则
sed的操作
sed查功能
sed打印指定行,寻址打印
sed -n ‘4p’ 文件名 #打印第四行
sed -n ‘$p’ 文件名 #直接打印最后一行
方式二:行号的范围区间打印
sed -n '1,3p' 文件名 #打印第一行到最第三行
sed -n '2,$p' 文件名 #打印第二行到最后一行
sed -n '2p;$p' 文件名 :打印第二行到第最后一行
行号范围打印: ,到;和
打印奇数行和偶数行:
sed -n 'n;p' 文件名 (n在前就是跳过第一行,n在后就是跳过第二行)
文本过滤模式:
第一:对包含指定字符串的内容进行打印:
sed -n ’/o/p‘ 文件名
sed -n ’/big/p‘ 文件名 #将所有包含big的行,会全部打印出来
应用基础正则表达式进行打印:
sed -n ‘/^root/p’ /etc/passwd #打印以root为开头的行
sed -n ‘/bash$/p’ /etc/passwd #打印以bash为结尾的行
sed删除
指定行号进行删除:
sed -n '3d;p’文件名 #删除第三行的内容,并打印剩余内容。
sed -n ‘1d;3d;p’ 文件名 #删除第一行和第三行的内容,并打印剩余内容。
sed -n ‘1d,3d;p’ 文件名 #删除第一行到第三行的内容,并打印剩余内容。
(,表示到;表示和)
sed ‘/big/d’ 文件名 #匹配字符串内容(big)进行删除
sed ‘/o/!d’ 文件名 #匹配字符串内容(o),除了o以外都进行删除
使用正则表达式进行删除:
sed ‘/^$/d’ 文件名 #删除空行
sed的替换(重点!!)
s 替换字符串:
sed -n 's/root/test/p' /etc/passwd #把当前行的第一个root替换成test
sed -n 's/root/test/gp' /etc/passwd #把当前行所有root替换成test
字母字符大小写进行替换:
l&:转换成小写的特殊符号,再使用时,需要转义符。
u&:转换成大小的特殊符号,在使用时,需要转义符
g:全部替换,如果不加,只替换首字母
sed 's/[a-z]/\u&/' 123.txt
c 整行替换:
sed '/要替换的行/c 需要替换的内容' 文件名
y单字符替换:
sed ‘y/’
sed的增加
a 在下一行添加:sed '/指定行/a 添加的内容' 文件名
i 在上一行添加:sed '/指定行/i 添加的内容' 文件名
r在行号读入指定文件的内容(在行后进行添加):
sed '/原文件当前行下/r 要读取内容的文件 ' 指定操作的文件
查看指定时间内的日志:
sed -n '/Jul 20 18:36:12/,/Jul 20 18:50:01/p' /var/log/messages
面试题
1.文件过大该怎么办?
法1:split -l 按行来切割来处理(适用于大型文件)
法2:cat 文件名 | sed 处理 (适用于中型文件)
2.怎么样不进入文件就可以删除文件当中的内容(即免交互删除)
法1:sed -i 'd' 文件名
法2:cat /dev/null >文件名