zoukankan      html  css  js  c++  java
  • sed命令使用详解

    环境:centos7

    使用sed-格式

    命令行格式

        sed [options] 'command' file(s)

        option: -e;-n

        command: 行定位 (正则)+sed命令(操作)

    格式行格式举例

        sed -n '/root/p'

        sed -e '10,20p' -e 's/false/true/g'

    基本操作命令

        -p (打印相关的行)记住要和参数-n 配合

        sed -n 'p' passwd

        sed ---行定位

    定位一行: x;行号  /pattern/ 正则

        sed -n '10p' passwd

        sed -n '/root/p' passwd

    定位几行:

        x,y; x行到y

        /pattern/,x;  x y都可以用正则来表示

         x,y! ;表示不取xy的行即取反

        nl passwd |sed -n '10,20p'  #nl开启行号

        nl passwd |sed -n '/operator/,/libstoragemgmt/p'  # 打印从operator开始到libstoragemgmt结尾的行

        nl passwd |sed -n '5,10!p'   #打印510行以外的其他行

        nl passwd |sed -n '10!p'   #打印10行以外的其他行

    定位间隔几行:firs~step

         nl passwd |sed -n '2~3p'  #表示第二行开始中间每间隔3行输出 (25812 的行)

    sed---操作命令

     基本操作命令(2

        -a (新增行) / i (插入行)

        -c (替代行)

        -d (删除行)

        nl passwd |sed '2a ======' #在第2行后面添加=====的一行内容

    [root@tmp]#  nl passwd |sed '2a ======'
         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

        nl passwd |sed '2,5a ======' #在第2行到5行每行后面添加=====的一行内容

    [root@tmp]# nl passwd |sed '2,5a ======'
         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
    ======

         nl passwd |sed '2i ======' #在第5行前面插入=====的一行内容

    [root@tmp]#  nl passwd |sed '2i ======'
         1  root:x:0:0:root:/root:/bin/bash
    ======
         2  bin:x:1:1:bin:/bin:/sbin/nologin

         nl passwd |sed '2c ======' #将第二行替换成=====的一行内容

    [root@tmp]# nl passwd |sed '2c ======'
         1  root:x:0:0:root:/root:/bin/bash
    ======
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    

      nl passwd |sed '1,2c ======' #将多行替换成=====的一行内容

    [root@ tmp]# nl passwd |sed '1,2c ======'
    ======
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    

           nl passwd |sed '1,2d' #删除12

            nl passwd |sed '/root/d'  #删除带root的行

    [root@tmp]#  nl passwd |sed '/root/d'
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    [root@tmp]#   nl passwd |sed '1,2d'
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin

    系统优化

            sed '$a port 10022 allowrootlogin no'  sshd_config.conf    #表示在文件末尾添加两行

             $表示文件末尾   表示换行

    [root@tmp]# sed '1i port 10022 
    allowrootlogin no'  passwd #第一行前添加两行
    port 10022
    allowrootlogin no
    root:x:0:0:root:/root:/bin/bash

            sed '$a      port 10022    allowrootlogin no'  sshd_config.conf  #美化添加空格a后面需要转义空格

    #      ForceCommand cvs server
           port 10022
           allowrootlogin no
    [root@tmp]# sed '$a         port 10022 
           allowrootlogin no'  /etc/ssh/sshd_config

            sed '/^$/d'  d.txt  #删除空行  /^$/ 正则表达式空行

            sed -n '/Error/p' log.txt   #日志文件中查找错误行 正则匹配错误行

    sed替换命令

          -s:替换命令

          -g:(全局) 替换所有的匹配字符

          sed 's/false/true/' passwd

          sed 's/false/true/g' passwd

    sed获取服务器ip(思路:获取行,替换ip前后面内容)

    [root@~]# ifconfig eth0
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.27.0.7  netmask 255.255.240.0  broadcast 172.27.15.255
            inet6 fe80::5054:ff:fe3c:c92e  prefixlen 64  scopeid 0x20<link>
            ether 52:54:00:3c:c9:2e  txqueuelen 1000  (Ethernet)
            RX packets 1115181672  bytes 312544971311 (291.0 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1033162772  bytes 520647988228 (484.8 GiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    [root@~]# ifconfig eth0|sed -n '/inet /p'|sed 's/inet//'|sed 's/netmask.*$//'
             172.27.0.7       

    sed高级操作命令

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

    nl passwd|sed '{10,20d;s/faluse/true/g}  #删除10到20行 并且替换faluse为true

        -n: 读取下一个输入行(用下一个命令处理)sed是一行一行输入 -n表示下一行

            nl passwd|sed -n '1~2p' 跳行命令相似

      [root@tmp]# nl passwd|sed -n '{n;p}'   #第一行的下一行为第二行
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         4  adm:x:3:4:adm:/var/adm:/sbin/nologin

       -& :替换固定字符串 列子 sed 's/A/A12/'  改为使用固定字符串 sed 's/A/&12/'

    #下面使用&处理passwd,将用户后面加两个空格
    [root@tmp]# sed 's/^[a-z]+/&  /' 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
    adm  :x:3:4:adm:/var/adm:/sbin/nologin
    lp  :x:4:7:lp:/var/spool/lpd:/sbin/nologin

             案例一:大小写转换

                   将用户名的首字母转换为大小/小写字母

                 (元字符u l U L :转换为大写/小写字符)

    [root@tmp]# sed 's/^[a-z]+/u&/' 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
    Adm:x:3:4:adm:/var/adm:/sbin/nologin

                案例二: 将文件夹下的.txt 文件转换为大写

    [root@SmartCommunity-Node01 tmp]# ls *.txt
    a_w.txt  b.txt  cal.txt  d.txt
    #W代表元字符[a-zA_Z_0-9]
    [root@SmartCommunity-Node01 tmp]# ls *.txt|sed 's/^w+/U&/'
    A_W.txt
    B.txt
    CAL.txt
    D.txt

               案例三:数据筛选

                       “获取passwduseruidgid

    [root@tmp]# sed 's/(^[a-z_-]+):x:([0-9]+):([0-9]+):.*$/USER:1  UID:2  GID3/' passwd
    USER:root  UID:0  GID0
    USER:bin  UID:1  GID1
    USER:daemon  UID:2  GID2
    USER:adm  UID:3  GID4

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

               s/w1w2w3/w2/  :w1w2w3 替换成w2    

                使用()改写  s/w1(w2)w3/1/  

          案例:获取服务器ip

                 ([0-9.]+)  代表ip

    [root@tmp]# ifconfig eth0|sed -n '/inet /p'
            inet 172.27.0.7  netmask 255.255.240.0  broadcast 172.27.15.255
    [root@tmp]# ifconfig eth0|sed -n '/inet /p'|sed 's/inet ([0-9.]+).*$/1/'
            172.27.0.7

     -r : 复制指定文件插入到匹配行

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

        源文件 <--互操作--> 目标文件

    [root@tmp]# echo -e 'dfg
    abc' > f.txt
    [root@tmp]# more f.txt
    dfg
    abc
    [root@tmp]# echo -e '123
    456' >e.txt
    [root@tmp]# more e.txt
    123
    456

    #将文件f.txt读入到e.txt的第一行后面

    [root@tmp]# sed '1r f.txt' e.txt
    123
    dfg
    abc
    456

    w:写操作会改变写的文件(注意)

    [root@tmp]# sed 'w f.txt' e.txt   #将e文件内容写入f (f相当于e的mv)
    123
    456
    [root@tmp]# more f.txt
    123
    456
    [root@tmp]# sed '1w f.txt' e.txt  #将e的第一行写入f (f就只有e的第一行内容)
    123
    456
    [root@tmp]# more f.txt
    123

    -q: 退出sed

    [root@tmp]# nl passwd |sed '/daemon/q'   #读到daemon就退出
         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

    脚本格式

        sed -f scriptfile file(s)

    做一个决定,并不难,难的是付诸行动,并且坚持到底。
  • 相关阅读:
    java学习之旅(一):BOS项目使用的技术以及开发环境
    spring手动回滚
    tomcat下配置多端口,多项目
    centos7安装Mysql5.6
    windows phone7 下 Silverlight 异步读取网络图片
    Sencha Touch 本地化存储配置
    LCD1602显示接收的串口通讯字串
    QML 怎么在gridview中用Index定位? 怎么在代理中设置背景?
    89C52定时/计数器
    QML JSON 展示
  • 原文地址:https://www.cnblogs.com/wukc/p/14633500.html
Copyright © 2011-2022 走看看