我尝试在我的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搜索字符串中。
答案 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[(]"
)中来解决此问题。我推荐后者,因为使用反斜杠转义可能是丑陋和不可预测的,并且当你几个月后重新阅读这个脚本时,它会帮助你指出这是一个正则表达式而不是字符串。