sed:类似于vim就是一个文本编辑器,按行来进行编辑和排序
grep sed awk:都是针对文本内容进行增删改查,sed可以支持正则表达式,扩展正则表达式
sed的原理:读取,执行,显示
读取:读取文本内容之后,读取到的内容存放到临时的缓冲区—模式空间
执行:在模式空间,根据读取的文本内容,按行执行,除非指定行号,否则会遍历执行,依次执行,从上往下执行
显示:执行完之后,把执行结果打印,如果要改变生效,模式空间被修改的内容会写入到指定的文件中。只是操作,但是不最终写入文件,只展示结果,展示玩之后,模式空间的数据会立即删除。
面试题:sed文本内容处理工具
文件过大怎么办:1、split -l 2、split -b 3、cat 文件名 | 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 ' ' /etc/passwd 或 cat /etc/passwd | sed ' '
sed自己有一个默认输出, p打印会再来一行
-n:禁止sed的默认输出 sed -n 'p' ky30.txt 可以显示一行
sed -n '=' ky30.txt 只输出行号 sed -n 'n;p' ky30.txt 既显示行号也显示内容
sed 打印指定行,寻址打印 sed -n '打印第一行' ky30.txt '$p':直接打印最后一行
行号范围内打印:sed -n '1,3p' ky30.txt 打印第一行到第三行
sed -n '2,$p' ky30.txt 打印第二行到最后一行
sed -n '2p;$p' ky30.txt 打印第二行和最后一行
文本过滤模式:对包含指定字符串的内容进行打印 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的所在行
例2:在/etc/passwd 中过滤出要么是root开头,要么是以bash结尾的所在行
sed -r -n '/^root | bash$p' /etc/passwd
以上为sed的查内容,下面为sed的删内容
第二个面试题:怎么样不进入文件就能删除文件内的内容,即免交互删除
方法一:sed -i 'd' 文件名
方法二:cat /dev/null > 文件名
指定行号进行删除
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替换:
s:替换字符串
c:整行替换
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
l&:转换成小写的特殊符号,在使用时需要转义符 \
u&:转换成大写的特殊符号
g:全部替换,如果不加,只会更改首位字符
整行替换:sed '/abc/c def ' ky30.txt 把abc替换成def
y:单字符替换 sed 'y/12/34/' ky30.txt y用的较少
增加:
a:在下一行添加 i:在上一行添加 r:在行后读入指定文件的内容
sed '/bg/a 123' ky30.txt 在下添加
sed '/bg/i 123' ky30.txt 在上添加
sed '/bg/r ky31.txt' ky30.txt 在bg这行下面添加ky31.txt里面的内容
ky31.txt:要读取内容的文件 ky30.txt:要指定操作的文件
位置交换:
把bg和ky30的位置交换
把ergedagesange按照dage erge sange排序
把123456按654321排序
面试题:查看11.30到12点的日志内容
sed -n '/Jul 20 11:30:01/,/Jul 20 12:00:01/p' var/log/messages
修改网卡地址
sed '/IPADDR=192.168.88.10/c /IPADDR=10.0.0.10/' /etc/......