上古神器之vim

sed

前言:前面学到了文本处理三剑客之一grep,但是grep在有些时候显得力不从心,我们需要一款针对行操作的处理工具,没错,这就是sed流编辑器。


sed.png


sed用法提炼:
sed 's/(text1)(text2)(text3)/\1\2\3/'




 vim

前言:强大的Linux如果没有一款疯狂的编辑器,常用的编辑操作会不会力不从心?今天本文介绍的就是上古神器vim的各种操作,尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用,可见其经典与受欢迎程度。另外,由于 Vim 的可配置性非常强,各种插件、语法高亮配色方案等多不胜数,无论作为代码编辑器或是文稿撰写工具都非常给力……

vim.png


vim之此处文档dilimiter

vim编辑器需要用户传递各种编辑参数和编辑内容,使用输入重定向将参数传递给vim编辑器,结合特定组合键,就能完成编辑操作。有如下脚本

#!/bin/bash
vim /tmp/text <<EOF             #创建文件/tmp/text,设置文本开始标识,等待参数传入
i                               #进入插入模式
The first line                  #编辑文本
The second line                 
^[                              #特殊组合键,Ctrl+v-->ESC 回到命令行模式
ZZ                              #保存文件且退出
EOF
----------------------------------
Vim: 警告: 输入不是来自终端(键盘)
The first line
The second line                                                                 
                                                                    
"/tmp/text" [新] 4L, 33C 已写入                                                                                                                                        
[root@ _209_ ~]#

虽然实现了把数据写入文件,但还是不推荐这种写法,不过需要接受参数的命令,可以借鉴类似的做法。

 


vim小试牛刀

1、如何设置tab缩进为4个字符

:set tabstop=4

 2、复制/etc/rc.d/init.d/functions文件至/tmp目录;替换/tmp/functions文件中的/etc/sysconfig/init为/var/log

[root@ _2_ ~]# cp /etc/rc.d/init.d/functions /tmp
[root@ _3_ ~]# vim /tmp/functions
:%s@/etc/sysconfig/init@/var/log@g
3 次替换,共 3 行
...
if [ -f /var/log ]; then
      . /var/log
  else
    # This all seem confusing? Look in /var/log,
...

 3、删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号

~]# vim /tmp/function
:%s@^#\([[:space:]]\+.*\)@\1@g

 A sed expression to filter out the files that is_ignored_file recog
nizes
__sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmori
g\|\.rpmsave\)$/d'
if [ "$_use_systemctl" = "1" ]; then

 4、复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符

[root@ _4_ ~]# cp /etc/profile /tmp/
[root@ _5_ ~]# vim /tmp/profile 
:%s/^[[:space:]]\+//g
if [ "${-#*i}" != "$-" ]; then 
. "$i"      
else    
. "$i" >/dev/null
fi      
fi  
done
unset i
unset -f pathmunge
33 次替换,共 33 行

 5、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号

[root@ _7_ ~]# cp /etc/init.d/functions /tmp/functions 
[root@ _8_ ~]# vim /tmp/functions
:%s/^[[:space:]].*/#&/

#                "x$1" = xforce-reload -o \
#                "x$1" = xcondrestart ] ; then
#               systemctl_redirect $0 $1
#               exit $?
#       fi
fi
443 次替换,共 443 行

 

sed大展身手


6、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符

[root@ _11_ ~]# sed -r 's/^[[:space:]]+(.*)/\1/' /etc/grub2.cfg

7、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

