zoukankan      html  css  js  c++  java
  • SED&AWK

    SED
     
    1、sed是流编辑器(stream editor)缩写,作用主要是文本替换
    命令格式:sed ‘s/pattern/replace_string/' file或者cat file | sed 's/pattern/replace_string/'
     
    2、默认情况下sed只会打印替换后的文本,如果需要在替换的同时保存更改,可以使用-i选项,可以将替换结果应用于源文件,很多用户在进行替换后会使用重定向来保存文件:
    sed  ‘s/pattern/replace_string/' file > newfile
    其实只需要使用sed -i ‘s/pattern/replace_string/' file

    sed 's/[0-9]{3}/NUMBER/g' test.txt  (匹配出文件中的三位数并全部替换成NUMBER)

    3、默认情况下sed命令只会替换第一处符合模式的内容,如果需要全部替换可以在命令尾部加上参数g,使用sed ‘s/pattern/replace_string/g' file对所有匹配的内容进行替换,如果想从第n处匹配开始替换,可以是用/ng,如:sed ‘s/pattern/replace_string/2g' file
     
    4、 使用sed '/pattern/d' file删除匹配样式的行,使用sed ‘/^$/d' file删除空白行

    5、已匹配字符串标记(&)
    echo thisi is an example | sed 's/w+/[&]/g'
    [this] [is] [an] [example]
    6、子字符串匹配(1)
    echo this is digit 7 in a number | sed 's/digit ([0-9])/1/'
    this is 7 in a number
    代表匹配的内容,1代表第一个()内匹配的内容,2代表第二个()内匹配的内容,依次类推
    7、组合多个表达式
    sed ‘expression’ | sed ‘ expression’
    等价于
    sed ‘expression ; expression’
    等价于
    sed -e ‘expression’ -e ‘ expression’
    e.g.
    echo abc | sed 's/a/A/' | sed 's/c/C/'
    echo abc | sed 's/a/A/; s/c/C/'
    echo abc | sed -e 's/a/A' -e 's/c/C'
    的输出都为AbC
    8、引用
    使用变量时需要使用“”,不能使用单引号’‘
    e.g.
    text=hello
    echo hello world | sed "/s/$text/Hello/"
    Hello world
     
    awk
    awk是一款设计用于数据流的工具,他的关键点在于可以对列和行进行操作。awk具有很多內建功能,比如数组、函数等,这也是它和C语言的相同之处,灵活性是awk最大的优势。
    1、脚本的结构基本如下:
    awk ‘BEGIN{  print “start”}  pattern {  commands  }  END{  print “end” }'  file
    awk也可以从stdin中读取
    awk脚本通常由3部分组成。BEGIN END 和 带模式匹配选项的常见语句块。这三部分都是可选项,在脚本中可以省略任意部分
    2、工作原理:
    (1)执行BEGIN{  commnands  }语句块中的语句
    (2)从文件或者stdin中读取一,然后执行 pattern {  commands  }。重复这个过程,知道文件全部被读取完毕
    (3)当读至输入流末尾时,执行END {  commands  }语句块
    最重要的部分就是pattern语句块中的通用命令,这个语句块同样是可选的,如果不提供,默认执行{  print  },即打印所读取到的每一行。awk对于每一行,都会执行这个语句块。就像一个用来读取行的while循环,在循环体中提供了相应的语句
            每读取一行,awk就会检查该行和提供的模式是否匹配,模式本身可以是正则表达式、条件语句以及行匹配范围等。如果当前行匹配为该样式,则执行{}中的语句
            模式是可选的,如果没有提供模式,那么awk就认为所有的行都是匹配的,并执行{}中的语句
    注意:使用不带参数的print是,它会打印出当前行,关于print需要记住2点:当print的参数以逗号分隔时,打印结果以空格作为定界符。当print参数以空格分隔时,打印结果之间没有分隔。
    如:echo | awk '{  var1="v1";var2="v2";var3="v3"; print var1,var2,var3;}'
    结果为v1  v2  v3
    echo | awk '{  var1="v1";var2="v2";var3="v3"; print var1 var2 var3;}'
    结果为v1v2v3
    echo | awk  '{  var1="v1";var2="v2";var3="v3"; print var1  "-"  var2  "-"  var3; }'
    结果为v1-v2-v3
    3、补充内容
    (1)特殊变量
    NR:表示记录数量,在执行过程中对应于当前行号
    NF:表示字段数量,在执行过程中对应于当前行的字段数
    $0:表示执行过程中的当前行文本内容
    $1:表示第一个字段的文本内容
    $2:表示第二个字段的文本内容
    常见用法:$NF代表最有一个字段   $(NF-1)代表倒数第二个字段
    打印没一行的第3、第2个字段   awk '{  print $3,$2 }' file
    统计文件中的行数 awk 'END{print NR}' file
    每行第一个字段相加 seq 5 | awk ‘BEGIN{sum=0;print "SUmmation:"}  {print $1 "+";sum+=$1} END {print "==" print sum }’
    4、awk使用外部标量
    (1)使用-v
    VAR=10000
    echo | awk -v VARIABLE=$VAR '{print VARIABLE}'
    (2)使用键值对的方式,以空格分隔,跟在BEGIN {} END语句块之后
    echo | awk ‘{ print v1,v2}'  v1=$var1  v2=$var2
    5、getline
    语法:getline var。变量var就宝航特定行的内容,如果调用不带参数的getline,我们可以用$0,$1,$2访问文本行的内容
    seq 5 | awk 'BEGIN { getline; print "Read ahead first line",$0 }  {print  $0}'
    6、使用规律模式对awk处理进行过滤
    awk  'NR < 5'     行号小于5的行
    awk 'NR==1,NR==4'  行号在1到4之间的行
    awk '/linux/' 包含linux的行
    awk '!/linux/' 不包含linux的行
    7、从awk中读取命令输出
    echo | awk '{ "grep root /etc/passwd" | getline cmdout;print cmdout} '
    8、awk中使用循环
    for(i=0;i<10;i++)  { print $i ; }
    或者
    for(i in array) { print array[i]; }
    9、awk內建字符串控制函数
    length(strng)
    index(srtring,search_string)
    split(string,array,delimiter)
    substr(stirng,start-position,end-position)
    sub(regex,replacement_str,string)
    gsub(regex,replacement_str,string)
    match(regex,string)      RSTART、RLENGTH
     
    例子:
    $ echo "hahahahahahhaha" | awk '{sub(/h/,"ok",$0);print $0}'   //只匹配第一个
    okahahahahahhaha
    $ echo "hahahahahahhaha" | awk '{gsub(/h/,"ok",$0);print $0}'  //全部匹配
    okaokaokaokaokaokokaoka
     
    10、应用:统计词频
     
    #!/bin/bash
    #文件名:word_frea.sh
    #用途:计算文件中的单词词频
     
    if [  $#  -ne 1 ];
    then
        echo "Usage:$0 filename";
        exit 1
    fi
     
    filename=$1
     
    egrep -o "[[:alpha:]]+" $filename |
    awk '{ count[$0]++}  
    END {printf ("%-14s%s " , "Word","Count");
    for(ind in count)
    { printf("%-14s%s ",ind,count[ind]);
    }
    }'
  • 相关阅读:
    引导用户关注公众号
    python计算两组数据的P值
    【style-resources-loader】自动化导入CSS
    【concurrently】前端工程化并行解决方案
    【已解决】K8s + Ingress + Nodejs代理服务报错:413 Request Entity Too Large
    Python定时任务框架APScheduler实战Demo
    前端团队codeReview规范以及流程
    Git使用关键理解
    Vue+ESLint+Git钩子函数pre-commit配置教程
    【MongoDB】查询字段对应的数组中包含某个值
  • 原文地址:https://www.cnblogs.com/biang/p/5581623.html
Copyright © 2011-2022 走看看