【问题标题】:can not use "(" in awk command不能在 awk 命令中使用“(”
【发布时间】:2014-07-02 13:39:58
【问题描述】:

我尝试在我的 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 搜索字符串中包含 (。

【问题讨论】:

  • 是的。你的问题是什么?
  • 试试awk "VALUES\(" '{print $2}'
  • @JorgeCampos 它不起作用。看我的回答。

标签: regex linux unix awk


【解决方案1】:

如果-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

【讨论】:

  • @logan 在这种情况下,我更喜欢[(] 或重新考虑FS,例如默认空间,然后检查上一列=="VALUES(" 等...无论如何,重要的是它对您有帮助。
【解决方案2】:

您使用的是 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 为空 字符串,然后每个单独的字符成为一个单独的字段。 否则,FS 应该是一个完整的正则表达式。

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

您可以通过转义括号 ("VALUES\(") 或将括号放入一个组 ("VALUES[(]") 来解决此问题。我推荐后者,因为用反斜杠转义内容可能很难看且不可预测,并且会在几个月后重新阅读此脚本时向您指出这是一个正则表达式,而不是字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多