不能使用"("在awk命令中

时间:2014-07-02 13:39:59

标签: regex linux unix awk

我尝试在我的Linux机器中执行awk命令,它会抛出错误。

awk -F "VALUES(" '{print $2}'

错误:

awk: fatal: Unmatched ( or \(: /VALUES(/

我也试过反斜杠,它也没有用。

awk -F "VALUES\(" '{print $2}'

错误:

awk: warning: escape sequence `\(' treated as plain `(' 
awk: fatal: Unmatched ( or \(: /VALUES(/

请让我知道如何包含(在awk搜索字符串中。

2 个答案:

答案 0 :(得分:4)

如果-F的值大于1,则将其视为正则表达式,因此您需要执行以下操作:

正则表达式字符类:

kent$  echo "a foo( b"|awk -F"foo[(]" '{print $1,$2}'
a   b

转义(

如果你真的想逃离(,你需要:

kent$  echo "a foo( b"|awk -F"foo\\\\(" '{print $1,$2}'
a   b

kent$  echo "a foo( b"|awk -F'foo\\(' '{print $1,$2}'  
a   b

答案 1 :(得分:0)

您正在使用Linux,因此您可能正在使用gawk。从我系统上的gawk手册页:

   -F fs
   --field-separator fs
          Use fs for the input field separator (the value of the FS prede-
          fined variable).

  

字段

     
    

当读取每个输入记录时,gawk将记录拆分为字段,使用        FS变量的值作为字段分隔符。如果FS是单身        字符,字段由该字符分隔。如果FS为null        string,然后每个单独的字符成为一个单独的字段。 否则,FS应该是一个完整的正则表达式。

  

由于-F中有多个字符,因此它被解释为正则表达式。而且你有一个没有右括号的开口支架。

您可以通过转义括号("VALUES\(")或将括号放在一个组("VALUES[(]")中来解决此问题。我推荐后者,因为使用反斜杠转义可能是丑陋和不可预测的,并且当你几个月后重新阅读这个脚本时,它会帮助你指出这是一个正则表达式而不是字符串。