删除前:
[root@ _8_ ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 22:27:09 2016
删除后:
[root@ _7_ ~]# sed -r 's/^#[[:space:]]+(.*)/\1/' /etc/fstab
#
/etc/fstab
Created by anaconda on Tue Jul 19 22:27:09 2016
#
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

8、在/root/install.log每一行行首增加#号

[root@ _12_ ~]# sed 's/.*/#&/' initial-setup-ks.cfg
##version=DEVEL
## X Window System configuration information
#xconfig  --startxonboot
## License agreement
#eula --agreed
## System authorization information

9、在/etc/fstab文件中不以#开头的行的行首增加#号

[root@ _13_ ~]# sed -e 's/^[^#].*$/#&/' -e 's/^$/#&/' /etc/fstab
#
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 22:27:09 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#UUID=a7717433-0d0f-4126-8eff-2e41361cea79 /

10、处理/etc/fstab路径,使用sed命令取出其目录名和基名

取目录名:
    echo "/etc/fstab" |sed -r 's#[^/]+/?$##g'|sed -r's#(.+)/#\1#'
    /etc
取基名:
    [root@ _55_ ~]# echo "/etc/fstab/" |sed -r 's#/#\n#g'|sed -rn -e "/^[^[:space:]]/p"|sed  -n '$p'
    fstab
一起取:
    [root@ _160_ ~]# echo "/etc/fstab" |sed -r "s#(.*/)([^/]+/?$)#\1#"
                                                                  \2

11、利用sed 取出ifconfig命令中本机的IPv4地址

[root@ _164_ ~]# ifconfig|sed -n '2p' |sed -r 's/.*inet (.*) netmask.*/\1/'
192.168.33.200

12、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

[root@ _187_ ~]# ls /mnt/Packages/ |sed -n '/.rpm$/p'|sed -r 's/.*\.([^\.]+)\.rpm$/\1/'|sort|uniq -c
   2000 i686
   2938 noarch
   4069 x86_64

原创文章,作者:M20-1--孔祥文,如若转载,请注明出处:http://www.178linux.com/32452

(0)
M20-1--孔祥文M20-1--孔祥文
上一篇 2016-08-12 14:45
下一篇 2016-08-12 14:45

相关推荐

  • 文件查找(Find和Locate)常用用法及摩根定律趣解(重要)

    文件查找(Find和Locate)常用用法及摩根定律趣解(重要) 摩根定律: 非(A 且 B)=(非 A)或(非 B) 非(A 或 B)=(非 A)且(非 B) 这样看起来不是很好理解下面通过一些列图片给大家展示; 图(1)  图(2)  图二中的黑色就A且B,A且B的反面三种情况(如图1)即为(非A)或(非B)。因此…

    Linux干货 2016-08-21
  • 文本编辑器—sed

    一、sed介绍 sed 一种流式编辑器。一个流式编辑器通常对来自输入流(一个文件或者是管道的输入)的文本进行转换处理。在某些方面类似支持脚本编辑的编辑器,sed在多输入情况下只开放一个通道工作,因此更加效率。sed与其他编辑器最大的区别在于,能对管道输入的文本进行过滤处理。 二、sed工作机制 sed保持两个数据缓冲区:主要活动的模式空间,以及辅助性的保持空…

    Linux干货 2016-08-12
  • GRUB管理

    对于运维人员来说,想要熟练掌握linux,那么久要对linux的启动流程有一个详细的了解,而今天我们就一起来学习一下linux启动中最重要的一个阶段——GRUB引导阶段。 Linux启动流程 grup: GRand Unified Bootloader  由上图可知,grub属于系统启动过程中一个必须的阶段。而这个阶段又分为了三个小的阶段,分别是s…

    2017-09-02
  • 分布式存储介绍、FastDFS 部署

    什么是分布式系统? 简单来说,多台主机提供同一个服务,例如负载均衡集群,就是一个分布式系统。 什么是分布式存储? 看看某宝,上面多少图片,如果使用传统的单机存储,需要准备多大的磁盘空间?读写性能如何提升? 上图就是一个分布式存储的结构,此处存储节点不在是磁盘,而是多个主机组成,多个主机内部通信实现数据副本,客户端发来的请求发往前端,前端分发至后端,有点像负载…

    2017-03-08
  • date命令常见用法。

    date是一个非常实用的小工具,可以查看时间,并且也可以添加选项去完成自己想完成的东西。

    Linux干货 2017-11-13
  • 一个开发眼中的运维

    在云计算时代,开发和运维的结合变得越来越重要。在DIFF论坛第一期,前新浪SAE运维主管,郑志勇,分享了《一个开发眼中的运维》根据自己从开发人员转型运维之后的心得,谈如何把在开发上的运用抽象思维方式运用到运维领域。 1. 运维不是什么? 运维不是打杂的,运维不是客服,运维也不是服务开发的,但要做好合作。 2. 运维是什么? 运维服务于整个产品,保证架构合理,…

    Linux干货 2015-03-11