sed命令的介绍和用法

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'


本文名称:sed命令的介绍和用法
文章分享:http://scyanting.com/article/jjhegi.html