sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的大同网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
sed的功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
sed基本用法
sed [option]... 'script' inputfile...
sed [选项].. '脚本这个脚本是sed自身的脚本' 处理的文件...
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑:直接修改
sed -i.bak(自己定义) '/^root/aadmin';真的修改文件并备份原文件
script:
'地址命令':地址是对文本中的那个部分进行处理,对那些行进行处理如何进行处理就是根据命令来进行处理的
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/:只显示中间的部分内容
例如:sed -n '/^ftp/,/^sa/p' /etc/passwd
#,/pat1/
(4) ~:步进
1~2 奇数行
seq 10 | sed -n '1~2p'
2~2 偶数行
seq 10 | sed -n '2~2p'
sed -n '2p' /etc/passwd :只打印第2行
sed命令不仅是对文本,还可以把一些命令的标准输出作为输入进行处理
比如:ifconfig eth0 | sed -n '2p'
编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环(sed '2d' /etc/passwd 第二行不显示)
p 打印当前模式空间内容,追加到默认输出之后(本身就会打印加上p之后会在打印一次)
a []text 在指定行后面追加文本,支持使用\n实现多行追加
seq 10 | sed 'axxx':每一行追加xxx
还可以添加换行符:seq 10 | sed 'axxx\nttt\nzzz'
还可以添加换行符:seq 10 | sed '2axxx\nttt\nzzz'
第二行进行追加
i []text 在行前面插入文本:添加斜线表示之后的内容为添加的内容
c []text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
sed -n '/^UUID/r /etc/issue' /etc/fstab:读取文件内容
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
sed '' /etc/passwd :什么都不跟相当与显示一下文件
修改selinux中配置文件
sed -i '/^SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
禁用SElinux
sed -i ^C/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
s///g:查找替换,分隔符自己指定,可为s@@@,s###
替换标记:g,全局替换;i,忽略大小写
高级编辑命令
h:把模式空间中的内容覆盖至保持空间
H:把模式空间中的内容追加至保持空间
g:把保持空间中的内容覆盖至模式空间
G:把保持空间中的内容追加至模式空间
x:把模式空间和保持空间中的内容互换
n:覆盖读取匹配到的行的下一行至模式空间
N:追加读取匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除多行模式空间中的行
在sed语句中强行引用变量
'''var_name''':使用三个’引号在sed语句中可强行引用变量值
例:IP=IP
[root@centos7 test]#ifconfig ens33 | sed -nr 's#.inet (.) net.*#'''$IP''' \1#p'
IP 192.168.0.100
示例:
seq 1 10 | sed -n 'n;p' :取偶数行
seq 1 10 | sed 'n;d' :取奇数行
seq 1 10 | sed '1!G;h;$!d' :逆序显示
seq 1 10 | sed '$!d' :取出最后一行
seq 1 10 | sed '/^$/d;G' :删除文件中的空白行,而後为所有非空白行添加一个空白行
seq 1 10 | sed '$!N;$!D' :显示最后两行
seq 1 10 | sed 'G' :在原有文件的每行后添加一个空白行
sed练习:
练习:统计/etc/init.d/functions文件中每个单词出现的次数,并排序(使用grep和sed两个命令进行实现)
sed -nr 's#[^[:alpha:]]+#\n#gp' /etc/rc.d/init.d/functions | sort |uniq -c |sort -nr
grep -Eo "[[:alpha:]]+" /etc/rc.d/init.d/functions | sort |uniq -c | sort -nr
练习:取出指定网卡的IP地址
ifconfig eth0 |sed -rn '2s/(^.inet )(.)( netmask.*$)/\2/p'
ifconfig eth0|sed -nr '2s/.t (.) net.*/\1/p'
练习:echo /etc/sysconfig/network/ 取出目录名和基名
目录名:echo /etc/sysconfig/network/ | sed -nr 's#(./)([^/].)/?$#\1#p'
基名: echo /etc/sysconfig/network/ | sed -nr 's#(./)([^/].)/?$#\2#p'
练习:将文本文件的n和n+1行合并为一行
n为奇数行:seq 1 10 | sed -n 'N;s#\n##p'
n为偶数行:seq 1 10 | sed -n '1d;N;s#\n##p'