• 三剑客-sed awk


     目录

    1.sed

    2.awk

    1.sed

    //sed命令
    #语法说明:命令 参数 条件+处理= (指令) 处理文件信息
    字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
    1). 擅长对行进行操作处理
    2). 擅长将文件的内容信息进行修改调整/删除
    3). 指令信息
    p print 输出信息
    i insert 插入信息,在指定信息前面插入新的信息
    a append 附加信息,在指定信息后面附加新的信息
    d delete 删除指定信息
    s substitute 替换信息 s###g(全局替换)
    c 替换修改指定的一整行信息
    4). 参数信息
    -n 取消默认输出
    -r 识别扩展正则
    -i 真实编辑文件(将内存中的信息覆盖到磁盘中)    
    -e 识别sed命令多个操作指令
    1.文件中添加信息的能力
    2.文件中删除信息的能力 
    1)删除单行信息
    2)删除多行信息
    3)删除有xx信息的行
    4)删除第n行和第m行
    5)取消空行显示
    3.文件中修改信息的能力
    1)修改信息
    2)取出特定内容
    3)进行备份
    4)ni参数
    4.文件中查询信息的能力
    1)根据行号查询
    a)显示单行信息
    b)显示多行信息(连续)
    c)显示多行信息(不连续)
    2)根据内容查询
    a)输出单行消息
    b)输出多行消息(连续)
    c)输出多行消息(不连续)
    [root@lbz01 ~]# cat >person.txt<<EOF                           //创建测试环境
    > 101,lbz,CEO
    > 102,lsn,CTO
    > 103,Alex,COO
    > 104,yy,CFO
    > 105,lbzyyy,CIO
    > EOF
    1.文件中添加信息的能力
    [root@lbz01 ~]# sed '1i100,lsnyyy,UFO' person.txt              //在文件第一行添加信息100,lsnyyy,UFO
    [root@lbz01 ~]# sed '$a108,lsnyyy,UFO' person.txt              //在文件最后一行添加信息108,lsnyyy,UFO
    [root@lbz01 ~]# sed '3alsn.txt' person.txt                     //在第三行后面添加lsn.txt信息
    [root@lbz01 ~]# sed '2ilsn.txt' person.txt                     //在第二行前面添加lsn.txt信息
    [root@lbz01 ~]# sed -e '/lbz/ilsnn' -e '/lbz/albzy' person.txt //在有lbz行的前面添加lsnn 后面添加lbzy信息
    [root@lbz01 ~]# sed '$a100
    101' person.txt                    //添加多行信息
    101,lbz,CEO
    102,lsn,CTO
    103,Alex,COO
    104,yy,CFO
    105,lbzyyy,CIO
    100
    101
    2.文件中删除信息的能力
    [root@lbz01 ~]# sed '3d' person.txt                            1)删除单行信息
    #删除第三行信息
    [root@lbz01 ~]# sed '2,6d' person.txt                          2)删除多行信息
    #删除文件中第二行到第六行内容
    [root@lbz01 ~]# sed '/lbz/d' person.txt                        3)删除有xx信息的行
    #删除有lbz信息的行
    [root@lbz01 ~]# sed '3d;6d' person.txt                         4)删除第n行和第m行
    #删除文件中第3行和第6行内容
    [root@lbz01 ~]# sed -n '/./p' person.txt                       5)取消空行显示
    #第1种方法
    [root@lbz01 ~]# sed '/^$/d' person.txt
    #第2种方法
    [root@lbz01 ~]# sed -n '/^$/!p' person.txt
    #第3种方法
    3.文件中修改信息的能力
    [root@lbz01 ~]# sed 's#lbz#lbzz#g' person.txt                  1)修改单个内容信息
    #语法说明:sed 's#原有内容#修改后内容#g' 文件信息 
    [root@lbz01 ~]# sed 's/#lbzz/lbz/g' person.txt
    [root@lbz01 lbz]# ls                                           1)批量修改内容信息
    aaa        lbz01.jpg  lbz05.jpg  lbz09.jpg  lbz_soft_link.jpg  ok.txt
    alex.txt   lbz02.jpg  lbz06.jpg  lbz10.jpg  lbz.txt.bak        touch
    error.txt  lbz03.jpg  lbz07.jpg  lbz.jpg    lsn.txt
    info.log   lbz04.jpg  lbz08.jpg  lbz.log    lsny.txt
    [root@lbz01 lbz]# ls lbz*.jpg|sed -r 's#(.*)jpg#mv & 1txt#g'
    #批量修改文件的扩展名称 将lbzxx.jpg扩展名修改为lbzxx.txt
    mv lbz01.jpg lbz01.txt
    mv lbz02.jpg lbz02.txt
    mv lbz03.jpg lbz03.txt
    mv lbz04.jpg lbz04.txt
    mv lbz05.jpg lbz05.txt
    mv lbz06.jpg lbz06.txt
    mv lbz07.jpg lbz07.txt
    mv lbz08.jpg lbz08.txt
    mv lbz09.jpg lbz09.txt
    mv lbz10.jpg lbz10.txt
    mv lbz.jpg lbz.txt
    mv lbz_soft_link.jpg lbz_soft_link.txt
    [root@lbz01 ~]# sed '2clsnn' person.txt                        //替换修改指定的一整行信息
    [root@lbz01 ~]# ip a s eth0|sed -rn 's#^.*net(.*)/24.*#1#gp'  2)取出特定内容
    #语法说明:sed 's#()#
    #g' 文件信息 后项引用前项进行替换修改
     10.0.0.200
    [root@lbz01 ~]# sed -i.bak 's#lbz#lbzy#g' person.txt           3)进行备份
    [root@lbz01 ~]# cat person.txt.bak
    101,lbz,CEO
    102,lsn,CTO
    103,Alex,COO
    104,yy,CFO
    105,lbzyyy,CIO
    [root@lbz01 ~]# sed -ni 's#Alex#aaa#gp' person.txt             4)ni参数
    # ni和参数同时使用,会将文件内容进行清空
    [root@lbz01 ~]# cat person.txt
    103,aaa,COO
    4.文件中查询信息的能力
    [root@lbz01 ~]# cat >person.txt<<EOF                           //创建测试环境
    > 101,lbz,CEO
    > 102,lsn,CTO
    > 103,Alex,COO
    > 104,yy,CFO
    > 105,lbzyyy,CIO
    > EOF
    1)根据行号查询
    [root@lbz01 ~]# sed -n '3p' person.txt                         a)显示单行信息
    [root@lbz01 ~]# sed -n '1,3p' person.txt                       b)显示多行信息(连续)
    #显示第1行到第3行的信息
    [root@lbz01 ~]# sed -n '1;3p' person.txt                       c)显示多行信息(不连续)
    #显示第1行和第3行的信息
    2)根据内容查询
    [root@lbz01 ~]# sed -n '/lbz/p' person.txt                     a)输出单行消息
    [root@lbz01 ~]# sed -n '/lbz/,/Alex/p' person.txt              b)输出多行消息(连续)
    #将有lbz到Alex行的信息都输出出来
    [root@lbz01 ~]# sed -n '/lbz/p;/Alex/p' person.txt             c)输出多行消息(不连续)
    #将有lbz和alex行的信息都输出出来
    补充:批量重命名专业命令: rename
    [root@lbz01 lbz]# rename .jpg .txt lbz*.jpg
    #命令说明:命令 文件名称需要修改的部分信息 修改成什么信息 将什么样的文件进行修改 

    2.awk

    //awk
    #语法说明:awk [参数] '模式-动作' 文件
    1).
    擅长取列
    2).擅长统计分析日志   
    #符号用法:
     $1 $2 $3 : 取第几列信息
     $NF : 取最后一列
     $(NF-n) : 取倒数第几列
     $0 : 取所有列的信息
    1. 排除信息
    2. 查询信息
    1)按照行号查询
    a)查询单行信息
    b)查询多行信息(连续)
    c)查询多行信息(不连续)
    2)按照内容查询
    a)输出单行消息
    b)输出多行消息(连续)
    c)输出多行消息(不连续)
    3)显示特定内容
    3. 统计信息
    1) 日志信息进行统计(计数) 
    2) 对日志信息数值进行求和 
    3) (数组)进行排序分析 
    4) 匹配的条件信息
    4. 替换信息
    [root@lbz01 ~]# cat awk_test.txt                               //创建测试环境
    Zhang    Dandan    41117397    :250:100:175
    Zhang    Xiaoyu    390320151    :155:90:201
    Meng    Feiyu  80042789    :250:60:50
    Wu    Waiwai    70271111    :250:80:75
    Liu    Bingbing    41117483    :250:100:175
    Wang    Xiaohua  3515064655    :50:95:135
    Zi    Gege    1986787350    :250:168:200
    Li    Youjiu    918391635    :175:75:300
    Lin Shaona  918391635    :250:100:175
    1. 排除信息
    [root@lbz01 ~]# awk '$0~/^#|^$/' awk_test.txt                  //打印出文件中空行进行排除/文件中注释信息
    [root@lbz01 ~]# awk '$0!~/^#|^$/' awk_test.txt                 //文件中空行进行排除/文件中注释信息进行排除
    补充:grep -Ev "^#|^$" 文件信息 
          sed -n '/^#|^$/!p' 文件信息
          awk '/^#|^$/'
    2. 查询信息
    1)按照行号查询
    [root@lbz01 ~]# awk 'NR==2' awk_test.txt                        a)查询单行信息
    #查询第2行信息
    [root@lbz01 ~]# awk 'NR==2,NR==4' awk_test.txt                  b)查询多行信息(连续)
    #查询第2行到第4行的信息
    [root@lbz01 ~]# awk 'NR==2;NR==4' awk_test.txt                  c)查询多行信息(不连续)
    #查询第2行和第4行的信息
    2)按照内容查询
    [root@lbz01 ~]# awk '/Xiaoyu/' awk_test.txt                     a)查询单行信息
    #查询有Xiaoyu的行的信息
    [root@lbz01 ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt            b)查询多行信息(连续)
    #查询有Xiaoyu的行到Waiwai的行信息
    [root@lbz01 ~]# awk '/Xiaoyu/;/Waiwai/' awk_test.txt            c)查询多行信息(不连续)
    #查询有Xiaoyu的行和Waiwai的行信息
    3)显示特定内容
    [root@lbz01 ~]# awk '/Xiaoyu/{print $1,$3}' awk_test.txt                       //显示Xiaoyu的姓氏和ID号码
    [root@lbz01 ~]# awk -F ":" '/^Zhang/{print $3}' awk_test.txt                   //显示姓氏是zhang的人,显示他的第二次捐款金额
    100
    90
    [root@lbz01 ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt         //显示姓氏是zhang的人,显示他的第二次捐款金额和他的名字
    Zhang Dandan 100
    Zhang Xiaoyu 90
    [root@lbz01 ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt    //显示姓氏是zhang的人,显示他的第二次捐款金额和他的名字
    [root@lbz01 ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt                    //显示所有以41开头的ID号码的人的全名和ID号码
    Zhang Dandan 41117397
    Liu Bingbing 41117483
    [root@lbz01 ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt |column -t          //显示所有ID号码最后一位数字是1或5的人的全名
    [root@lbz01 ~]# awk '$3~/[1 5]$/{print $1,$2}' awk_test.txt |column -t
    [root@lbz01 ~]# awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt |column -t
    3. 统计信息
    1) 日志信息进行统计(计数)
    [root@lbz01 ~]# awk '/^$/{i=i+1;print i}' /etc/services                        //统计/etc/services文件中空行数量
    [root@lbz01 ~]# awk '/^$/{i=i+1}END{print i}' /etc/services
    17
    [root@lbz01 ~]# awk '/^#/{i++}END{print i}' /etc/services                      //统计/etc/services文件中有井号开头的行
    102
    2) 对日志信息数值进行求和 
    [root@lbz01 ~]#  awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd               //统计普通用户数量
    4
    [root@lbz01 ~]# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd               //统计虚拟用户数量
    4
    21
    [root@lbz01 ~]# seq 10|awk '{sum=sum+$1;print sum}'                            //求和计算
    1
    3
    6
    10
    15
    21
    28
    36
    45
    55
    4) 匹配的条件信息 
    [root@lbz01 ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' awk_test.txt |column -t
    #BEGIN{} 在awk执行命令前做什么事情
     END{}   在awk执行命令结束之后做的操作
    姓        名        QQ号        捐款记录
    Zhang     Dandan    41117397    :250:100:175
    Zhang     Xiaoyu    390320151   :155:90:201
    Meng      Feiyu     80042789    :250:60:50
    Wu        Waiwai    70271111    :250:80:75
    #Liu      Bingbing  41117483    :250:100:175
    Wang      Xiaohua   3515064655  :50:95:135
    Zi        Gege      1986787350  :250:168:200
    Li        Youjiu    918391635   :175:75:300
    Lin       Shaona    918391635   :250:100:175
    操作结束
    4. 替换信息
    [root@lbz01 ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt   //显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
    $155$90$201
    补充:如何利用awk取出IP地址信息
    [root@lbz01 ~]# ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'
    10.0.0.200
         求出测试文件中 所有人第一次捐款的总额和第三次捐款总额
    [root@lbz01 ~]# awk -F ":" 'BEGIN{print "第一次总额","第三次总额"};/.*/{print$2,$4}' awk_test.txt
    第一次总额 第三次总额
    250 175
    155 201
    250 50
    250 75
    250 175
    50 135
    250 200
    175 300
    250 175
    [root@lbz01 ~]# awk -F ":" 'BEGIN{print "第一次总额","第三次总额"}{a=a+$2;b=b+$4}END{print a,b}' awk_test.txt|column -t
    第一次总额  第三次总额
    1880        1486

    版权属于:木丫头

    转载必须声明

     

  • 相关阅读:
    命令创建.net core3.0 web应用详解(超详细教程)
    安装Visual Studio Code并汉化
    Visual Studio2019及.NET CORE3.0的安装教程
    序列化对象设置字段首字母小写(驼峰命名法)
    解决锁定图层后不能淡显的问题
    C#中的委托和事件
    C#常用方法——委托和事件详解
    C#常用方法——List<T>泛型列表解析
    C#常用方法——strng.Format()和$用法详解
    C#常用方法——通过WebServices接口读取json字符并解析示例
  • 原文地址:https://www.cnblogs.com/lbzyyy/p/12118364.html
Copyright © 2020-2023  润新知