1.文本处理三剑客-sed
#sed语法: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed理解:是一种流编辑器,一次处理一行内容,处理时把当前处理的行存储在临时缓存中,成为“模式空间”,接着用sed命令处理缓冲区的内容,处理完毕后吧缓冲区内容输出到屏幕接着处理下一行。这样不断重复到末尾。文件内容并没有改变。除非使用重定向输出才会改变内容。
常用选项
-n 不输出模式空间到屏幕 -e 多点编辑,或 -f 从指定文件中读取编辑脚本 -r 使用扩展表达式 -i 原处编辑
2.sed处理地址范围定界:
1. 不给地址表示对全文处理
2. 单地址 指定行 ‘1‘ 第一行 ;
/ 关键字,可以是正则表达式或其他模糊匹配的符号/
3. 地址范围
‘2,10‘第二行到第十行
’2,+10‘第二行再加10行
/关键字/,/关键字/匹配第一个关键字到第二个关键字之间的内容 ;
4. 步进
’1~2‘奇数行
’2~2’偶数行
3.sed编辑命令
d 删除模式空间匹配到的行
[[email protected] testdir]# sed ‘1d‘ 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jul 28 17:47:00 2016
p 显示模式空间中的内容
[[email protected] ~]# sed ‘2p‘ /etc/issue \S Kernel \r on an \m Kernel \r on an \m
显示两次的原因因为在模式空间输出一次然后p显示一次,加上-n是表示不输出模式空间到屏幕,如下输出
[[email protected] ~]# sed ‘2p‘ /etc/issue \S Kernel \r on an \m
a \添加内容 在匹配行后加入文本 \n多行插入
#实例解释 [[email protected] testdir]# sed -e /UUID/a\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e /UUID/i\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ file1 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jul 28 17:47:00 2016 5 # 6 # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘ 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 /dev/mapper/centos-root / xfs defaults 0 0 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 10 UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot xfs defaults 0 0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
i \添加内容 在匹配行后加入文本 \n多行插入
#实例解释 [[email protected] testdir]# sed ‘/^U/i\ZZZZZZZZZZZZZZZZZZZZZ\nNNNNNNNNNNNNNNNNNNNNNN\nssssssssssssssss‘ file3 #输出结果 ZZZZZZZZZZZZZZZZZZZZZ NNNNNNNNNNNNNNNNNNNNNN ssssssssssssssss UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot
c \替换内容 替换单行或多行文本
#实例解释,也支持\n换行 [[email protected] testdir]# sed ‘/^U/c\relace‘ file3 #将以U打头的行替换成‘relace’
w /保存新文件路径
[[email protected] testdir]# sed ‘/^U/w /testdir/5‘ file3
r /保存文件路径
[[email protected] testdir]# sed ‘/^U/r /etc/issue‘ file3
= 在模式空间中打印行号
[[email protected] testdir]# sed ‘/^U/=‘ file6
!模式空间匹配到的取反
[[email protected] testdir]# sed ‘/^U/!=‘ file6
#ps:sed文件出是不修改原文件内容的,如果要修改可以使用选项-i
[[email protected] testdir]# sed -i ‘/^U/d‘ 3
修改之前可以将文件进行备份,在-i选项后面添加备份名可以在修改之前备份该文件
[[email protected] testdir]# sed -i.bak ‘/^U/d‘ 3
4.sed搜索替换
s/// 查找替换 支持使用分割符包括[email protected]@@,s### 替换标记; g:全局替换 p:显示替换成功的行 w 将替换成功的行保存至新文件
#实例操作解释 #1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符 [[email protected] testdir]# sed ‘/^[[:space:]]\+/d‘ /etc/grub2.cfg #2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符 [[email protected] testdir]# sed ‘s/^#[[:space:]]\+//‘ /etc/fstab #3、在/root/install.log每一行行首增加#号 [[email protected] ~]# sed -n ‘s/^/#/p‘ /root/install.log #4、在/etc/fstab文件中不以#开头的行的行首增加#号 [[email protected] ~]# sed ‘s/^[^#]/#/‘ /etc/fstab #5、处理/etc/fstab路径,使用sed命令取出其目录名和基名 取基名 echo "/etc/fst/sd" | sed -r ‘[email protected](.*)/([^/]+/?)@\[email protected]‘ echo "/etc/fst/sd" | sed -r ‘[email protected](.*/)([^/]+/?)[email protected]\[email protected]‘ echo "/etc/fst/sd/" | sed ‘[email protected]*\<@@‘ 取目录 echo "/etc/fst/sd/" | sed -r ‘s#[^/]+/?$##‘ #6、利用sed 取出ifconfig命令中本机的IPv4地址 [[email protected] ~]# ifconfig|sed -n ‘2p‘|sed ‘s/\<B.*//‘|sed ‘s/^.*r:‘// #7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数 [[email protected] Packages]# ls |sed ‘s/.rpm$‘//|sed ‘s/.*\.‘//|sort|uniq -c
5.sed高级应用
首先要了解使用sed两个缓存空间,一个是模式空间,在前面已经说过了
另一个是保持空间
下面几个是sed的高级应用
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:追加匹配到的行的下一行至模式空间
d: 删除模式空间中的行
D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
#实例解释以后补充