当前位置: 首页 > news >正文

Linux集群和自动化维2.4.1 sed的基础语法格式

2.4.1 sed的基础语法格式


sed的语法格式如下所示:

sed [-nefr] [n1,n2] 动作

其中:

-n是安静模式,只有经过sed处理过的行才会显示出来,其他不显示。

-e表示直接在命令行模式上进行sed的操作。貌似是默认选项,不用写。

-f将sed的操作写在一个文件里,用的时候 -f filename 就可以按照内容进行sed操作了。

-r表示使sed支持扩展正则表达式。

-i表示直接修改读取的文件内容,而不是输出到终端。

n1,n2表示选择要进行处理的行,不是必需的。10,20表示在10~20行之间处理。

sed格式中的动作支持如下参数。

a:表示添加,后接字符串,添加到当前行的下一行。

c:表示替换,后接字符串,用它替换n1到n2之间的行。

d:表示删除符合模式的行,它的语法为sed '/regexp/d',//之间是正则表达式,模式在d前面,d后面一般不接任何内容。

i:表示插入,后接字符串,添加到当前行的上一行。

p:表示打印,打印选择的某个数据,通常与-n(安静模式)一起使用。

s:表示搜索,还可以替换,类似于vim里的搜索替换功能。例如:“1,20s/old/new/g”表示将1~20行的old替换为new,g在这里表示处理这一行所有匹配的内容。

动作最好用' '括起来,防止因空格导致错误。

sed的基础实例如下(下面的所有实例在CentOS 6.4 x86_64下已通过,这里提前将/etc/passwd拷贝到/tmp目录下)。

1)显示 passwd内容,将2~5行删除后显示,命令如下所示:

cat -n /tmp/passwd |sed '2,5d'

     1   root:x:0:0:root:/root:/bin/bash

     6   sync:x:5:0:sync:/sbin:/bin/sync

     7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8   halt:x:7:0:halt:/sbin:/sbin/halt

     9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11  operator:x:11:0:operator:/root:/sbin/nologin

    12  games:x:12:100:games:/usr/games:/sbin/nologin

    13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

    14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    15  nobody:x:99:99:Nobody:/:/sbin/nologin

    16  vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

    17  saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    20  puppet:x:52:52:Puppet:/var/lib/puppet:/sbin/nologin

    21  ntp:x:38:38::/etc/ntp:/sbin/nologin

    22  nagios:x:500:500::/home/nagios:/bin/bash

    23  apache:x:48:48:Apache:/var/www:/sbin/nologin

    24  nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin

2)在第2行后面的一行加上“Hello,world”字符串,命令如下所示:

cat -n /tmp/passwd |sed '2a Hello,world'

显示结果如下所示:

     1   root:x:0:0:root:/root:/bin/bash

     2   bin:x:1:1:bin:/bin:/sbin/nologin

Hello,world

     3   daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4   adm:x:3:4:adm:/var/adm:/sbin/nologin

     5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6   sync:x:5:0:sync:/sbin:/bin/sync

     7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8   halt:x:7:0:halt:/sbin:/sbin/halt

     9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11  operator:x:11:0:operator:/root:/sbin/nologin

    12  games:x:12:100:games:/usr/games:/sbin/nologin

    13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

    14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    15  nobody:x:99:99:Nobody:/:/sbin/nologin

    16  vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

    17  saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    20  puppet:x:52:52:Puppet:/var/lib/puppet:/sbin/nologin

    21  ntp:x:38:38::/etc/ntp:/sbin/nologin

    22  nagios:x:500:500::/home/nagios:/bin/bash

    23  apache:x:48:48:Apache:/var/www:/sbin/nologin

    24  nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin

3)在第2行后面一行加上两行字,例如:“this is first line!”和 “this is second line!”,命令如下所示:

cat -n /tmp/passwd |sed '2a This is first line! \   //使用续航符\后按回车输入后续行

> This is second line!'     // 以' 再回车结束

显示结果如下所示:

     1   root:x:0:0:root:/root:/bin/bash

     2   bin:x:1:1:bin:/bin:/sbin/nologin

