Shell学习:sed & gawk

Posted 漂亮姐姐1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell学习:sed & gawk相关的知识,希望对你有一定的参考价值。

虽然shell脚本本身完成很多事情,但是单凭shell脚本通常很难处理数据。Linux提供了两个方便的工具来帮助处理文本数据。
概述

sed & gawk 的介绍

sed编辑器介绍

作为一款流编辑器(对行进行编辑),其擅长对行信息进行操作(增删改查)

gawk程序介绍

gawk程序是一个来自GNU组织的工具,它模仿并扩展Unix中awk程序的功能。gawk程序内建了编程语言,可用来编写处理数据的脚本。可以用gawk程序从大型数据文件中提取数据元素,并将它们按照需要的格式输出。便于处理大型日志文件以及从数据文件生成定制报表。

sed & gawk 的使用

  • sed入门

    # 测试文件
    [root@smartgirl] cat data.txt
    abcsasadd
    asasf
    sasasabcsaas
    # 替换文本
    [root@smartgirl] sed 's/abc/bcd/' data.txt
    # 多个命令
    [root@smartgirl] sed -e 's/ab/bc/; s/cd/ef/' data.txt
    
    [root@smartgirl] sed -e '
    >s/ab/cd/
    >s/bc/ef/
    >' data.txt
    
    # 从文件读取命令
    [root@smartgirl] cat script.sed
    s/ab/cd/
    s/bc/ef/
    ---------------------
    sed -f script.sed data.txt
    # 为了避免混淆,可以给保存命令的脚本文件添加.sed后缀
    
  • gawk基础

    # 接收到一行数据就进行处理,处理结果,输出Hello world!
    gawk '{print "Hello world!"}'
    # 要结束这个gawk程序,可以用Ctrl+d来产生一个EOF
    
    # 在gawk中, $0 --- 整行  $1 第一个字段 $2第二个字段
    默认的FS是空白字符(空格,制表符等)
    # 指定FS是:,打印出每行的第一个字段
    gawk -F: '{print $1}' /etc/passwd
    # 修改字段
    echo "my age is 20"|gawk '{$4="18"; print $0}'
    # 多个命令
    gawk '{
    $4="18"
    print $0
    }'
    
    # 将命令写到文件中
    cat script.gawk
    {print $1 "'s home is " $6}
    ---------------------------
    gawk -F: -f script.gawk /etc/passwd
    
    # 处理命令前的输出语句
    gawk 'BEGIN { print "-------begin--------"}'
    # 处理结束的输出语句
    gawk 'END { print "--------end--------"}'
    
    # 使用
    gawk 'BEGIN{print "------------begin---------"}
    {print $0}
    END{print "-----------end------------"}
    
    # 示例:
    cat script.gawk
    BEGIN{
    print "The latest list of users and shells"
    print " UserID \\t Shell"
    print "------- \\t ------"
    FS=":"
    }
    {
    print $1 "        \\t" $7
    }
    END{
    print "This concludes the listing"
    }
    -----------------------------
    gawk -f script.gawk /etc/passwd
    
  • sed编辑基础

    # sed命令有四种替换标记
    数字,表明新文本将会替换第几个模式匹配的地方
    g,替换全局匹配的地方 -- 默认就是全局的
    p,打印出修改过的行
    w file,将替换结果写到文件中
    # sed命令默认会将修改后所有行输出(不管该行是否具有匹配项)
    # 替换第二个匹配的项
    sed 's/test/trial/2' data.txt
    # 将修改了的行输出到文件test.txt中,不改变data.txt中原数据
    sed 's/test/trial/w test.txt' data.txt
    # 将2-4行写入到文件中
    sed '2,4w newfile.txt' data.txt
    # 只将修改过的行输出
    sed -n 's/test/trial/p' data.txt
    
    # sed命令运行使用其他字符代替/
    sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd
    
    # 对特定的行进行操作
    sed '2s/test/trial/' data.txt #对第2行进行处理
    sed '2,4/test/trial/' data.txt # 对2到4行进行处理
    sed '2,$/test/trial/' data.txt # 对2行到最后一行进行处理
    # 通过文本过滤行,对过滤行进行处理
    sed 'user01/s/bash/csh' /etc/passwd
    [root@smartgirl~]# sed -n '/user01/s/bash/csh/p' /etc/passwd
    user01:x:1021:1021::/home/user01:/bin/csh
    
    
    # 删除行
    sed 'd' data.txt  # 删除所有行
    sed '3d' data.txt # 删除第3行
    sed '2,4d' data.txt # 删除2-4行
    sed '3,$d' data.txt # 删除3-结束的所有行
    sed '/user01/d' data.txt # 删除user01所在行
    
    sed '/1/,/3/d' data.txt #删除有1的行到有3的行以及之间的所有行
    # 注意:在有1的行就开始删除,有3的行就结束删除
    # 如果再次出现有1的行就继续开始删除,如果没有再遇到有3的行,就会一直删除
    
    # 插入和附加文本
    i 在命令指定行前增加一个新行  insert
    a 在命令指定行后增加一个新行  append
    
    echo "Test Line 2"|sed "i\\Test Line 1"
    echo "Test Line 1"|sed "a\\Test Line 2"
    sed '3i\\Test Line' data.txt # 插到文件文本的第3行前
    sed '$a\\This is the last line.' data.txt # 插到文末
    sed '1i\\This is the first line.' data.txt # 插到文初
    
    # 修改整行的内容
    sed '3c\\this a total new line 3' data.txt # 替换第3行
    
    # 修改单个字符
    sed 'y/123/abc' data.txt # 1->a 2->b 3->c
    
    # 打印
    # 有三种打印控制字符
    # p 打印文本行
    # = 打印行号
    # l(小写L) 打印出行,并可显示不可见字符(制表符,换行符)
    [root@smartgirl ~]# sed -n '/user01/=' /etc/passwd
    22
    
    # 从文件中读取数据插入到数据流中,插入到匹配行的后面
    sed '3r insert.txt' data.txt
    Line01 in data.txt
    Line02 in data.txt
    Line03 in data.txt
    line01 in insert.txt
    line02 in insert.txt
    Line04 in data.txt
    
    # 一个有趣的例子
    cat data.txt
    following is a list
    LIST
    the list is in another file
    -------------------------------------
    # 使用sed命令实现从另一个文件中读取LIST并替换到LIST的位置上
    sed '/LIST/{
    r list.txt
    d
    }' data.txt
    

以上是关于Shell学习:sed & gawk的主要内容,如果未能解决你的问题,请参考以下文章

Shell学习:sed & gawk

shell高级-----初识sed和gawk

初识shell文本处理工具之gawk-sed

sed和gawk

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort