sed用法,sed变量

3)、sed篇
     3.1)sed基础
        p 打印匹配行

        = 打印文件行号

        a\ 在指定的文件后追加文本 例如:sed '/root/a\hello' passwd

        i\ 在定位行号之前插入内容信息(insert)

        d  删除文本

        -i.bak   源文件自动备份为“源文件名.bak”

        c\ 用新文本替换匹配的行  eg sed '/nologin/c\hello' /etc/passwd #以nologin的行替换为hello

        n或--quiet  #安装模式

        e   #多个模式同时匹配 例如: sed -n -e '/root/p' -e '/root/=' /etc/passwd

        $   #在正则表达式中表示行尾,在sed中表示最后一行 例如:sed -n '$p' passwd

        !   #表示取反 例如: sed -n '1,10!p' passwd #打印非1-10行

        /pattern/,x 和 x,/pattern/ #定义行号与关键字匹配行之间的范围 例如:sed -n '/root/,$p' passwd #匹配/root/到最后一行内容

        r   从一个文件中读文件

        w   将文本写入到一个文件

        [root@localhost home]# aa="(:0.0)"
        [root@localhost home]# echo $aa | sed -e 's/[()]//g' 
        :0.0

        [root@class14 ~]# sed -n '1p' /etc/passwd  #加了-n选项不打印所有行
        root:x:0:0:root:/root:/bin/bash

        [root@class14 ~]# sed -n '1,3p' /etc/passwd 
        root:x:0:0:root:/root:/bin/bash
        bin:x:1:1:bin:/bin:/sbin/nologin
        daemon:x:2:2:daemon:/sbin:/sbin/nologin

        [root@class14 ~]# sed -n '/root/p' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        operator:x:11:0:operator:/root:/sbin/nologin

        [root@class14 ~]# sed -n '/root/=' /etc/passwd #打印匹配行的行号
        1
        11

        [root@class14 ~]# sed  -n -e '/root/=' -e '/root/p' /etc/passwd 
        1
        root:x:0:0:root:/root:/bin/bash
        11
        operator:x:11:0:operator:/root:/sbin/nologin

        sed带多个编辑命令需要携带-e选项
        sed [选项] -e 编辑命令1 -e 编辑命令2 -e 编辑命令3  输入文件

        [root@class14 ~]# sed -n '$p' pass #打印最后一行
        adm:x:3:4:adm:/var/adm:/sbin/nologin

        sed '1,10d' pass  #删除pass文件中的1-10行

        @@@@@@@@@@@@
        -n 与 -p 相结合使用只打印匹配行
        @@@@@@@@@@@@
        [root@class16 ~]# sed  -n 's/root/JACK/gp' passwd 
        JACK:x:0:0:JACK:/JACK:/bin/bash
        [root@class16 ~]#
        ++++++++++++++++++++++++++++++++++++++++++++++++++++++

        [root@class16 ~]# sed -n 's/root/ROOT/gw aab' passwd 
        [root@class16 ~]# more aab
        ROOT:x:0:0:ROOT:/ROOT:/bin/bash
        [root@class16 ~]# 
        ++++++++++++++++++++++++++++++++++++++++++++++++++
         &符号可用来保存被替换的字符串以供调用.
        sed -n 's/root/(&)/pg' pass
        sed -n 's/root/(root)/pg' pass

        [root@class16 ~]# sed -n 's/root/(&)/pg' passwd 
        (root):x:0:0:(root):/(root):/bin/bash
        [root@class16 ~]# 
        [root@class16 ~]# 
        [root@class16 ~]# sed -n 's/root/(root)/pg' passwd 
        (root):x:0:0:(root):/(root):/bin/bash
        ##################################################
        利用sed写入到一个新文件
        sed -n '1,5 w /root/ab' /etc/passwd  #将/etc/passwd前5行写入到/root/ab

        sed '/root/r ab' passwd #将ab文件读入到passwd的root行前.
        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        sed -n -e '/root/p' -e '/root/=' /etc/passwd
        等价于
        sed -n  '/root/{p;=}' /etc/passwd
        等价于
        sed -n '/root/p;/root/=' /etc/passwd
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        处理匹配行的下一行:
        sed '/root/{n;s/x/jack/;}' /etc/passwd

        sed缓冲区的处理:
        sed -e '/root/h' -e '/root/x' -e '$G' /etc/passwd

        h和H: 模式缓冲区内容替换保持缓冲区内容,
              h是将保持缓冲区的旧内容覆盖掉副本,
            H是追加,在保持缓冲区旧内容上增加新内容

        g和G: 保持缓冲区内容替换模式缓冲区内容,G是追加,
               g是副本

        ###########################################
        如何在shell下切换用户执行命令?

        [plain] view plaincopy在CODE上查看代码片派生到我的代码片
        su - dev -c "ls"  
        ?
        "su -"切换用户,并且当前目录页切换到相应用户的根目录。
        "dev"是用户名
        "-c"后面接需要执行的shell comman
        例如:
        su - oracle -c "cat >>/etc/profile<<!export ORACLE_HOME=/u01/app/oracle!"

        +++++++++++++++++++++++++++++++++++++++++
        sed利用变量上下文
        案例一:匹配含有listen的行
        #!/bin/bash
        aa=listen
        sed -n '/'"$aa"'/p' /root/named.conf
        使用变量只用加上一个双引号就行.
        sed -i.bak '8 s/@/'"$aa"'/g'


        例如:
        sed -i.bak '/root/p' passwd #将源文件重命名为.bak文件结尾,生成一个以源文件命名的文件

        sed '36 r a.txt' named.conf #在36行插入文本a.txt内容
        sed -n 's/root/ROOT/p' /etc/passwd #将root替换为ROOT并且显示到屏幕


        cat passwd
        aaaaaaJACKccccccddddee
        aa = 5
        sdgalgdl
        bb = 6

        将空格使用[[:spance:]]来代替
        sed -i "s#aa[[:space:]]=[[:space:]]5#abc = 50#g" passwd

        zoer@ubuntu:~$ cat data  
        here is a   
        test naughty loves cc  
        and so on....  
          
        zoer@ubuntu:~$ cat dd  
        testline1  
        testline2  

        zoer@ubuntu:~$ sed '/naughty/r dd' data  
        here is a   
        test naughty loves cc  
        testline1  
        testline2  
        and so on....  
        上面的命令匹配naughty这个单词并且在该行的下一行开始插入dd文件的内容。

     3.2)sed变量
       1、sed命令使用双引号的情况下,可以使用$var(变量)直接引用:
           echo | sed "s/^/$RANDOM.rmvb_/g"
           13562.rmvb_

       2、sed命令使用单引号的情况下,可以使用'"$var"'引用(单引号,然后双引号,变量):
           echo | sed 's/^/'"$RANDOM"'.rmvb_/g'
           2442.rmvb_
         
       3、sed中执行外部命令。
         sed命令使用单引号的情况下使用'`shell command`'或者'$(shell command)'引用命令执行的结果:
           echo | sed 's/^/'`echo $RANDOM`'.rmvb_/g'
           7700.rmvb_# 结果

         # 上面的命令使用了旧式的命令替换,也可以采用新式的命令替换方法,如下:
           echo | sed 's/^/'$(echo $RANDOM)'.rmvb_/g'
           13856.rmvb_# 结果

         # 下面例子取用当前日期作为结果的一部分,如下:
           echo | sed 's/^/'$(date +"%Y%m%d")'.rmvb_/g'
           20130401.rmvb_ # 结果
         
       2、sed命令中使用双引号的情况下,直接`shell command`或者$(shell command)引用命令执行。
           echo | sed "s/^/$(date +"%Y%m%d").rmvb_/g"
           20130401.rmvb_# 结果

         # 使用环境变量$RANDOM以及旧式命令替换的例子:
           echo | sed "s/^/`echo $RANDOM`.rmvb_/g"
           29484.rmvb_# 结果

 

posted @ 2023-04-05 14:17  vmsysjack  阅读(711)  评论(0)    收藏  举报