Linux_sed 工具

2018-01-25 14:41:14 6380

sed本身也是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换、删除、新增、选取特定行等的功能。
[root@localhost ~]#  sed  【-nefr】 【动作】
参数;
-n:使用安静(silent)模式。在一般sed用法中,所有来自stdin的资料一般都会被列出到荧幕上,但如果
       加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来。
-e:直接在指令列模式上进行sed的动作编辑。
-f:直接将sed的动作写在一个档案内,-f filename则可以执行filename内的sed动作。
-r:sed的动作支援的是延伸型正规表示法的语法。
-i:直接修改读取的档案内容,而不是由荧幕输出。

常用功能有下面这些参数;
a:新增,a的后面可以接字串,而这些字串会在新的一行出现;(目前的下一行)
c:取代,c的后面可以接字串,这些字符可以替换n1,n2之间的行!
d:删除,因为是删除,所有d后面通常不接任何参数;
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
p:打印,也就是将某个选择的数据打印出来。
s:替换,可以直接进行替换的工作。通常这个s的动作可以搭配正则表达式!列如 1,20s/old/new/g

以行为单位的删除与新增的功能。
新建一个文本文件 abc!
[root@localhost ~]# vim abc
1
2
3
4
5

[root@localhost ~]# nl /root/abc | sed '2,4d'       //删除2~4行,所以显示的数据就没有2~5行。
     1    1
     5    5
[root@localhost ~]# nl /root/abc | sed '2a drink tea'  //在第2行下新增一行
     1    1
     2    2
drink tea
     3    3
     4    4
     5    5
#####如果我想在第2行下新增2行该怎么操作!
[root@localhost ~]# nl /root/abc | sed '2a drink tea....\
> drink beer?'
     1    1
     2    2
drink tea....
drink beer?
     3    3
     4    4
     5    5
每一行必须以反斜杠“/” 来进行新行的新增。

以行为单位的替换与显示功能
[root@localhost ~]# nl /root/abc | sed '2,4c NO 2-5 number'
     1    1
NO 2-5 number
     5    5
通过这个方法我们就可以将数据整行替换了,以前想要列出第11~20行,得通过“head -n 20 | tail -n 10”之类的方法来处理,很麻烦。sed则可以简单直接取出你想要的那几行!
范例:仅列出/etc/passwd 文件内容的第5~7行。
[root@localhost ~]# nl /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
上述命令中有个重要的参数“-n”这个-n代表是“安静模式”那么为什么要使用安静模式,如果不加上-n参数 则/etc/passwd文件内的内容全部显示出来另外5~7会重复出现。

部分数据的查找并替换的功能
除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换功能。

sed ‘s/要被替换的字符串/新的字符串/g’
范例:取得我们本机的IP地址数据。
步骤一:查看源信息,利用ifconfig 查询IP
[root@localhost ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D3:37:5D 
          inet addr:192.168.1.94  Bcast:192.168.1.255  Mask:255.255.254.0
          inet6 addr: fe80::20c:29ff:fed3:375d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54487874 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46062 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:16847411440 (15.6 GiB)  TX bytes:3436366 (3.2 MiB)
步骤二:利用关键字配合grep选取出关键的一行数据
[root@localhost ~]# ifconfig eth0 | grep 'inet addr'
          inet addr:192.168.1.94  Bcast:192.168.1.255  Mask:255.255.254.0
步骤三:将IP前面的部分予以删除
[root@localhost ~]# ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.94  Bcast:192.168.1.255  Mask:255.255.254.0
步骤四:将IP后面的部分予以删除
[root@localhost ~]# ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast:.*$//g'
192.168.1.94

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: