• linux 文本处理


    tr,awk,sed

    一:tr

    1.大小写转换

    cat file | tr [a-z] [A-Z] > new_file(大写 --> 小写)
    cat file | tr [A-Z] [a-z] > new_file
    2.删除空行 
    cat file | tr -s " " > new_file
     

    二:awk:

    gsub   全局替换
    sub     替换第一次
    gensub   指定替换第几次
    他们都是用来正则处理文本的
     
    awk的sub函数用法:

    1.sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。

    如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:
    sub (regular expression, substitution string):
    sub (regular expression, substitution string, target string)
    实例:
    $ awk '{ sub(/test/, "mytest"); print }' testfile
    $ awk '{ sub(/test/, "mytest", $1); print }' testfile
          第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。
          第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。
    如要在整个文件中进行匹配需要用到gsub

    2.gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:

                      gsub (regular expression, substitution string)
                      gsub (regular expression, substitution string, target string)
    实例:
    $ awk '{ gsub(/test/, "mytest"); print }' testfile
    $ awk '{ gsub(/test/, "mytest", $1); print }' testfile
          第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
          第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
     
    sub和gsub返回的都是替换次数
    [zhangping10@yf-nsop-dev01.yf01.baidu.com ~]$ echo "a b c 2011-11-22 a:d" | awk '{$2=gsub(/-/,"",$4);print $0}'
    a 2 c 20111122 a:d

    3.gensub则更强大,可以指定替换的第几次,函数返回值是替换的结果

    [zhangping10@yf-nsop-dev01.yf01.baidu.com ~]$ echo "a b c 2011-11-22 a-d" | awk '{$6=gensub(/-/,"",1,$4);print $0}' 
    a b c 2011-11-22 a-d 201111-22
    gensub(/-/,"",1,$4)
    /-/:替换源
    "":替换目标
    1:替换第几次,"g","G"表示全局替换
    $4:替换第几个字段

    替换目标还可以使用分组
    [zhangping10@yf-nsop-dev01.yf01.baidu.com ~]$ echo "duowan duowan-0002-gs2 a" | awk '{$0=gensub(/^.*-([0-9]+)(-.*)$/,"\2","g",$2);print $0}'
    -gs2

    替换文本:

    cat nj | awk 'BEGIN{FS=";";OFS=";"}{p=gensub(/^.*"([0-9]+)".*$/,"\1","g",$3); $9=sprintf("healthCheckCmd="port:%d"",p);print $0}'

    sed替换

     for h in `cat wosms`; do sed -r -i  's/("max_alert_times":[^,]+,)/1"hi":"g_ns_map_mobile_op",/g' $h;done;

    for h in `cat z_oncall`; do  echo $h; sed  -i --r 's/"alert": "([^,]+,)/"alert": "1"level": 4,/g' $h;done; 

    删除字符,注意只能处理字符,不能处理字符串

    1.删除字符串中g和z 字符

    cat abc | tr -d "gz"

    2.求出现次数最多的ip

    cat a1 | awk 'BEGIN{m=0;t=""}{s[$1]++;if (s[$1]>m) {m=s[$1] t=$1}}END{ print m,t}' 

  • 相关阅读:
    单网卡ADSL共享上网的设置
    单网卡ADSL共享上网的设置
    求阶乘的函数
    用递归算法求两个数的最大公约数
    编程求组合
    汉诺塔游戏
    求两个数的最小公倍数
    快排的非递归算法
    字符串匹配之通配符问题一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
    sizeof和strlen
  • 原文地址:https://www.cnblogs.com/zlingh/p/4676744.html
Copyright © 2020-2023  润新知