程序员人生 网站导航

linux sed用法

栏目:互联网时间:2015-03-27 08:12:22

sed 是1种在线编辑器,它1次处理1行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下1行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑1个或多个文件;简化对文件的反复操作;编写转换程序等。

sed是1个很好的文件处理工具,本身是1个管道命令,主要是以行动单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解1下sed的用法
sed命令行格式为:
         sed [-nefri] ‘command’ 输入文本        

经常使用选项:
        
-n∶使用安静(silent)模式。在1般 sed 的用法中,所有来自 STDIN的资料1般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那1行(或动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在1个档案内, -f filename 则可以履行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。
       

经常使用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的1行出现(目前的下1行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,由于是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的1行出现(目前的上1行);
         p  ∶列印,亦行将某个选择的资料印出。通常 p 会与参数 sed -n 1起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

举例:(假定我们有1文件名为ab)
     删除某行
     [root@localhost ruby# sed '1d' ab              #删除第1行 
     [root@localhost ruby] # sed '$d' ab              #删除最后1行
     [root@localhost ruby] # sed '1,2d' ab           #删除第1行到第2行
     [root@localhost ruby] # sed '2,$d' ab           #删除第2行到最后1行

  显示某行
.    [root@localhost ruby# sed -n '1p' ab           #显示第1行 
     [root@localhost ruby] # sed -n '$p' ab           #显示最后1行
     [root@localhost ruby] # sed -n '1,2p' ab        #显示第1行到第2行
     [root@localhost ruby] # sed -n '2,$p' ab        #显示第2行到最后1行

  使用模式进行查询
     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
     [root@localhost ruby] # sed -n '/$/p' ab        #查询包括关键字$所在所有行,使用反斜线屏蔽特殊含义

  增加1行或多行字符串
     [root@localhost ruby]# cat ab
     Hello!
     ruby is me,welcome to my blog.
     end
     [root@localhost ruby] # sed '1a drink tea' ab  #第1行后增加字符串"drink tea"
     Hello!
     drink tea
     ruby is me,welcome to my blog. 
     end
     [root@localhost ruby] # sed '1,3a drink tea' ab #第1行到第3行后增加字符串"drink tea"
     Hello!
     drink tea
     ruby is me,welcome to my blog.
     drink tea
     end
     drink tea
     [root@localhost ruby] # sed '1a drink tea or coffee' ab   #第1行后增加多行,使用换行符
     Hello!
     drink tea
     or coffee
     ruby is me,welcome to my blog.
     end

  代替1行或多行
     [root@localhost ruby] # sed '1c Hi' ab                #第1行代替为Hi
     Hi
     ruby is me,welcome to my blog.
     end
     [root@localhost ruby] # sed '1,2c Hi' ab             #第1行到第2行代替为Hi
     Hi
     end

  替换1行中的某部份
  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)
     [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby

     插入
     [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后1行直接输入"bye"
     [root@localhost ruby]# cat ab
     Hello!
     ruby is me,welcome to my blog.
     end
     bye


数据的搜索并显示

搜索 /etc/passwd有root关键字的行

复制代码
nl /etc/passwd | sed '/root/p' 1 root:x:0:0:root:/root:/bin/bash 1 root:x:0:0:root:/root:/bin/bash 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:2:2:bin:/bin:/bin/sh 4 sys:x:3:3:sys:/dev:/bin/sh 5 sync:x:4:65534:sync:/bin:/bin/sync ....下面疏忽
复制代码

如果root找到,除输出所有行,还会输出匹配行。

 

使用-n的时候将只打印包括模板的行。

nl /etc/passwd | sed -n '/root/p' 1 root:x:0:0:root:/root:/bin/bash

 

数据的搜索并删除

删除/etc/passwd所有包括root的行,其他行输出

nl /etc/passwd | sed '/root/d' 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:2:2:bin:/bin:/bin/sh ....下面疏忽 #第1行的匹配root已删除

 

 

 

数据的搜索并履行命令

找到匹配模式eastern的行后,

搜索/etc/passwd,找到root对应的行,履行后面花括号中的1组命令,每一个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'  1  root:x:0:0:root:/root:/bin/blueshell

如果只替换/etc/passwd的第1个bash关键字为blueshell,就退出

nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 1 root:x:0:0:root:/root:/bin/blueshell

最后的q是退出。

 

数据的搜索并替换

除整行的处理模式以外, sed 还可以用行动单位进行部份数据的搜索并取代。基本上 sed 的搜索与替换的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'

 

先视察原始信息,利用 /sbin/ifconfig 查询 IP

[root@www ~]# /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略).....


本机的ip是192.168.1.100。

 

将 IP 前面的部份予以删除

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部份,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部份予以删除

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100

 

多点编辑

1条sed命令,删除/etc/passwd第3行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' 1 root:x:0:0:root:/root:/bin/blueshell 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-e表示多点编辑,第1个编辑命令删除/etc/passwd第3行到末尾的数据,第2条命令搜索bash替换为blueshell。

 

 

直接修改文件内容(危险动作)


sed 可以直接修改文件的内容,没必要使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随意拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!

利用 sed 将 regular_express.txt 内每行结尾若为 . 则换成 !

[root@www ~]# sed -i 's/.$/!/g' regular_express.txt

 

利用 sed 直接在 regular_express.txt 最后1行加入『# This is a test』

[root@www ~]# sed -i '$a # This is a test' regular_express.txt

由於 $ 代表的是最后1行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!

sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来讲,如果你有1个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!由于文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你乃至不需要使用 vim 去修订!

 

参考 http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex_2.php#sed

       http://www.cnblogs.com/stephen-liu74/archive/2011/11/17/2245130.html


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