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/ /"

 

posted @ 2017-08-28 20:59  Linuxbugs  阅读(788)  评论(0编辑  收藏  举报