zoukankan      html  css  js  c++  java
  • sed---流文本操作

    一:sed基本命令

    sed的使用格式

    sed [optiona] ‘command’ files

    sed 参数[-nefir] 动作[n1,[n2]] function
    sed -n:只有经过sed特殊处理的那些行才会被列出来
    -e:直接在命令行模式上进行sed的动作编辑
    -f:直接将sed的动作写在文件里,-f filename则可以执行filename内的动作
    -r:sed的动作支持的是扩展正则表达式,读取指定文件的内容
    -i:直接修改读取到的文件的内容,而不是屏幕输出
    n1,n2一般代表执行动作的行,也可以用正则表达式
    function:
    a:新增
    c:替换
    d:删除
    i:插入行
    p:打印
    s:替换

    1:以行为单位新增/删除功能

    1:将/etc/passwd.bak的内容列出来并且打印行号,同时删除第2-5行
    [root@localhost etc]# nl /etc/passwd.bak  |sed '2,5d'    #删除2到5行
    
    [root@localhost etc]# nl /etc/passwd.bak  |sed '2d'		 #删除第2行
    [root@localhost etc]# nl /etc/passwd.bak  |sed '2,$d'     #删除2行到最后一行
         1  root:x:0:0:root:/root:/bin/bash
    [root@localhost tmp]# sed '/^$/d'  passwd.bak             #删除空行
    
    2:在第二行后面,也就是第3行上,加上“I love batman!”
    
    [root@localhost etc]# nl /etc/passwd.bak | sed '2a  I love batman! ' 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    I love batman! 
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
       ...
     
    3:添加多行
    nl /etc/passwd.bak | sed '2a  I love batman! ...  [敲一下回车]
    > ssssss '   
    #以'结束多行内容
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    I love batman! ... 
    ssssss 
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
        ...
        
        
        #模式匹配的方式
        sed '/2004/aChina'   xxxx.txt   #希望在2004的下一行添加China
        sed '/2004/iChina'   xxxx.txt  #希望在2004的前一行添加China
    4:$:最后一行---在文档最后一行添加I love linux
    [root@localhost tmp]# nl passwd.bak  | sed '$a I love linx '
    

    2:以行为单位替换/打印

    1:将第2-5行的内容替换为“No 2-5 number”
    [root@localhost etc]# nl /etc/passwd.bak | sed '2,5c no 2-5 number'
         1  root:x:0:0:root:/root:/bin/bash
    no 2-5 number
         6  sync:x:5:0:sync:/sbin:/bin/sync
        ...
        
    2:简单直接取出你想要的行数
    [root@localhost etc]# nl /etc/passwd.bak | sed '2,5p'        #2-5行会重复输出
    [root@localhost etc]# nl /etc/passwd.bak | sed -n '2,5p'     #加上-n,只输出2-5行
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         
     #模式匹配的方式
     [root@localhost etc]# sed -n '/root/p'  passwd.bak   #把包含murex字符的行输出,别忘记加上-n参数
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin 
     
    

    3:以行为单位进行部分数据的查找以及替换的功能------可以批量处理配置文件

    -s替换:分隔符/,#等等 加g:全局替换

    1:直接修改文件的内容
    [root@localhost etc]#  sed -in 's/n$/!/g'  passwd.bak   #将每一行结尾的n替换为!,注意转义
    [root@localhost tmp]# ifconfig eno16777728  | sed -n '/inet /p' | sed  's/inet//g' | sed 's/net.*$//'  #取出IP地址
    

    4:!取反,不打印某些行

    1:不打印5到10行
    [root@localhost tmp]# nl passwd.bak | sed -n '5,10!p' 
    

    5:定位间隔几行 first~step

    1:间隔行输出,输出单行,第一行开始
    [root@localhost tmp]# nl passwd.bak |sed -n '1~2p' 
         1  root:x:0:0:root:/root:/bin/bash
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologi!
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdow!
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologi!
        11  games:x:12:100:games:/usr/games:/sbin/nologi!
        13  nobody:x:99:99:Nobody:/:/sbin/nologi!
        15  polkitd:x:999:998:User for polkitd:/:/sbin/nologi!
        17  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologi!
        19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologi!
    

    6:以行为单位插入数据

    1;在1-5行,每行前插入 I love linux
    [root@localhost tmp]# nl passwd.bak | sed  '1,5i   I love linux'  
    I love linux
         1  root:x:0:0:root:/root:/bin/bash
    I love linux
         2  bin:x:1:1:bin:/bin:/sbin/nologi!
    I love linux
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologi!
    I love linux
         4  adm:x:3:4:adm:/var/adm:/sbin/nologi!
    I love linux
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
    2:使用来转义空格,使其对其
    [root@localhost tmp]# nl passwd.bak | sed  '1,5i       I love linux' 
           I love linux
         1  root:x:0:0:root:/root:/bin/bash
           I love linux
         2  bin:x:1:1:bin:/bin:/sbin/nologi!
           I love linux
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologi!
           I love linux
         4  adm:x:3:4:adm:/var/adm:/sbin/nologi!
           I love linux
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi!
    
    

    二:高级操作命令

    1:-{} :多个sed命令,用;分开

    1:删除5-10行,再进行替换操作
    [root@localhost tmp]# nl passwd.bak | sed '{5,10d;s/oracle/root/}'
    

    2: -n:读取下一个输入行(用下一个命令处理)-----{}里面的n

    1:操作偶数行-----调第一行的时候,读取出第二行:打印,以此类推
    [root@localhost tmp]# nl passwd.bak | sed -n '{n;p}'  
    [root@localhost tmp]# nl passwd.bak | sed -n '2~2p'   #第2行开始,间隔行为2
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         8  halt:x:7:0:halt:/sbin:/sbin/halt
        10  operator:x:11:0:operator:/root:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        14  dbus:x:81:81:System message bus:/:/sbin/nologin
        16  avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
        18  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
        20  oracle:x:1000:1000:oracle:/home/oracle:/bin/bash
    2:操作奇数行
    [root@localhost tmp]# nl passwd.bak | sed -n '{p;n}'
    [root@localhost tmp]# nl passwd.bak | sed -n '1~2p'  #第1行开始,间隔行为2
         1  root:x:0:0:root:/root:/bin/bash
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        15  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        17  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
        19  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    

    3:-&:替换固定字符串----替换操作的优化

    1:把passwd中的用户后面都添加上4个空格
    [root@localhost tmp]#  sed 's/^[a-z_-]+/&    /' passwd.bak
    root    :x:0:0:root:/root:/bin/bash
    bin    :x:1:1:bin:/bin:/sbin/nologin
    daemon    :x:2:2:daemon:/sbin:/sbin/nologin
    adm    :x:3:4:adm:/var/adm:/sbin/nologin
    lp    :x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync    :x:5:0:sync:/sbin:/bin/sync
    shutdown    :x:6:0:shutdown:/sbin:/sbin/shutdown
    
    

    4:元字符(u,l,U,L) :转换为大写,小写:u,l对首字母,U,L对一串字符

    [root@localhost tmp]#  sed 's/^[a-z_-]+/u&/' passwd.bak   #首字母转换为大写
    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@localhost tmp]#  sed 's/^[a-z_-]+/U&/' passwd.bak    #匹配字符串全部转换为大写
    [root@localhost tmp]#  sed 's/^[a-z_-]+/l&/' passwd.bak	 #首字母转换为小写
    [root@localhost tmp]#  sed 's/^[a-z_-]+/L&/' passwd.bak	#匹配字符串首字母转换为小写
    

    5:-( ) : 替换某种(部分)字符串1,2

    1:获取ip的另一种思路
    [root@localhost tmp]# ifconfig eno16777728 |grep netmask|   sed 's/(inet)(.*)(net.*)/2/'
             192.168.1.10
    [root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'|   sed 's/(inet)(.*)(net.*)/2/'          192.168.1.10
    [root@localhost tmp]# ifconfig eno16777728 |sed -n '/inet /p'| sed 's/inet ([0-9.]+.*) net.*/1/ ' 
            192.168.1.10 
    2:获取passwd种的USER,UID,GID
    [root@localhost tmp]# sed  's/(^[a-z_-]+):.*$/1/'  passwd.bak  #第一步
    [root@localhost tmp]# sed  's/(^[a-z_-]+):x:([0-9]+):.*$/1:2/'  passwd.bak  #第二步
    [root@localhost tmp]# sed  's/(^[a-z_-]+):x:([0-9]+):([0-9]+):.*$/1:2:3/'  passwd.bak   
    root:0:0
    bin:1:1
    daemon:2:2
    adm:3:4
    lp:4:7
    sync:5:0
    shutdown:6:0
    halt:7:0
    mail:8:12
    
    #### d判断的不只是0-9,而是一个 Unicode 字符集
    

    6:-r复制指定文件插入到匹配行-----不改变文件内容

    ​ -w:复制匹配行拷贝到指定文件里

    1:
    [root@localhost tmp]# echo -e  "123
    456
    789" > 123.txt
    [root@localhost tmp]# cat 123.txt 
    123
    456
    789
    [root@localhost tmp]# echo -e "abc
    def
    xyz"  > abc.txt
    [root@localhost tmp]# cat abc.txt 
    abc
    def
    xyz
    [root@localhost tmp]# sed '1r 123.txt' abc.txt   ### 读123.txt这个文件,并插入到abc.txt的第1行中
    abc
    123
    456
    789
    def
    xyz 
    
    2:-w:改写内容,把123.txt的第一行写入到abc.txt中
    [root@localhost tmp]# sed '1w abc.txt' 123.txt 
    123
    456
    789
    [root@localhost tmp]# cat abc.txt      #abc的原内容会被覆盖
    123
    
    

    7:-q退出

    1:到第5行就退出sed
    [root@localhost tmp]# nl passwd.bak | sed '5q' 
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         
    

    8:识别空格和制表符(tab)

    [root@localhost tmp]# cat tab_space.txt 
    this is tab     finish.
    this is several space       finish.
    [root@localhost tmp]# sed -n l tab_space.txt  ### -n  l是L的小写字母
    this is	tab	finish.$
    this is several space       finish.$
    
  • 相关阅读:
    sql: update from
    sql: 查询,select
    english: 遭遇
    sql: sybase与oracle中insert into select和select into的用法
    lcd参数解释及刷新率计算,LCD时序
    Camera Binning Mode
    页框分配器【转】
    (一)洞悉linux下的Netfilter&iptables:什么是Netfilter?
    网络中的NAT模式
    组播、单播、多播
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/11729890.html
Copyright © 2011-2022 走看看