sed:stream editor,行编辑器
sed命令工作原理:它在处理数据时,每次只处理一行,首先把当前处理的行存储在临时缓冲区中,我们称这个缓冲区称为“”模式空间“,接着用sed命令处理缓冲区中的内容,处理完后,把缓冲区中的内容送到屏幕上显示出来,接着去处理下一行,重复执行,直到至末行,这里需要注意的是我们没有编辑原文件,原文件不会改变,当然我们也可以通过相关命令来编辑原文件。
sed的主要功能:查找匹配到的文本打印出来,替换匹配到的文本,编辑文本等
前面我们提到的grep也是针对行的操作的,也可以查找匹配到需要的内容,那么他们有什么区呢?grep:文本搜索工具,根据用户指定的模式来对文本逐行匹配检查,打印到匹配到的行,只能搜索不能编辑,-v和-o的功能与sed中的替换功能类似。
在使用sed处理行时需要注意:如果说要去掉行中的某一部分内容或者是某删除某部分内容,我们只能使用替换方法处理,因为sed时针对行编辑的,d选项操作会删除整行。
sed选项:
-n:不输出模式空间中的内容;默认情况下默认打印所有文本,也会打印我们匹配到的内容
root@cenots6.8 ~ # sed '1p' /etc/issue CentOS release 6.8 (Final) CentOS release 6.8 (Final) Kernel \r on an \
root@cenots6.8 ~ # sed -n '1p' /etc/issue CentOS release 6.8 (Final)
-r:支持扩展正则表达式
-e:支持多点编辑
root@cenots6.8 ~ # sed -n -e '1p' -e '1p' /etc/issue CentOS release 6.8 (Final) CentOS release 6.8 (Final)
a\:在匹配到的行的下一行添加内容
root@cenots6.8 ~ # sed '1a\I am here' /etc/issue CentOS release 6.8 (Final) I am here Kernel \r on an \m
i\:在匹配到的行的上一行添加内容
root@cenots6.8 ~ # sed '1i\I am here' /etc/issue I am here CentOS release 6.8 (Final) Kernel \r on an \
c\:把匹配到的行替换为你需要的内容
root@cenots6.8 ~ # sed '1c\I am here' /etc/issue I am here Kernel \r on an \m
w:把匹配到的内容覆盖到指定的文件中。。。。注意 覆盖 覆盖 覆盖。。。。。
root@cenots6.8 ~ # sed '1w /testdir/FA' /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m root@cenots6.8 ~ # cat /testdir/FA CentOS release 6.8 (Final)
r:把文件中的内容输入到匹配到的行的下一行
root@cenots6.8 ~ # sed '1r /testdir/FA' /etc/issue CentOS release 6.8 (Final) aaaaaaaaaaaaaaaaaaaaaa Kernel \r on an \
=:在匹配到的行显示行号
root@cenots6.8 ~ # sed '2=' /etc/issue CentOS release 6.8 (Final) 2 Kernel \r on an \
!:模式空间中匹配行取反处理
root@cenots6.8 ~ # cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m root@cenots6.8 ~ # sed '1!d' /etc/issue CentOS release 6.8 (Final) root@cenots6.8 ~ # sed '1d' /etc/issue Kernel \r on an \m
&:匹配到的字符
root@Centos7.2 ~ # sed -n 's@root@&superman@p' /etc/passwd ----&superman 在匹配到的单词后加superman rootsuperman:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/rootsuperman:/sbin/nologin root@Centos7.2 ~ # sed -n 's@root@superman&@p' /etc/passwd ----&superman 在匹配到的单词前加superman supermanroot:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/supermanroot:/sbin/nologin
s///:查找替换,支持使用正则表达,也可以将///替换为@@@
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
sed高级用法:
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:追加匹配到的行的下一行至模式空间
d: 删除模式空间中的行
D:删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
应用示例
sed -n 'n;p' FILE #显示偶数行 sed '1!G;h;$!d' FILE #倒序显示 sed '$!N;$!D' FILE #显示最后两行 sed '$!d' FILE #只显示最后一行 sed ‘G’ FILE #每一行的后面加一个空行 sed ‘g’ FILE #将每行用空行替换 sed ‘/^$/d;G’ FILE #删除所有空行后,在行后追加空行 sed 'n;d' FILE #显示基数行 sed -n '1!G;h;$p' FILE #倒序排序
练习:
1、替换/etc/inittab文件中“id:3:initdefault:”一行中的数字为5
sed 's@\(id:\)[0-9]\(:initdefault:\)@\110000\2@' /etc/inittab
2、删除/etc/init.d/functions 文件中的空白行
sed "/^$/d" /etc/init.d/functions
3、删除/etc/inittab 文件中的空白行
sed "s@^#@@g" /etc/inittab
4、删除/etc/rc .d/rc.sysinit文件中以#后面跟至少一个空白符开头的行的行首的#和空白字符
sed "s@^#[[:space:]]\+@@g" /etc/rc.d/rc.sysinit
5、删除/boot/grub/grub.conf文件中行首空白字符
sed "s@^[[:space:]]\+@@g" /boot/grub/grub.conf
6、取出一个文件路径的目录名称,如/etc/sysconfig/network,
echo "/etc/sysconfig/network" |sed "s@/.*/@@g" --basename echo "/etc/sysconfig/network" | sed 's@[^/]\+/\?$@@g' --dirname echo "/etc/fst/sd" | sed -r 's@(.*/)([^/]+/?)$@\2@'
7、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
sed -e "s@^[[:space:]]\+@@g" -e "/^$/d" /etc/grub2.cfg
8、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
sed 's@^#[[:space:]]\+@@g' /etc/fstab
9、在/root/install.log每一行行首增加#号
sed -r 's@(^.*$)@#\1@g' /root/install.log sed "s@\(.*\)@#\1@g" /root/install.log
10、在/etc/fstab文件中不以#开头的行的行首增加#号
sed -r 's@(^[^#].*)@#\1@g' /etc/fstab sed "s@\(^[^#].*\)@#\1@g" /etc/fstab
11、处理/etc/fstab路径,使用sed命令取出其目录名和基名
echo "/etc/fstab/" | sed -r 's@(.*/)([^/]+/?)$@\2@' echo "/etc/fstab/" | sed 's@[^/]\{1,\}/\?$@@
12、利用sed 取出ifconfig命令中本机的IPv4地址
ifconfig|sed -n 2p |sed -r 's/.*addr:(.*) Bca.*/\1/' ifconfig|sed -n 2p |sed -e 's/.*addr://' -e 's/ B.*//'
13、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
cd /run/media/naruto/CentOS\ 7\ x86_64/Packages/ ls *.rpm |sed -r 's#.*\.(.*)\.rpm$#\1#'|sort |uniq -c ls *.rpm |rev |cut -d. -f2 |rev|sort |uniq -c
14、正则表达式表示身份证号
egrep "\<((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|(71|81|82))([0-9]){4}(19|20)([0-9]){2}((0[1-9])|(1[0-2]))(0[1-9]|([0-9])|(2[0-9])|(3[0-1]))([0-9]){3}([0-9]|X)\>" filename
15、正则表达式表示手机号
grep -E -o "(\+86)?1[38][0-9]{9}|14[57][0-9]{8}|15[0-35-9][0-9]{8}|17[0678][0-9]{8}" haoma
16、正则表达式表示邮箱
egrep "\<([[:alnum:]]+(-|_)*[[:alnum:]]*)\>@([[:alnum:]]+\.)+[[:alnum:]]+" mail grep -E -o '[a-zA-Z0-9]+[[:alnum:]\.\_-]*@[a-zA-Z0-9]+[[:alnum:]\.\_-]*' haoma
17、正则表达式表示QQ号
grep -E -o '\b[1-9][0-9]{4,12}\b' haoma
原创文章,作者:Naruto,如若转载,请注明出处:http://www.178linux.com/32235