如何将awk与多值定界符一起使用

时间:2018-11-21 10:06:08

标签: linux shell unix

如何使用awk分隔符,其中包含多值:“#@ $”

我有这样的文件:Test1#@ $ Test2#@ $ Test3#@ $ Test4 我需要提取“ Test2”。 执行以下命令后:awk -F "#@$" '{print $2}',什么也不显示>

然后awk -F "#@$" '{print $1}'我得到了完整的一行

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您遇到的问题是字段分隔符FS被视为正则表达式。 字符($)在正则表达式中具有特殊含义,因为它表示行尾的锚点。解决方法是对它两次转义,因为 -escapes被解释了两次。一次在字符串的词汇处理中,一次在处理正则表达式:

awk -F '#@\\$' '{print $1}'

  

扩展的正则表达式可以通过将包含表达式的字符串直接分配给内置变量FS或通过使用{{ 1}} sepstring选项。 -F变量的默认值应为单个。以下描述了FS的行为:

     
      
  1. 如果FS为空字符串,则行为未指定。
  2.   
  3. 如果FS是单个字符:

         
        
    • 如果FS,则跳过前导和尾随字符;字段应由一组一个或多个字符定界。
    •   
    • 否则,如果FS是任何其他字符FS,则字段每次出现c时都应定界。
    •   
  4.   
  5. 否则,c的字符串值应被视为扩展的正则表达式。每次出现与扩展正则表达式匹配的序列都应定界字段。

  6.   
     

来源:POSIX awk standard


  

括号表达式之外的FS)应将表达式或子表达式的锚定到字符串的末尾;这样的表达式或子表达式只能匹配以字符串的最后一个字符结尾的序列。例如,ERE $ef$与字符串(ef$)中的ef匹配,但与字符串abcdef和ERE {{1 }}有效,但由于cdefab阻止表达式e$f匹配到最后一个字符而终止,因此无法匹配。

     

来源:POSIX Extended Regular Expressions

答案 1 :(得分:1)

只需将$括在方括号[]中即可删除其特殊含义

> cat t1
Test1#@$Test2#@$Test3#@$Test4
> awk -F '#@[$]' '{print $2}' t1
Test2
>