This is first line!

This is second line!

     3   daemon:x:2:2:daemon:/sbin:/sbin/nologin

     4   adm:x:3:4:adm:/var/adm:/sbin/nologin

     5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6   sync:x:5:0:sync:/sbin:/bin/sync

     7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8   halt:x:7:0:halt:/sbin:/sbin/halt

     9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11  operator:x:11:0:operator:/root:/sbin/nologin

    12  games:x:12:100:games:/usr/games:/sbin/nologin

    13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

    14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    15  nobody:x:99:99:Nobody:/:/sbin/nologin

    16  vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

    17  saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    20  puppet:x:52:52:Puppet:/var/lib/puppet:/sbin/nologin

    21  ntp:x:38:38::/etc/ntp:/sbin/nologin

    22  nagios:x:500:500::/home/nagios:/bin/bash

    23  apache:x:48:48:Apache:/var/www:/sbin/nologin

    24  nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin

4)将2~5行的内容替换成“I am a good man!”,命令如下所示:

cat -n /tmp/passwd | sed '2,5c I am a good man!'

显示结果如下所示:

     1   root:x:0:0:root:/root:/bin/bash

I am a good man!

     6   sync:x:5:0:sync:/sbin:/bin/sync

     7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

     8   halt:x:7:0:halt:/sbin:/sbin/halt

     9   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11  operator:x:11:0:operator:/root:/sbin/nologin

    12  games:x:12:100:games:/usr/games:/sbin/nologin

    13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

    14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    15  nobody:x:99:99:Nobody:/:/sbin/nologin

    16  vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

    17  saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

    18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    20  puppet:x:52:52:Puppet:/var/lib/puppet:/sbin/nologin

    21  ntp:x:38:38::/etc/ntp:/sbin/nologin

    22  nagios:x:500:500::/home/nagios:/bin/bash

    23  apache:x:48:48:Apache:/var/www:/sbin/nologin

    24  nginx:x:498:499:nginx user:/var/cache/nginx:/sbin/nologin

5)只显示5~7行,注意p 与-n的配合使用,命令如下所示:

cat -n /etc/passwd |sed -n '5,7p'

显示结果如下所示:

     5   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     6   sync:x:5:0:sync:/sbin:/bin/sync

     7   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

6)使用ifconfig列出IP,我们只想要eth0的IP地址,因此可以先用ifconfig eth0查看网卡eth0的地址,命令如下所示:

ifconfig eth0

显示结果如下所示:

eth0      Link encap:Ethernet  HWaddr 00:16:3E:7F:67:C3 

          inet addr:192.168.1.207  Bcast:192.168.1.255  Mask:255.255.255.0

          inet6 addr: fe80::216:3eff:fe7f:67c3/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:11168717 errors:0 dropped:0 overruns:0 frame:0

          TX packets:83863 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:659653034 (629.0 MiB)  TX bytes:36972729 (35.2 MiB)

          Interrupt:24

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:34 errors:0 dropped:0 overruns:0 frame:0

          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:2716 (2.6 KiB)  TX bytes:2716 (2.6 KiB)

我们可以先用grep 取出有IP的那一行,然后用sed去掉(替换成空)IP前面和后面的内容,命令如下所示:

ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

命令显示结果如下所示:

172.30.171.35

这里解释下这行组合命令:

grep 后面紧跟"inet addr"是为了单独捕获包含IPv4的那行内容;'^.*addr:' 表示从开头到addr:的字符串,将它替换为空;'Bcast.*$' 表示从Bcast到结尾的串,也将它替换为空,然后就只剩下IPv4地址。

另外一种更简便的方法是使用awk,命令如下所示:

ifconfig eth0 | grep "inet addr:"|awk -F[:" "]+ '{print $4}'

命令显示结果如下所示:

192.168.1.207

awk -F[:" "]的意思就是以“:”或空格符作为分隔符,然后打印出第4列,这里有些朋友可能会有疑惑:为什么不直接以如下方法来获取IP呢:

ifconfig eth0 | grep "inet addr:" | awk -F: '{print $2}'

