sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。
sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出stdout。sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。想要修改文件需要使用-i参数。
#语法格式:
sed [选项] [sed内置命令字符] [输入文件]
sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。
sed中的-n参数:
前面提到,sed 会将模式空间里的行经过处理后输出到标准输出,这是默认的处理方式。也就是说,除非使用“d”来删除此行,否则经过“模式空间”处理的行都是会被输出到标准输出上。-n选项会很严肃地警告 sed 命令:除非是明确表明要输出的行,否则不要胡乱输出。-n选项经常和 p 配合使用,其含义就是,输出那些匹配的行。
sed命令的参数选项:
sed的内置命令字符可用来实现对文件的不同操作功能,例如对文件的增删改查等
sed -n '2,3p' test.txt #输出test.txt第2-3行的内容
sed -n '/zhangsan/p' test.txt #过滤出含有zhangsan字符串的行
sed '/zhangsan/d' test.txt #删除含有zhangsan字符串的行,sed命令的删除功能(d字符),默认不会修改文件,如果需要修改文件,则要用-i参数配合。
sed -i '3d' test.txt #删除第3行
sed -i '5,8d' test.txt #删除5-8行
sed 's#zhangsan#lisi#g' test.txt #(g表示全局替换)将文件中的zhangsan字符串全部替换为lisi,sed命令的替换功能,默认不会修改文件,如果需要修改文件,则要用-i参数配合。
sed -e 's#zhangsan#lisi#g' -e 's#123456#654321#g' test.txt #sed命令的-e参
数,多项编辑功能。
sed -i '2a hello' test.txt #第2行后追加文本
sed -i '2i test' test.txt #第2行后插入文本
sed '/[a,f]/w new.txt' test.txt #过滤test.txt中含a,f的行写入new.txt
sed配合正则表达式的企业案例
#显示网卡信息
ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.80.100 netmask 255.255.255.0 broadcast 192.168.80.255
inet6 fe80::b6e7:a5be:2dd8:daf prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:59:be:80 txqueuelen 1000 (Ethernet)
RX packets 3588 bytes 247101 (241.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1267 bytes 163374 (159.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#获取网卡信息中的ip地址
ifconfig ens33|sed -n '2s#^.*inet##gp'|sed -n 's#netm.*$##gp' #使用多次管道
ifconfig ens33|sed -ne '2s#^.*inet ##g' -ne '2s#netm.*$##gp' #使用-e完成多次处理
ifconfig ens33|sed -nr '2s#^.*inet (.*) netm.*$#\1#gp' #-r表示支持扩展的正则表达式,支持正则中的小括号