美文网首页
sed和gawk

sed和gawk

作者: 食梦狸猫 | 来源:发表于2019-04-10 16:37 被阅读0次

    sed

    sed是流编辑器,是会在编辑器处理数据之前要预先提供一组规则来编辑数据流。sed根据命令来处理数据流中的数据,这些命令来自命令行输入或者存储在一个命令文本文件中。

    sed的处理过程是:

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

    sed命令的格式:
    sed options script file
    选项:
    -e script
    将script中的命令添加到已有命令中
    -f file
    将file中的命令添加到已有命令中
    -n
    用print命令来完成输出

    • 在命令行定义编辑器命令
    echo "this is a test" | sed 's/test/big'
    

    s命令表示将斜线中第一个文本替换为斜线中第二个文本。

    sed 's/dog/cat' data.txt
    

    sed不会修改文本文件的数据,只是将修改后的数据发送到STDOUT

    • 在命令行使用多个编辑器命令
    sed -e 's/a/b;s/c/d' data.txt
    

    两个命令都作用到文本的每行数据上,命令之间必须用分号隔开

    • 从文件中读取编辑器命令
      如果有大量要处理的sed命令,那么把它们单独放到一个文件里会方便些,每一行都是一个命令,且不用加分号。
    sed -f script1.sed data1.txt
    
    • 替换标记
      sed中的s替换命令只替换每一行出现的第一处,要使其替换不同的地方出现的文本必须使用替换标记
      s/pattern/replacement/flags
      4种替换标记
      数字:表明替换第几处匹配的地方
      g:表明心文本将替换所有匹配的文本
      p:表明原先行的内容要打印出来
      w file:将替换的结果写到文件中
    sed 's/test/trial/2' data4.txt
    
    • 使用地址
      默认情况下,在sed编辑器中使用的命令会作用于文本数据所有的行。如果只想将命令作用在特定的行,要使用行寻址
      数字形式表示行区间
    sed '2s/dog/cat/'
    sed '2,3s/dog/cat/'
    sed '2,$/dog/cat/'
    

    使用文本过滤器

    sed '/Sam/s/bash/csh/'
    

    该命令只能作用到匹配文本模式的行上,但这是固定文本模式,还可以使用正则表达式。

    • 删除行
      命令d
    sed '3d' data.txt
    sed '2,3d' data.txt
    sed '3,$d' data.txt
    
    • 插入和附加文本
      sed编辑器允许向数据流插入和附加文本行。
      i 会在指定行前增加一个新行
    sed 'i\test'
    

    a 会在指定行后面加一个新行

    sed 'a\test'
    
    • 修改行
      c命令允许对整行内容进行修改
    sed '/number1/c\this is a '
    
    • 转换命令
      y转换命令是唯一可以处理单个字符的sed编辑器命令
    echo "this 1" | sed 'y/1/4'
    
    • 打印
      p命令用于打印文本行
    sed '/number3/p' data.txt
    

    打印包含匹配文本模式的行

    打印行号
    =用于打印行号

    sed '=' data.txt
    

    列出行
    l命令

    • 使用sed来处理文件
      w命令用来向文件写入行
      w filename
    sed '1,2w test.txt' data.txt
    

    将data.txt的1,2行写入test.txt中

    从文件读取数据
    读取命令r允许将一个独立文件中的数据插入到数据流中

    sed '/number2/r data12.txt' data6.txt
    

    -多行命令

    gawk程序

    gawk是unix中awk程序的GNU版本,它提供一种编程语言,而不只是编辑器命令:

    • 定义变量来保存数据
    • 使用算数和字符串操作符来处理数据
    • 使用结构化编程概念来为数据处理增加处理逻辑
    • 通过提取数据文件中的数据元素,将其重新排列或格式化。

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

    gawk可以写脚本来读取文本行的数据,然后处理并显示数据。

    gawk '{print "Hello World!"}'
    

    这个程序脚本定义了print命令,从STDIN接受数据,将文本打印到STDOUT。

    • 使用数据字段变量
      gawk自动给一行中的每个数据元素分配一个变量。
    • $0代表整个文本行
    • $1代表文本行中的第1个数据字段
    • $2代表文本行中的第2个字段
      .....
      在文本行中,每个数据字段都是通过字段分隔符划分的。gawk默认的字段分隔符是任意的空白字符。
    gawk '{print $1}' data.txt
    

    gawk程序读取文本文件,只显示第1个数据字段的值
    如果想用其他的字段分隔符,可以用-F选项

    gawk -F: '{print $1}' /etc/passwd
    
    • 在程序脚本中使用多个命令
      gawk编程语言允许使用多条命令,命令之间用分号隔开。
    echo "my u" | gawk '{$1="t"; print $0}'
    
    • 从文件中读取程序
    gawk -F: -f script.gawk /etc/passwd
    
    • 在处理数据前运行脚本
      有时需要在处理数据前运行脚本,BEGIN强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本
    echo "one" | gawk 'BEGIN {print "test"} {print $0}' 
    
    • 在处理数据后运行脚本
      END关键字允许指定一个程序脚本,gawk在读完数据后执行它
    echo "one" | gawk 'BEGIN {print "test"} {print $0} END {print "end"}' 
    

    相关文章

      网友评论

          本文标题:sed和gawk

          本文链接:https://www.haomeiwen.com/subject/ogwniqtx.html