大家可以看下结果,得出的结果是:

192.168.1.207  Bcast

所以还需要再进行一步操作,如下:

ifconfig eth0 | grep "inet addr:" | awk -F: '{print $2}' | awk '{print $1}'

希望大家通过这个例子好好总结一下sed的经典用法,第二种方法其实是awk的方法,awk也是一种优秀的编辑器,现多用于截取文本字段的列。

7)在/etc/man.config中,将有man的设置取出,但不要说明内容。命令如下所示:

cat /etc/man.config |grep 'MAN'|sed 's/#.*$//g'|sed '/^$/d'

显示结果如下所示:

MANPATH   /usr/man

MANPATH   /usr/share/man

MANPATH   /usr/local/man

MANPATH   /usr/local/share/man

MANPATH   /usr/X11R6/man

MANPATH_MAP  /bin            /usr/share/man

MANPATH_MAP  /sbin                /usr/share/man

MANPATH_MAP  /usr/bin      /usr/share/man

MANPATH_MAP  /usr/sbin           /usr/share/man

MANPATH_MAP  /usr/local/bin          /usr/local/share/man

MANPATH_MAP  /usr/local/sbin   /usr/local/share/man

MANPATH_MAP  /usr/X11R6/bin        /usr/X11R6/man

MANPATH_MAP  /usr/bin/X11           /usr/X11R6/man

MANPATH_MAP  /usr/bin/mh       /usr/share/man

MANSECT         1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

注意,#不一定要出现在行首。 因此,/#.*$/表示#和后面的数据(直到行尾)是一行注释,将它们替换成空。/^$/ 表示空行,后接d 表示删除空行。

删除空行不能用替换方法,因为空行替换成空后,还是有换行符在那一行中。

以上就是sed的几种常见的语法命令,希望大家结合下面的实例,多在自己的机器上演练,以尽快熟练掌握其用法。

相关文章:

  • [周鸿祎] 与其苟且活着,不如奋起抗争
  • 机器人系统设计与制作:Python语言实现3.3 本章小结
  • VC6 ODBC 例子 之二
  • 【STM32 .Net MF开发板学习-21】蓝牙遥控智能小车(PC模式)
  • 《众妙之门——移动交互体验设计》一1.2 物物互联
  • jQuery Timers插件
  • 《嵌入式Linux基础教程(第2版)》——2.3 存储
  • 程序员的一天
  • 看反病毒专家对EICAR检测代码的专业解读
  • 写一个每秒接收 100 万数据包的程序究竟有多难?
  • PHP性能杂谈
  • ET工业大脑 将大规模落地江苏
  • 警惕一大波银行类木马正在靠近,新型BankBot木马解析
  • 《软技能:代码之外的生存指南》一一11.4 切断脐带
  • 《Ext JS实战》——1.4 Ext JS 3.0的新特性
  • “大数据应用场景”之隔壁老王(连载四)
  • CentOS6 编译安装 redis-3.2.3
  •  D - 粉碎叛乱F - 其他起义
  • DataBase in Android
  • Docker: 容器互访的三种方式
  • docker容器内的网络抓包
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • go语言学习初探(一)
  • httpie使用详解
  • Javascript Math对象和Date对象常用方法详解
  • STAR法则
  • 阿里云应用高可用服务公测发布
  • 百度小程序遇到的问题
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 给第三方使用接口的 URL 签名实现
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 区块链将重新定义世界
  • 回归生活:清理微信公众号
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • "无招胜有招"nbsp;史上最全的互…
  • # 飞书APP集成平台-数字化落地
  • #、%和$符号在OGNL表达式中经常出现
  • #include到底该写在哪
  • $.ajax()方法详解
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (175)FPGA门控时钟技术
  • (Forward) Music Player: From UI Proposal to Code
  • (MATLAB)第五章-矩阵运算
  • (二)Linux——Linux常用指令
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (十八)三元表达式和列表解析
  • (一)Dubbo快速入门、介绍、使用
  • (转)Scala的“=”符号简介
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net多线程总结
  • .NET连接数据库方式
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)