美文网首页Linux试题 总集
第四周day18-三剑客-sed

第四周day18-三剑客-sed

作者: Linux丶晨星 | 来源:发表于2019-04-18 14:36 被阅读20次
    day18-三剑客之sed.png

    三剑客——sed(增删改查)

    我们先来回顾下老三—grep的参数

    grep 过滤
        -i
            不区分大小写
        -v
            取反
        -n
            显示行号
        -o
            显示每次grep匹配到的内容
        -E
            支持扩展正则
            egrep
        -w
            按照单词匹配
        -A
            显示grep找出的内容下几行
        -B
            显示grep找出的内容上几行
        -C
            同时显示grep找出的内天上下几行
        -l
            过滤时只显示文件名 不显示内容
        -R
            递归进行过滤
            grep -Rl 'oldboy'
    

    sed---> stream editor 流编辑器

    p d s c a i 主要的几个参数

    在这里插入图片描述
    https://www.processon.com/view/link/5bea32c5e4b0ad314e894f53
    1.读取文件(从文件或管道)的第1行
    2.读取到sed使用的内存区域中(模式空间)
    3.进行判断这一行是否是我要的

    1.如果是则则执行对应的命令(p d c a i s )
    2.如果不是则读取下一行(注如果没加上-n sed会默认显示这行内容(模式空间内容))

    ※功能——增删改查

    sed的参数
    -n  取消默认输出
    -l  修改文件内容
    -r  支持扩展正则
    -i.bak  先备份文件再修改文件内容
    -e  执行多条命令
    

    sed命令执行过程

    在这里插入图片描述 https://www.processon.com/view/link/5cb7ede9e4b01941c8b13036

    ※我们在练习的时候要先创建好一个环境

    [✡root@oldboy /tmp]# grep -n '.*' lidao.txt
    1:101,oldboy,CEO
    2:102,zhangyao,CTO
    3:103,Alex,COO
    4:104,yy,CFO
    5:105,feixue,CIO
    6:110,lidao,COCO
    \\空行

    查看 p

    ---->print 根据行号进行查找
    ---->'3,6p' 根据行号范围进行查找
    ---->'/oldb.y/p'使用正则进行过滤
    ---->'/102/,/105/p' 使用正则表示范围

    查看第五行
    [✡root@oldboy /tmp]# sed -n '5p' lidao.txt 
    105,feixue,CIO
    
    查看第一行到第五行
    [✡root@oldboy /tmp]# sed -n '1,5p' lidao.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    
    过滤a-z的行,类似grep
    [✡root@oldboy /tmp]# sed -n '/[a-z]/p' lidao.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    找出带有oldboy和yy的行
    第一种方法sed
    [✡root@oldboy /tmp]# sed -rn '/oldbo|yy/p' lidao.txt 
    101,oldboy,CEO
    104,yy,CFO
    第二种方法grep和egrep
    [?root@oldboy /tmp]# grep 'oldboy\|yy' lidao.txt 
    101,oldboy,CEO
    104,yy,CFO
    [?root@oldboy /tmp]# egrep 'oldboy|yy' lidao.txt 
    101,oldboy,CEO
    104,yy,CFO
    
    找到以old开头CFO结尾的行
    [✡root@oldboy /tmp]# sed -n '/old/,/CFO/p' lidao.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    
    以102开头的行和没有的内容,显示102开始到下面所有内容
    [✡root@oldboy /tmp]# sed -n '/102/,/#没有的内容#/p' lidao.txt 
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    

    增加

    ---->a 追加 在指定行后追加内容
    ---->i 追加 插入指定行的上面 
    ---->c 把这一行内容先清空,再写入
    
    给第三行下添加119,SB,UFO(显示临时)  
    [?root@oldboy /tmp]# sed '3a119,SB,UFO' lidao.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    给第三行下永久添加119,SB,UFO
    [✡root@oldboy /tmp]# sed -i '3a119,SB,UFO' lidao.txt 
    [✡root@oldboy /tmp]# cat lidao.txt 
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    在第一行上添加101,oldboy,CEO 
    [✡root@oldboy /tmp]# sed -i '1i101,oldboy,CEO' lidao.txt
    [✡root@oldboy /tmp]# grep '.*' lidao.txt 
    101,oldboy,CEO
    101,oldboy,CEO
    102,zhangyao,CTO
    101,oldboy,CEO
    103,Alex,COO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    
    在源文件第四行下添加120,chenxing,备份一份到当前目录lidao.txt.bak
    [✡root@oldboy /tmp]# sed -i.bak '4a120,chenxing,XOO' lidao.txt 
    [✡root@oldboy /tmp]# ll lidao.txt.bak 
    -rw-r--r-- 1 root root 106 Apr 25 16:00 lidao.txt.bak
    [✡root@oldboy /tmp]# cat lidao.txt.bak  \\备份的文件未添加,在源文件添加了新内容
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    

    删除

    ---->d 删除指定空行 
    
    删除第四行
    [✡root@oldboy /tmp]# sed '4d' lidao.txt
    oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    120,chenxing,XOO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    删除lidao.txt中的空行
    第一种显示空行
    [✡root@oldboy /tmp]# sed -n '/^$/p' lidao.txt
    \\空行
    [✡root@oldboy /tmp]# 
    
    第二种不显示空行
    [?root@oldboy /tmp]# sed -r '/^$/d' lidao.txt
    oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    120,chenxing,XOO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    [?root@oldboy /tmp]# 
    
    第三种取反!
    [✡root@oldboy /tmp]# sed -n '/^$/!p' lidao.txt
    oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    120,chenxing,XOO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    [✡root@oldboy /tmp]# 
    
    第四种awk的方法
    [✡root@oldboy /tmp]# awk '/^$/' lidao.txt  \\显示空行
    
    [✡root@oldboy /tmp]# 
    [✡root@oldboy /tmp]# awk '!/^$/' lidao.txt  \\不显示空行
    oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    120,chenxing,XOO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    [✡root@oldboy /tmp]# 
    
    ↓↓不显示文件/etc/ssh/sshd_config 的空行或以#号开头的行↓↓
    1.egrep
    [✡root@oldboy /tmp]# egrep -v '^$|^#' /etc/ssh/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile  .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication no
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UseDNS no
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem   sftp    /usr/libexec/openssh/sftp-server
    [✡root@oldboy /tmp]# 
    
    2.sed
    [✡root@oldboy /tmp]# sed -nr '/^$|^#/!p' /etc/ssh/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile  .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication no
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UseDNS no
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem   sftp    /usr/libexec/openssh/sftp-server
    [✡root@oldboy /tmp]# 
    
    3.awk
    [✡root@oldboy /tmp]# awk '!/^$|^#/' /etc/ssh/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile  .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication no
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UseDNS no
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem   sftp    /usr/libexec/openssh/sftp-server
    [✡root@oldboy /tmp]# 
    
    4.筛选掉a-Z开头的,空行多的时候不适用
    [?root@oldboy /tmp]# grep '^[a-Z]' /etc/ssh/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key
    SyslogFacility AUTHPRIV
    AuthorizedKeysFile  .ssh/authorized_keys
    PasswordAuthentication yes
    ChallengeResponseAuthentication no
    GSSAPIAuthentication no
    GSSAPICleanupCredentials no
    UsePAM yes
    X11Forwarding yes
    UseDNS no
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    AcceptEnv XMODIFIERS
    Subsystem   sftp    /usr/libexec/openssh/sftp-server
    [?root@oldboy /tmp]# 
    

    替换修改

    ---->s替换
    ---->g全局替换:
    ---->()后向引用在前面(##)把你要的内容保护起来,在后面俩个##之间通过/数字来引用,\1表示显示第一个括号内容

    ※格式

    s#内容#内容#g
    s@内容@内容@g
    s/内容/内容/g
    echo 123456 |sed 's#123456#<123456>#g'
    echo 123456 |sed 's@123456@<123456>@g'

    把oldboy替换为alex
    [?root@oldboy /tmp]# sed 's#oldboy#alex#g' lidao.txt
    alex,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    120,chenxing,XOO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    把oldboy替换为空/删除
    [✡root@oldboy /tmp]# sed 's#oldboy##g' lidao.txt
    ,CEO
    102,zhangyao,CTO
    103,Alex,COO
    119,SB,UFO
    120,chenxing,XOO
    120,XOO
    104,yy,CFO
    105,feixue,CIO
    110,lidao,COCO
    
    
    想要结果是<123456>
    1.
    [?root@oldboy /tmp]# echo 123456 |sed 's#123456#<123456>#g'
    <123456>
    2.
    [✡root@oldboy /tmp]# echo 123456  |sed -r 's#(.)#\1#g'
    123456
    
    显示出12<34>56
    1.
    [?root@oldboy /tmp]# echo 123456  |sed -r 's#(12)(34)(56)#\1<\2>\3#g'
    12<34>56
    2.
    [✡root@oldboy /tmp]# echo 123456  |sed -r 's#(3.)#<\1>#g'
    12<34>56
    
    显示<1><2><3><4><5><6>
    1.
    [✡root@oldboy /tmp]# echo 123456  |sed -r 's#(.)#<\1>#g'
    <1><2><3><4><5><6>
    2.
    [✡root@oldboy /tmp]# echo 123456  |sed -r 's#(.)(.)(.)(.)(.)(.)#<\1><\2><\3><\4><\5><\6>#g'
    <1><2><3><4><5><6>
    
    在这里插入图片描述 https://www.processon.com/view/link/5cb7ede9e4b01941c8b13036

    相关文章

      网友评论

        本文标题:第四周day18-三剑客-sed

        本文链接:https://www.haomeiwen.com/subject/jxqzwqtx.html