Sed
Sed 类似于vim就是一个文本编辑器,按行来进行编辑和排序
Sed的原理:读取,执行,显示
**读取:**读取文本内容之后,读取到的内容存放到临时的缓冲区---模式空间
**执行:**在模式空间,根据读取的文本内容,按行执行,除非指定行号,否则会遍历执行,依次执行,从上往下执行
**显示:**执行完之后,把执行结果打印,如果要改变生效,模式空间被修改的内容会写入到指定的文件中。只是操作,但是不最终写入文件,只展示结果,展示玩之后,模式空间的数据会立即删除。
*面 Sed文本内容处理工具
如文件过大怎么办:
首先split -l 或 split -b 进行切割
cat 文件名 | sed 进行处理
Sed仅适用于中型文件,大型文件还是先分割
Sed
常用选项
sed -e '操作' 文件1 | -e '操作' 文件2
只对一个文件操作,可以不加 -e
- -e:条件操作选项
- -f:指定脚本文件来处理输入的文件内容,把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容
- -i:立即生效,慎用
- -n:显示script处理之后的内(可禁止默认输出)
常用操作符
- s:替换指定的字符
- a:增加,在当前行的下面插入指定内容(操作符要用单引号引起来)
- d:删除指定的行
- i:增加,在当前行的上面插入新的内容
- c:替换整行(用的最多)
- y:替换字符,但是替换前后的字符长度必须一致
- p:打印
- r:使用扩展正则
Sed核心作用就是改,删,增 Sed查功能没有Grep强大
sed -n 'p' ky30.txt 可以显示一行
sed -n '=' ky30.txt 只输出行号
sed -n 'n=;p' ky30.txt 既显示行号也显示内容
Sed 查找过滤
文本过滤模式:对包含指定字符串的内容进行打印
sed -n '/o/p' ky30.txt 所有包含o的行会全部打印
运用基础正则表达式进行打印
sed -n '/^root/p' /etc/passwd 打印以root为开头的行
sed -n '/bash$/p' /etc/passwd 打印以bash为结尾的行
用拓展正则:sed -r -n ' ' /etc/passwd
sed -r -n '/(99:){2}/p' /etc/passwd (99:) :分组 {2}:出现两次 p:打印
打印包含两个99的所在行
在/etc/passwd 中过滤出要么是root开头,要么是以bash结尾的所在行
sed -r -n '/^root | bash$p' /etc/passwd
Sed 删除
指定行号进行删除
sed -n '3d:p' ky30.txt 删除第三行并打印
sed -n '1d;3d;p' ky30.txt 删除第一行和第三行并打印
匹配字符串内容删除
sed '/o/d' ky30.txt 把包含o的内容删除
sed '/big/d' ky30.txt 把包含big的内容删除
sed '/big/!d' ky30.txt 把除了big的行都删除
sed '/one/,/six/d' test.txt 把包含one到six的行都删除并打印剩余行
删除空行
sed '/^$/d' ky30.txt
* 面 免交互删除内容
怎么样不进入文件就能删除文件内的内容,即免交互删除
方法一:sed -i 'd' 文件名
方法二:cat /dev/null > 文件名
Sed 替换
s:替换字符串
c:整行替换
y:单字符替换,注意替换和被替换的两个字符长度要保持一致
l&:转换成小写的特殊符号,在使用时需要转义符 \
u&:转换成大写的特殊符号
g:全部替换,如果不加,只会更改首位字符
y:单字符替换 sed 'y/12/34/' ky30.txt y用的较少
例:
sed -n 's/root/test/p' /etc/passwd 只替换当前行的第一个root
sed -n 's/root/test/2p' /etc/passwd 替换当前行两个root
sed -n 's/root/test/gp' /etc/passwd 把所有root都替换为test
把以root开头的行注释掉
sed -n '/^root/ s/^/#/p' /etc/passwd
字母字符大小写替换
小写替换成大写 sed 's/[a-z]/\u&/g' ky30.txt
大写替换小写 sed 's/[A-Z]/\l&\g' ky30.txt
整行替换
sed '/abc/c def ' ky30.txt 把abc替换成def
*面 查看11.30到12点的日志内容
sed -n '/Jul 20 11:30:01/,/Jul 20 12:00:01/p' var/log/messages