zl程序教程

您现在的位置是:首页 >  其它

当前栏目

awk FS OFS RS ORS详解

详解 awk fs rs
2023-09-11 14:16:16 时间

 

awk默认从STDIN接受数据,打印文本到STDOUT

awk默认输出输入分割符:

  • FS   => Input field separater,字段分隔符, 默认空格类字符
  • RS   =>  Input record separater,行分隔符,默认\n
  • OFS => Output field separater,输出字段分隔符,默认空格
  • ORS => Output record separater,输出行分隔符,默认\n

 

  1. echo '1a2a3a4a5' | awk -v RS=a '{print $0}'
    echo '1a2a3a4a5' | awk '{BEGIN{RS="a"} {print $0}'
    # 在shell中a没有引号可以直接作为string,但是放到awk中,a相当于变量,所有要加""

     

     定义RS='a'发现多打印空行,原因是echo输出了一个\n被最后一行的最后一个字段拿到,
    本例中即是5\n

     

     但为什么$1,$2没有多打印空行呢?因为\n算是空字符,被当作field separater了,但是$0打印整体的时候
    \n是会被打印成空行的,所以$2实际为空

  2. RS可以为正则表达式
    echo -e '1ab2bc3cd4de5\c' | awk 'BEGIN{RS="[a-z]\+"} {print $0,RS,RT}'
    # RS为分割符,RT为正则实际匹配到的内容

     

     

     

  3. print $0的时候OFS不会产生作用,此时被RS分割出来的record作为整体输出

     

     

    路人甲
    电话: 13777707771
    手机: 010-12345678
    
    路人乙
    电话: 13912344321
    手机: 010-56784321
    QQ: 87654221

     

     处理上述文件的时候,空格的格式为\n\n,在分割feild的过程中产生了NULL,即是我们定义的RS


     

     



  4. echo "aaa bbb ccc" | awk -v OFS="|" '{print $0}'
    
    aaa bbb ccc
    
    echo "aaa bbb ccc" | awk -v OFS="|" '{$1=$1;print $0}'
    
    aaa|bbb|ccc

    因为OFS是对字段进行操作的,只有我们对字段进行了操作,上面的结果才能正确的显现出来。除了利用$1=$1之外,我们还可以利用NF+=0同样可以实现类似的效果

  5.  

     上面原来文本的分隔符可以看做是”#\n”,重新定义记录分隔符的话可以定义为直接的回车符,字段的分隔符可以设置为空格。后面的$1=$1对字段操作,使OFS的定义生效。

  6. FS=""是,每个字符都是一段

     

     

  7. 当我们想以固定的长度来分隔列的时候,可以使用 FIELDWIDTHS 来代替 FS
      例如,一行记录的前3个字符作为第一列,接下来的2个字符作为第二列,接下来的4个字符作为第三列

     

     

  8. awk默认将连续的空格,制表符(\t)换行符(\n)作为列分隔符,且会自动去掉行首和行尾的空格,制表符(\t)和(\n),但是FS="[ \t\n]"不会

     

     

  9. 打印自定义变量

     

     

     

     

  10. field使用正则匹配

     

     

    172.16.20.200   51cjml.cn
    172.16.20.200   v.51cjml.cn
    172.16.20.200   superdirectory.51cjml.cn
    172.16.20.200   crm.51cjml.cn
    172.16.20.200   bauto.51cjml.cn
    172.16.20.200   zhipei.51cjml.cn
    172.16.20.200   shopcrm.51cjml.cn
    172.16.20.200   vinmange.51cjml.cn
    172.16.20.200   carmanage.51cjml.cn
    172.16.20.200   cppmanage.51cjml.cn
    172.16.20.200   cpsmanage.51cjml.cn

     

  11.  

     

     

     

     

     OFS只在使用$1,$2时打印才有用

     

     

  12. FS, RS等变量最要随便设置特殊字符

     

     

    awk  'BEGIN{FS="UI";RS="";OFS="*"} {print $1,NF}' zz

     

     

     设置FS="UI",后NF=1

    awk -F"@" 'BEGIN{RS="";OFS="*"} {print $1,NF}' zz

     

     设置特殊字符 @ 后,NF=2,是有问题的