前言:
如果一个运维工程师做不到随心所欲的按照自己的意愿玩弄文本的话,那他就不是一个合格的运维工程师,我们在文本处理方面追求的就是一种掌控感。在写shell的时候经常会遇到与空格、空行相关的内容,这样的操作本不是重要内容,但是如果写的不熟练的话,会就影响自己写shell的情绪,不管做啥事,是怕的就是心态炸了!
前一段时间看到一本书叫《扫除道》,就是讲如何打扫卫生的一本书,里面一个核心观念就是将周围打扫的非常干净,形成一种正气,这样是非常有利于自己要做的大事的,正所谓“一屋不扫何以扫天下”,这几天是体会到了。所以特意写一篇博客,总结一下LINUX下与空格、空行相关的操作,尽量做不到不让这样的小事耽误自己要做的大事。
1、删除一行当中的所有空格,只留下字符
[root@centos7 ~]# ifconfig ens33 | sed -n 2p inet 192.168.80.200 netmask 255.255.255.0 broadcast 192.168.80.255 [root@centos7 ~]# ifconfig ens33 | sed -n 2p | tr -d ' ' inet192.168.80.200netmask255.255.255.0broadcast192.168.80.255
解释:
题目是删除一行当中的所有空格,我们如果仅删除一行当中的某些东西,最好是使用tr了,tr有一个-d的选项,后面跟上空格,可以直接把一行当中所有空格给干掉!
2、替换一行当中开头空格为空,后面文本当中的字符和空格不变。
ifconfig ens33 | sed -n 2p inet 192.168.80.200 netmask 255.255.255.0 broadcast 192.168.80.255 ifconfig ens33 | sed -n 2p | sed 's/^[ \t]*//' inet 192.168.80.200 netmask 255.255.255.0 broadcast 192.168.80.255
解释:
s///这种格式没没啥好说的,sed替换的标准语法格式
^[ \t]是什么意思呢?^表示开头,中括号里面的空格是一个空格和一个TAB,表示开头是开发或者TAB,最后个*表示一次或者多次。
注意:最后一个sed默认仅是操作第一行,也就是说,如果操作的内容有多行的话,请加上全局替换符g,也就变成了这样:
ifconfig ens33 | sed -n 2p | sed 's/^[ \t]*//g'
其实从一个人写命令的方式当中也可以看出一个人的性格,我们以取出网卡的IP地址为例:
第一种风格:强劲霸道,遇神杀神。
ifconfig ens33 | sed -n 2p | sed 's@^[ \t]*@@' | cut -d' ' -f2192.168.80.200
解释:第三个命令就是把一行当中的开头空格或者TAB给替换掉,替换掉直接直接使用cut切。其实用这样写命令的人一开始就打算了以cut用空格为分隔符切,但是开头的空格阻碍了这样的操作,于是强行干掉开头的空格,以完全以cut的意愿。
第二种风格:灵活变通
ifconfig ens33 | sed -n 2p | awk -F' ' '{print $2}'
3、将完全空白行(直接回车形成的行)压缩成一行。
我们以将取出系统当中所有网卡的名字为例。
解释一下:cut -c -6意思是取出输出的前6个字符,后面连续两个sed都是替换掉没用的显示,但最后的结果当中里面有很多的空行,而且这些空行有一个部分是真的空行,还有一部分空行是有空格的,我们如果将所有的连续空行压缩成一个空行的话暂时是不行的,就因为有部分空格并不是真空行。所以,我们需要将不是真空行的空行变成真空行,怎么做呢?先把里面所有的空格给删除了,然后再进行压缩空行,如下所示:
ifconfig | cut -c -6 | sed 's@fl@@g' | sed 's@:@@g' | tr -d ' ' | tr -s '\n'
ens33
lo
virbr0
解释:tr -d ''是删除文本当中所有的空格,tr -s '\n'是压缩连接的空行成一个空行。
ifconfig | cut -c -6 | sed 's@fl@@g' | sed 's@:@@g' | sed 's@[[:space:]]@@g'| tr -s '\n'
ens33
lo
virbr0
解释:tr -d ' '是删除文本当中所有空格,而sed 's@[[:space:]]@@g'起到的作用与tr -d ' '是一样的。
4、替换行尾的空格为空
sed 's/[ \t]*$//g'
解释:与第二个例子类似,只不过将行首的锚定,替换成了行尾的锚定。
5、总结
空白行类:
- 删除真空行用sed的全局删除选项:sed '/^$/d' <文件>
- 删除假空行:: sed '/^[ \t]*/d' <文件>
- 将所有的真空行行压缩成一行:tr -s '\n' <文件>
空格类:
- 删除所有空格:tr -d ''和sed 's@[[:space:]]@@g'的效果是一样的。
- 删除行首的空格:sed 's@^[ \t]*@@' <文件>
- 删除行尾的空格:sed 's@[ \t]*$@@' <文件>