0%

shell之初识sed和gawk(一)

初识sed和gawk(一)

linux中的sed和gawk都是处理文本文件的工具,可以帮助我们检查日志文件,读取配置文件,处理数据元素,以及日常任务的自动化

sed编辑器

  • sed编辑器被称为流编辑器,与vim这种交互式的编辑器相反。

  • sed编辑器会执行以下操作

    • 一次从输入中读取一行数据
    • 根据读取的编辑器命令匹配数据
    • 按照命令修改流中的数据
    • 将新的数据输出到stdout
  • 命令的格式

    • sed options script file
  • 选项

    • -e script 在处理输入的时候,将script中指定的命令添加到已有的命令中
    • -f file 在处理输入的时候,将file指定的命令添加到已有的命令中
    • -n 不产生命令输出,使用print命令来完成输出
  • 在命令行定义编辑器命令

    • 默认sed编辑器会将指定d的命令应用到stdin输入流上。举个例子

      echo "this is a test" | sed 's/test/big/ test'

      s命令会用斜线间指定的第二个文本字符串替换第一个文本字符串,即test –> big test

    • 需要注意的是:sed编辑器并不会真正修改文本文件的数据,他只会j将修改后的数据发送到stdout

      echo -e 's/brown/green/; s/dog/cat/' data.txt
    • 使用文件的方式

      echo "this is a cat" | sed -f script.sed

      其中 script.sed 中的内容为:s/cat/dog/

      则输出为this is a dog

gawk编辑器

  • gawk能提供一个编程环境和重新组织文件中的数据,他能做到的事情包括以下几点:

    • 定义变量来保存数据
    • 使用算术和字符串操作符来处理数据
    • 使用一些编程语法来为数据增加处理的逻辑
    • 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化后的报告,例如格式化日志文件
  • 命令格式

    • gawk options program file

      • 选项 描述
        -F fs 指定行中划分数据字段的字段分隔符
        -f file 从指定文件中读取程序
        -v var=value 定义gawk程序中的一个变量及其默认值
        -mf N 指定要处理的文件中的最大字段数
        -mr N 指定数据文件中的最大数据行数
        -W keyword 指定gawk的兼容模式或警告等级
      • 一个例子

        • gawk '{print "hello world"}' 默认gawk会从stdin接收数据,终止可以使用ctrl+d
      • 使用数据字段变量

        • gawk会给一行的每个元素分配一个变量

          • $0代表整个文本行
          • $1代表文本行中的第一个数据字段
        • $ cat data2.txt 
          One line of test text. 
          Two lines of test text. 
          Three lines of test text. 
          $ 
          $ gawk '{print $1}' data2.txt 
          One 
          Two 
          Three
      • 在程序脚本中使用多个命令

        • $ echo "My name is Rich" | gawk '{$4="Christine"; print $0}'
          My name is Christine 
      • 从文件中读取程序

        • $ cat script2.gawk 
          {print $1 "'s home directory is " $6} 
          $ gawk -F: -f script2.gawk /etc/passwd 
          root's home directory is /root 
          bin's home directory is /bin 
          daemon's home directory is /sbin 
      • 在处理数据之前运行脚本,第一个{}中的内容是处理数据之前的脚本,第二个{}中的内容才是真正处理数据的脚本

        •  gawk 'BEGIN {print "The data3 File Contents:"} {print $0}' data3.txt
      • 在处理数据之后运行脚本,同理在END后面为处理数据之后要执行的脚本

        • $ echo "my name is harper " | gawk 'BEGIN {print 123} {print $4} END {print 456}'
~~