zoukankan      html  css  js  c++  java
  • 三剑客之二 Sed小记

    sed            #增删改查均可,主要是替换

    格式: sed      找谁(过滤的内容)        干啥(对过滤到的内容做的动作)
     
    参数选项:
    -n       #取消默认输出
    -r        #支持扩展正则
     
    1.过滤内容p      print
     
    *sed按行操作,默认会逐行读取执行,每一条都会输入到屏幕,执行到3p时在输出一次所以就会显示2次
     
    [root@web01 ~]# sed '3p' 2.txt
    root oldboy good
    stundent oldboy
    oldboy
    oldboy
    oldgirl root
    dog cat
    oldboy
    ROOT
    old
     
     
    [root@web01 ~]# sed -n '3p' 2.txt           #取消默认输出
    oldboy                                                 #取消默认输出后只执行输入指令,只显示第三行
     

    显示多行:

     

     

    总结:取行时需要加上-n选项,取消默认输出

    sed可以指定行来显示,单行,多行,均可
    某某行和某某行用分号隔开,每个数字后均要加上p
    某某行到某某行用逗号分隔,最后的数字加上p即可
     
     
    2.按照内容模糊匹配 过滤字符串

    [root@web01 ~]# cat new.txt

    roottt
    rootoldboy
    oldgirl
     
    [root@web01 ~]# sed -n '/root/p' new.txt #匹配内容时需要用//包起来
    #非精确匹配,会匹配包含这个词语的词组
    roottt
    root
     
    *成对匹配,匹配范围*

     

    范围匹配总结:

    成对匹配,刚好一对就截止第2个词语结束,不管后面有无内容都不在显示,如果第一对匹配结束,后面内容中出现第1个匹配词而无第二个匹配此会默认显示后面所有内容,以此类推。

     

    n和p 是一对CP,有n则有P

    n         #取消默认输出
    p         #打印,输出
     
     
    3. 删除
     
    [root@oldboy~]# sed "3d" 123.txt                   #删除第3行
     
    [root@oldboy~]# sed "1,3d" 123.txt               #删除第一行到第三行
     
    ps: -d删除不针对源文件,源文件查看时保持不变
     
    [root@web01 ~]# cat 2.txt
    root oldboy good
    stundent oldboy
    oldboy
    oldgirl root
    dog cat
    oldboy
    ROOT
    [root@web01 ~]# sed '/oldboy/d' 2.txt                    #匹配内容后删除
    oldgirl root
    dog cat
    ROOT
     

    #要针对源文件操作,加上-i 参数

    [root@oldboy~]# sed -i "3d" 123.txt                     #真正删除第3行
    [root@oldboy~]# sed -i "3,$d" 123.txt                 #删除第3行到末尾的内容 
     

     增删改查 (重要)

    a          append              #在过滤到行的下面插入内容
    格式:
    sed '3a 插入内容' oldboy.txt                    # 在第三行的后面插入内容 内容在第四行
     
     i      insert                     #在过滤到内容的上一行插入(在当前行插入内容)
    格式:
    sed '3i 插入内容' oldboy.txt                    # 在第三行插入新的内容 内容在第三行
     
     c     替换 把顾虑到内容的行进行替换
    格式:
    sed '3c 替换的内容' oldboy.txt                 # 把第三行的内容替换掉
     
     
    a 追加内容 #在第三行的后面插入oldboy
     [root@oldboy~]#sed '3a oldboy' oldboy.txt
    I am lizhenya teacher!
    I teach linux.
    test
    oldboy
     
     
    # 在第一行到第3行之间追加内容good
    [root@oldboy~]#sed "1,3a good 1.txt                              #第1行,第2行,第3行后面都会插入good
     
     
    i     插入内容 在当前行上面插入新的内容 oldboy
     
    [root@oldboy~]#sed '3i oldboy' oldboy.txt                  #3行上面,第2行后面
    I am lizhenya teacher!
    I teach linux.
    oldboy
    test
     
    [root@oldboy~]#sed '$i oldboy' oldboy.txt                     # 最后一行的上面插入oldboy
     
    [root@oldboy~]#sed '1,3i oldboy' oldboy.txt                   # 在第1,第2,第3上面都插入
    oldboy
    I am lizhenya teacher!
    oldboy
    I teach linux.
    oldboy
    test
     
     
    c 将过滤到的内容进行替换                                  #把整行替换成oldboy
    [root@oldboy~]#sed '3c oldboy' oldboy.txt
    I am lizhenya teacher!
    I teach linux.
    oldboy
     
     
    [root@oldboy~]#sed '8c SELINUX=enfrcing' /etc/selinux/config
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    # enforcing - SELinux security policy is enforced.
    # permissive - SELinux prints warnings instead of enforcing.
    # disabled - No SELinux policy is loaded.
    SELINUX=enfrcing
     
     
    [root@web01 ~]# sed '1,5coldboy' passwd
    #将第1行到第5行的内容删除替换成oldboy
    oldboy
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
     
     
    4.替换
     
    vim 替换:
    s///                # 当前光标所在行的第一个内容
    s///g              # 替换当前行的所有匹配到的内容
    %s///g           # 全局替换
     
     
    sed替换:
     ///, ###, @@@                #同样的三个特殊符号都能使用,具体根据文件内容选择
     
    sed s///                     #只替换每行的第一个匹配到的内容
    sed 's///g'                  #全局替换
     
    sed替换实例:
    [root@web01 ~]# cat 2.txt
    root oldboy good
    stundent oldboy
    oldboy
    oldgirl root
    dog cat
    oldboy
    ROOT
    old
     
    [root@web01 ~]# sed s#oldboy#oldboyedu# 2.txt        
    #每行的第一个匹配到的都会替换
    root oldboyedu good
    stundent oldboyedu
    oldboyedu
    oldgirl root
    dog cat
    oldboyedu
    ROOT
    old
     

    补充:指定替换某行的第一个

     

    5. sed 后向引用()                        ##重要!!

    1.如何使用sed 给123456加上<123456>
    [root@oldboy~]#echo 123456
    123456
     
    [root@oldboy~]#echo 123456|sed 's#123456#<123456>#g'
    <123456>
     
     
     2.使用sed的后向引用 ()里面的内容正则匹配 调用第一个括号使用1来代表 第二个括号2
    [root@oldboy~]#echo 123456|sed -r 's#(.*)#1#g'
    123456
     
    [root@oldboy~]#echo 123456|sed -r 's#(123)(456)#1#g'
    123
     
    [root@oldboy~]#echo 123456|sed -r 's#(123)(456)#2#g'
    456
     

    如何取出eth0的IP地址() 扩展正则        需要加 -r

    1.如何取出ip地址所在的行
    2.ip行之后如何把ip地址在()中匹配
    3.调用
     
    1)使用ipadd 后向引用 .* 匹配当前整行
     
    [root@oldboy~]#ip add|sed -n 9p|sed -r 's#(.*)#1#g'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
     
    [root@oldboy~]#ifconfig eth0|sed -nr '2s#(.*)#1#gp'
    inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
     
    2)复制整行把想要的内容括起来
    [root@oldboy~]#ifconfig eth0|sed -nr '2s# inet (.*) netmask 255.255.255.0 broadcast 10.0.0.255#1#gp'
     
    3)把行的后面所有的内容使用.*表示
    [root@oldboy~]#ifconfig eth0|sed -nr '2s# inet (.*) net.*$#1#gp' 10.0.0.200
     
    4)把括号前面的内容也进行正则匹配
    [root@oldboy~]#ifconfig eth0|sed -nr '2s#^.*et (.*) n.*$#1#gp'
    10.0.0.200
     
    [root@oldboy~]#ifconfig eth0|sed -nr '2s#(^.*et )(.*)( n.*$)#1#gp'
    inet
     
    [root@oldboy~]#ifconfig eth0|sed -nr '2s#(^.*et )(.*)( n.*$)#2#gp'
    10.0.0.200
     
    [root@oldboy~]#ifconfig eth0|sed -nr '2s#(^.*et )(.*)( n.*$)#3#gp'
    netmask 255.255.255.0 broadcast 10.0.0.255
     
     

    把第一行和第七行替换

    [root@web01 ~]# sed -nr 's#(.*)(:x.*:)(/.*)#321#gp' passwd
    /bin/bash:x:0:0:root:/root:root
    /sbin/nologin:x:1:1:bin:/bin:bin
    /sbin/nologin:x:2:2:daemon:/sbin:daemon
    /sbin/nologin:x:3:4:adm:/var/adm:adm
    /sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
    /bin/sync:x:5:0:sync:/sbin:sync
     

    [root@web01 ~]# stat hosts               #取出第三行里面的2051

    File: ‘hosts’
    Size: 7 Blocks: 8 IO Block: 4096 regular file
    Device: 803h/2051d Inode: 67174920 Links: 2
    Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
    Context: unconfined_u:object_r:admin_home_t:s0
    Access: 2020-07-15 22:57:05.203789452 +0800
    Modify: 2020-07-15 22:56:53.719789917 +0800
    Change: 2020-07-15 22:56:53.719789917 +0800
    Birth: -
     
     
    [root@web01 ~]# stat hosts|sed -rn '3s#(.*h/)(.*)(d .*$)#2#gp'
    2051
     

    后向引用小结:

    (1) 整行以字母开头,可以不加^,直接用.*去匹配 比如例题种的(.*h/)
      (2)当行中出现空格,尽量错开空格取其前后,无法错开按照空格可以用.*,确定不了空格的字符数可以尝试用Tab键
     

  • 相关阅读:
    LeetCode:Validate Binary Search Tree
    二叉树的非递归遍历(非递归使用栈、非递归不使用栈)
    scala 基础语法
    scala VS python2 (linux or shell)
    web压力测试工具
    Elasticsearch cluster health: yellow unassigned shards
    GC overhead limit exceeded
    linux定时任务的设置
    linux CPU占用率高(转)
    JQuery Sparkline 说明文档
  • 原文地址:https://www.cnblogs.com/wzj-qwerty/p/15148990.html
Copyright © 2011-2022 走看看