文本处理三剑客: grep:egeep,fgrep:文本过滤器 sed:stream Editor:流编辑器,逐行 awk:文本格式化工具,报告生成器
一、sed简介
sed一次从文件中读取一行,不会修改原文件的内容
sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行)
sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。
处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。
放在sed的工作空间:pattern space 处理-->模式匹配-->匹配(则编辑->根据编辑命令是否输出) //不匹配(stout)
输出到-->stout
可以基于正则表达式进行文本过滤
把文件的
文件行数据流:--->|pattern space| //默认显示没有匹配到的行
v
/ \
No Yes
| / \
| / edit
| / |
V/ Hold space
stdout
//sed空间:空间可以转换
pattern space
hold space //处理的结果
sed [option] ... ‘script‘ [input-file]... //输入文件可以有多个
script:地址定界+编辑命令
OPtions:
-n ,--quiet,--slient不输出模式空间的内容到屏幕
suppress:压制,不让
-e script, --expression=script //默认只有一个script,实现多点编辑
-f script-file //脚本文件,每行一个编辑命令
-r 支持扩展的正则表达式
-i 直接编辑原文件
地址定界:
1.空地址,表示对全文进行处理
2.单地址,
# :指定行
/pattern/ :被此模式匹配到的每一行
3.地址范围
#,# //起始地址
#,+# //向后几行
#,/pattern/ //到pattern模式匹配结束
/pat1/,/pat2/ //斜线是默认的,必须有
4.步进:~
1~2 //所有的奇数行
2~2 //所有的偶数行
编辑命令:
d 删除模式空间的内容
sed ‘/^UUID/d‘ /etc/fstab //删除uuid开头的行
sed ‘3d‘ /etc/fstab //删除第3行
sed ‘1~2d‘ /etc/fstab //显示偶数行,删除奇数行
p 打印模式空间的内容
sed ‘1~2p‘ /etc/fstab //模式空间显示两遍,
//偶数行没有被匹配,因此显示
//奇数行被匹配到,默认为显示
//edit后的操作是显示
sed ‘1~2p‘ /etc/fstab -n //只显示奇数行,模式空间的内容
a\test 追加 :在模式匹配到的行,下一行追加文本,支持使用,\n实现多行追加
后面追加
i\test:在行前面插入文本,支持使用\n实现多行插入
sed ‘3i \new line‘ fstab.t //不匹配到的行,默认也为输出
sed ‘3a \new line\nanother line‘ fstab.t //插入两行
sed ‘/UUID/a \# add new device base on UUID‘ fstab.t //在每一行的UUID前面都加了信息
c\text:把匹配到的行替换为此处指定的文本"text";
主要: "/" 和 "\" 都可以使用
w /PATH/TO/SOMEWHERE :保存模式空间匹配到的行至指定的文件中
sed -n ‘/^[^#]/w /tmp/fsatb.test‘ fstab //把非#开头的行,保存到文件
r /PATH/TO/SOMEFILE :读取指定文件的内容到当前文件被模式匹配到的行中
sed ‘3r /etc/issue‘ fstab //在3行,读入issue的内容
sed ‘/dev/r /etc/issue‘ fstab //匹配到的行,都读入issue文件内容
= 为模式空间匹配到的行,打印行号
sed ‘/dev/=‘ fstab
! 条件取反
sed ‘/^#/!d‘ /etc/fstab //模式取反
s/// :查找替换,其分隔符可自行指定,常用的分隔符,s##,[email protected]@,s///等
替换标记:
g:全局替换
w /PATH/TO/SOMEFILE:保存到指定文件
p:显示替换成功的行
二、练习
1.删除/boot/grub/grub2.cfg文件中所有以空白开头的行的行首的所有空白字符
2.删除/etc/fstab文件中所有以#开头的行的行首的#号以及#号后面的空白字符
3.输出一个绝对路径,取出其目录,其行为类似于dirname
1.sed ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/grub2.cfg
2.sed ‘[email protected]^#[[:space:]]*@@‘ /etc/fstab
sed ‘[email protected]^#[[:space:]]*@@‘ -e ‘/^UUID/d‘ /etc/fstab
3.echo "/var/log/messages" | sed ‘[email protected][^/]\[email protected]@‘
echo "/var/log/messages/" | sed ‘[email protected][^/]\+/\[email protected]@‘ //基本的正则表达式,\?需要转义:可有可无
echo "/var/log/messages/" | sed -r ‘[email protected][^/]+/[email protected]@‘ //扩展的正则表达式
三、高级编辑命令
h H Copy/append pattern space to hold space. p->h
g G Copy/append hold space to pattern space. h->p
g:get
大写的为追加,小写的为复制
x:把两组空间互换,exchange
n N Read/append the next line of input into the pattern space.
d 删除模式空间中的行
D:删除多行模式空间中的行
示例:
sed -n ‘n;p‘ /etc/fstab //显示偶数行,n为下一行,分号用于分割命令
sed ‘1!G‘ /etc/fstab //除了第一行,都追加一行空白
sed ‘1!G;h;$!d‘ /etc/fstab
//覆盖模式空间到hold空间,最后一行不删除,其他都删除{删除模式空间的第几行}
//逆序显示文件内容
sed ‘$!d‘ /etc/fstab //不是最后一行就删除
sed ‘$!N;$!D’ file //只显示最后两行
$!N //不是最后一行,追加下一行到模式空间
倒数第二行,追加最后一行后结束
$!D //不是最后一行,都删除,
倒数第二行的时候,追加的是最后一行,所以不删除
sed ‘/^$/d;G‘ /etc/fstab //删除原有的所有空白行,而后为所有的非空白行,后添加一个空白行
sed ‘n;d‘ file //显示奇数行
sed ‘G‘ file //在每行后都追加一个空白行
sed -i ‘/^UUID/d‘ fstab //在原有的文件上修改
注意:任何时候,删除和修改的时候,先备份