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]);
    }
    }'
  • 相关阅读:
    27 Spring Cloud Feign整合Hystrix实现容错处理
    26 Spring Cloud使用Hystrix实现容错处理
    25 Spring Cloud Hystrix缓存与合并请求
    24 Spring Cloud Hystrix资源隔离策略(线程、信号量)
    23 Spring Cloud Hystrix(熔断器)介绍及使用
    22 Spring Cloud Feign的自定义配置及使用
    21 Spring Cloud使用Feign调用服务接口
    20 Spring Cloud Ribbon配置详解
    19 Spring Cloud Ribbon自定义负载均衡策略
    18 Spring Cloud Ribbon负载均衡策略介绍
  • 原文地址:https://www.cnblogs.com/biang/p/5581623.html
Copyright © 2011-2022 走看看