处理文本的工具sed
行编辑器:
sed 是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,我们称为“模式空间”
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕、接着处理以下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
还有一种模式叫做保持空间:sed工作机制是每次读取一行文本至‘模式空间’中,在模式空间中完成处理,将处理结果输出至标准输出设备,在模式空间中处理一行内容后会继续处理下一行,那么对于处理过的行可能还会做其它的处理,因此可以先把处理过的行‘导入’至保持空间中,如果需要后续处理的话,就在次‘导入’模式空间中处理,概念:模式空间就好比厨房,保持空间好比冰箱,厨房用作加工生产,冰箱负责,保存一些半成品材料。
保持空间支持一些高级的命令来运用到保持空间当中 :具体看最下面:高级编辑命令选项
sed用法
sed [选项] 可以跟多个选项 ‘script‘ [源文件] 可以跟多个文本
script: 地址定界编辑命令 ,指明对文本做什么样的操作
常用选项:
sed -n 不输出模式空间中的内容自动打印
例如 ~]# sed -n ‘2p‘ /etc/passwd 加了-n选项只显示出来定义的内容 p显示模式空间中的内容
sed -e scropt1 -e scropt2 -e scropt2 可以进行多点编辑
sed -f /path/to/script_file 从指定的文件中读取脚本并运行
sed -r 支持使用扩展正则表达式
sed -i 直接对源文件进行修改
例如 选项i sed -i.bak ‘10d‘ f1 对源文件操作的时候 做好备份文件
地址定界:抽取的区域
在不给地址的情况下,对全文进行处理
给单地址:
# 表示数字,指定的行
例如 ~]# sed -n ‘1p‘ f1 只显示文本中的第1行
$ 最后一行
例如 ~]# sed -n ‘$p‘ f1 只显示文本中的最后的行
/模式/ 被此处模式所能够匹配到的每一行;可以是正则表达式
例如 ~]# sed -n ‘/root/p‘ /etc/passwd 只匹配带有关键字的搜索内容
地址范围:
#1,#2 从#1行到#2行
例如 ~]# sed -n ‘1,4p‘ /etc/passwd 只显示文本中第1行到第4行的内容
#,+n 从#行开始,一直到向下的n行
例如 ~]# sed -n ‘4,8p‘ f1 只显示文本中第4行开始到文本中第8行的内容
#,/模式/ 从#行开始,到第一次被模式所匹配到的行结束,中间的所有行内容
例如 ~]# sed -n ‘2,/root/p‘ /etc/passwd
/模式1/,/模式2/ 从第一次呗模式1匹配到的行开始,
到第一次被模式2匹配到的行结束,中间所有行内容
~ 步进,指定起始行,以及步长。 1~2 计数行 2-2 偶数行
例如 ~]# sed -n ‘1~2p‘ file1 至显示1的奇数行,1,3,5.....
例如 ~]# sed -n ‘2~2p‘ file1 只显示2的偶数行,2,4,6.....
编辑命令:
d : 删除模式空间匹配的行
例如 ~]# sed ‘4d‘ f1 删除第4行的匹配的行, 不是删除源文件内容,输出删除而已
p : 显示模式空间中的内容
例如 ~]# sed -n ‘4p‘ f1 配合-n选项不输出文本内容为自动打印,p仅显示第4行匹配到的内容
a \text : 在行后面追加文本,支持使用\n换行字符实现多行追加
例如 ~]# sed ‘/^1/a\xiaomage‘ file1 我在开头为数字1的行,追加内容到1之后的行后面
i \text : 在行前面插入文本,支持使用\n换行字符实现多行插入
例如 ~]# sed ‘/^1/i\xiaomage‘ file1 同样,使用i 在开头数字为1的行,追加内容到1之前的行前面
c \text : 替换行为单行或多行文本
例如 ~]# sed ‘/^1/c\xiaomage‘ file1 将字符为1的行,替换成xiaomage内容
w /path/to/somefile 保存模式匹配的行至指定的文件
例如 ~]# sed ‘/^1/w /root/f1 ‘ file1 将字符开头为1的 保存指定的路径下,并命名
r /path/from/somefile 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/正则表达式/替换的位置/
s/// 查找替换,支持使用其他分隔符[email protected]@@,s####
替换标记
g 行内全局替换
p 显示替换成功的行
w w /path/to/somefile 将替换成功的行保存至指定的文件
高级编辑命令:
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式空间
N 追加匹配到的行的下一行至模式空间
d 删除模式空间中的行
D 删除多行模式空间中的行首
注:命令功能可使用!取反, ;分好可用于分隔脚本
练习 1
1 删除/etc/grub2.conf 文件中所有以空白开头的行行首的空白字符
~]# sed -r ‘[email protected]^[[:space:]][email protected]@‘ /etc/grub2.cfg
(命令选项,-r使用扩展表达式,查找替换,分隔符,开头为空白的行 +匹配最少一次,后面跟路径)
2 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
~]# sed ‘[email protected]^#[[:space:]]\[email protected]@‘ /etc/fstab
(命令选项, -r 使用扩展表达式,查找替换分隔符,^开头为#空白符的 匹配前面的字符至少一次)
3 在/root/install.log 每一行行首增加#号
~] # sed -r ‘[email protected](.*)@#\[email protected]‘ /root/install.log
(命令选项,-r使用扩展表达式,s查找替换分隔符以分组.*任意字符\1#g替换分组内匹配到的字符)
~] # sed ‘[email protected]^@#@‘ /root/install.log
(命令选项,s查找替换以^开头为#的字符,后面跟路径)
4 在/etc/fstab 文件中不以#开头的行的行首增加#号
~] # sed ‘[email protected]^[^#]@#&@‘ /etc/fstab
(命令选项,s查找替换开头^[^不以#]中增加#号, 后面跟路径)
5 处理/etc/fstab路径,使用sed 命令取出其目录名和基名
~] #echo /etc/sysconfig/ |sed -r ‘s#[^/]+/?$##‘ 目录名
~] #echo "/etc/fst/sd" | sed -r ‘[email protected](.*/)([^/]+/?)[email protected]\[email protected]‘
6 利用sed 取出ifconfig 命令中本机的ipv4地址
~] #ifconfig|sed -n 2p |sed -e ‘s/.*addr://‘ -e ‘s/ B.*//‘
7 统计 centos 安装光盘中package 目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
~]# ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c