文章标题

来源:互联网 发布:bbs网络论坛系统uml 编辑:程序博客网 时间:2024/06/08 18:05
  • 列表内容

sed工具用法总结
sed
sed是一种流编辑器,一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间“,接着用s命令处理缓冲区中的内容,处理完后把缓冲区的内容送往屏幕,然后读入下一行,执行下一个循环。另外,sed还有一保持空间(hold space)可以作为暂时的文本保存区,跟模式空(pattern space)进行交互.
优点是: 流编辑, 方便地从管道(Pipe line)读入文字, 进行文字自动编辑处理.
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
注意:sed并不会改变文件内容,除非你使用重定向存储输出
sed用法
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑
-f 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i.bak 备份文件并原处编辑
script: ‘地址命令’
sed工具可以用于地址定界:
(1)不给地址:对全文进行处理
(2)单地址:#指定的行,/pattern/:被此处模式所能匹配到的每一行
(3)地址范围:#,# (例 2,5 表示第2行到第5行)
或#,+#(例 2,+5 表示第2行到第7行)
/pat1/,/pat2/ (例 /cat/,/pig/ 表示从匹配cat到pig结束)

,/pat1/(例 2,/linux/ 表示从第2行到匹配到linux结束)

(4) ~:步进
1~2 奇数行
2~@ 偶数行
sed用来编辑命令:
d: 删除模式空间中匹配到的行
p: 打印当前模式空间内容,追加到默认输出之后
a []text :在指定行后面追加文本,支持使用\n实现多行追加
i []text:在行前插入文本
c []text :替换行为单行或多行文本
w /path/somedile:保存模式空间的行至指定文件
r /path/somefile :读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理
Sed 工具另外4种选项
s///:查找替换,支持使用其它分割符,s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /path/to/somefile:将替换成功的行保存至文件中
接下来就要介绍一些Sed实例,
首先先介绍一些相对简单一些的实例
sed ‘2p’ /etc/passwd 第二行打印两次输出到屏幕 (sed ” /etc/passwd 和cat /etc/passwd效果一样,sed默认输出到屏幕)
sed -n ‘2p’ /etc/passwd 其中-n是关闭自动输出到屏幕的功能,所以此句命令的作用就是只显示第二行输出到屏幕
sed -n ‘1,4p’ /etc/passwd 同上作用,只显示1到4行输出到屏幕
sed -n ‘/root/p’ /etc/passwd 输出有root的那一行
sed -n ‘2,/root/p’ /etc/passwd 输出从第2行开始到root第一次出现的那一行
sed -n ‘/^/=’ file 显示空行行号  
sed -n -e ‘/^
/p' -e '/^$/=’ file 显示并输出空行并且显示空行行号
sed ‘/root/a\superman’ /etc/passwd 在有root的那一行的行后追加superman,注意是另起一行!!!
这里写图片描述
sed ‘/root/i\superman’ /etc/passwd 在有root出现的那一行的行前追加superman (注意:superman单独另起一行)
sed ‘/root/c\superman’ /etc/passwd 用superman 代替有root的那一整行的内容
如图:
这里写图片描述
命令很多是不是感觉很枯燥,其实如果你理解并掌握这些命令的话下并不会觉得枯燥,反而会觉得很有趣呢,继续介绍sed的用法
sed ‘/^$/d’ file 删除空行
sed ‘1,10d’ file 删除1到10行
nl /etc/passwd |sed ‘2,5d’ 显示行号并且删除第2到5行
nl /etc/passwd |sed ‘2a tea’ 显示行号并且在第二行的行后追加tea
sed ‘s/test/mytest/g’ file 把所有的test替换成mytest
sed -n ‘s/root/&superman/p’ /etc/passwd 在root的后面追加superman默认所有有root的地方都追加
sed -n ‘s/root/superman&/p’ /etc/passwd 同上,在root前追加
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ file 把dog替换成cat 同时把hi替换成lo 注意:用s的时候形式必须是s///,少一个/都不行,会出错
sed -i.bak ‘s/dog/cat/g’ file 源文件被修改,.bak文件是原来文件中的内容
这里写图片描述
sed的简单应用介绍完了,下面开始介绍Sed中的几个高级编辑命令
p: 打印模式空间开端内容至\n内容,并追加到默认输出之前
h: 把模式空间的内容覆盖至保留空间
H:把模式空间的内容追加到保留空间
g:从保留空间取出数据覆盖至模式空间
G:从保留空间取出内容追加到模式空间
x:把模式空间的内容和保留空间的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d;删除模式空间中的行
D:
复杂一些的sed实例
sed -n ‘n;p’ file 显示偶数行
sed ‘n;p’ file 偶数数显示两次
sed ‘1!G;h;!dfilesedn1!G;h;p’ file 倒序显示
sed ‘N;D’ file 只显示最后一行
sed ‘!d’ file 只显示最后一行  
sed ‘G’ file 每行之间加空行  
sed ‘g’ file 把每行内容替换成空行  
sed ‘/^
/d;G’ 确保每一行下面都有空行
这里写图片描述
最后让我们来做一些练习:
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头
的行行首的空白字符
cat grub2.cfg |sed -r ‘s/^[[:space:]]+//’
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空
白字符的行的行首的#和空白字符
sed -r “/^#[[:space:]]/s/^#[[:space:]]+([^[:space:]])/\1/” fstab
sed -r ‘s/^#[[:space:]]+//’ fstab

3、在centos6系统/root/install.log每一行行首增加#号
sed ‘s/^/#/g’ /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号
cat /etc/fstab |sed ‘s/^[^#]/#&/’

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
echo /etc/sysconfig/network-scripts/ |sed -r ‘s#(^/./)([^/]./?$)#a:\1\nb:\2#’

6、利用sed 取出ifconfig命令中本机的IPv4地址
ifconfig eth0 |sed -n ‘2p’ |sed ‘s#^.addr:##g’ |sed ‘s# Bcas.$##g’
ifconfig eth0 |sed -n -e ‘2s#^.addr:##g’ -e ‘s# Bcas.$##gp’

原创粉丝点击