awk 系统命令中带有管道的反斜杠

awk 系统命令中带有管道的反斜杠

我想从 awk 调用 shell 命令,所以我正在使用,system()但是当我传递表达式时,我在反斜杠处收到错误。这是我的表情

echo "select * from abc limit 1;"| impala-shell|grep -Eo " a-[0-9]-[0-9]* \| HS[0-9]  \| [0-9]* \| [0-9]* "

但是当我将它传递给 shell 时,我收到错误backslash not last character on line

system("echo \"select * from abc limit 1;\"| impala-shell|grep -Eo \" a-[0-9]-[0-9]* \| HS[0-9]  \| [0-9]* \| [0-9]* \" ")

我想在awk编程后得到上面的命令结果system(),我知道我们可以通过getline访问但不知道确切的语法。

编辑

使用时\|在系统中为“\|”得到了关注

`warning: escape sequence `\|' treated as plain `|'` 

我举了一些简单的例子来看看\|在一个表达式中

system("echo hey i am  \"\\|\" ashish ")
hey i am \| ashish

但是当我在双引号和单引号内尝试时,会产生

system("echo \" a-[0-9]* \"\\|\" HS[0-9]  \"\\|\" [0-9]* \"\\|\" [0-9]* \" ")
a-[0-9]* | HS[0-9]  | [0-9]* | [0-9]*
//single quote
system("echo \' a-[0-9]* \"\\|\" HS[0-9]  \"\\|\" [0-9]* \"\\|\" [0-9]* \' ")
a-[0-9]* "\|" HS[0-9]  "\|" [0-9]* "\|" [0-9]*

我期待的是a-[0-9]* \| HS[0-9] \| [0-9]* \| [0-9]*

答案1

awk 中的这个字符串文字

"echo \"select * from abc limit 1;\"| impala-shell|grep -Eo \" a-[0-9]-[0-9]* \| HS[0-9]  \| [0-9]* \| [0-9]* \" "

代表以下字符串值:

echo "select * from abc limit 1;"| impala-shell|grep -Eo " a-[0-9]-[0-9]* | HS[0-9]  | [0-9]* | [0-9]* " 

反斜杠后跟另一个非字母或数字的字符表示该数字。 (至少在历史上的 awk 实现和 GNU awk 中 — 一些 awk 实现在后面跟着|awk 不视为特殊的字符时,会单独保留反斜杠。)

当您希望 awk 发出字符序列 时\|,您需要保护字符串文字中的反斜杠,因此编写“”\|”。

system("echo \"select * from abc limit 1;\"| impala-shell|grep -Eo \" a-[0-9]-[0-9]* \\| HS[0-9]  \\| [0-9]* \\| [0-9]* \""

相关内容