![awk 系统命令中带有管道的反斜杠](https://linux22.com/image/39995/awk%20%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4%E4%B8%AD%E5%B8%A6%E6%9C%89%E7%AE%A1%E9%81%93%E7%9A%84%E5%8F%8D%E6%96%9C%E6%9D%A0.png)
我想从 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]* \""