sed命令基础2
我在sed命令基础里面说了一下sed的基础用法,sed还有一些高级用法,由于我也是在学习中,写的博客可能会有想不到的地方,有问题希望大家指出。
sed的高级用法主要在于两个空间的使用,模式空间和保持空间,模式空间就是我们对于进入其中的语句进行处理的空间,保持空间就像是一个临时的交换swap,我们可以将模式空间里面的东西放到保持空间中,或者将保持空间里面的东西取出追加到模式空间,通过一定的命令,将两个空间里面的东西进行处理,能解决很多文本处理问题。
高级编辑命令
P:打印模式空间开端至\n内容,并追加到默认输出之前
x:把模式空间中的内容与保持空间中的内容进行互换
h:把模式空间中的内容覆盖到保持空间中
H:把模式空间中的内容追加到保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出数据追加至模式空间
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加到模式空间
d:删除模式空间中的行
D:删除模式空间中从开始到第一个\n
一些示例
sed -n 'n;p' FILE 显示偶数行
sed '1!G;h;$!d' FILE 倒序显示
sed -n '1!G;h;$p' FILE 倒序显示
sed 'N;D' FILE 显示最后一行
sed '$!N;$!D' FILE显示最后两行
sed '$!d' FILE 显示最后一行
sed 'G' FILE 给每一行后面加一空行
sed 'g' FILE 所有行替换成空行
sed '/^$/d;G' FILE 保证让每一行非空行后面都有一个空行
sed 'n;d' FILE 显示奇数行
相关的练习(基础部分的多)
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'
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
ls /mnt/cdrom/Packages/ | sed -r -e "s/(.*\.)([^\.].*$)/\1/" -e "s/(.*\.)([^.].*\.)/\2/" | sort | uniq -c | sort -n
8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
cat /etc/init.d/functions | sed -r "s/[^[:alpha:]]/\n/g" | sort | uniq -c | sort -n
cat /etc/init.d/functions | egrep -o "[[:alpha:]]+" | sort | uniq -c | sort -n
9、将文本文件的n和n+1行合并为一行,n为奇数行
seq 10 | sed "1~2N;s/\n/ /"