Barra invertida com pipe no comando do sistema do awk

2

Eu quero chamar o comando shell do awk, então estou usando system() , mas quando estou passando a expressão estou recebendo erro na barra invertida. Aqui está minha expressão

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

Mas quando estou passando para shell, estou recebendo um erro 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]* \" ")

Eu quero pegar o resultado do comando acima em awk programming depois de system() , eu sei que podemos acessar através do getline mas não sabemos a sintaxe exata.

EDITAR

Ao usar \ | no sistema, como "\ |" seguido

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

Eu peguei um exemplo simples para ver \ | em uma expressão

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

mas quando tento usar cotações duplas e cotações únicas em

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]*

o que estou esperando é a-[0-9]* \| HS[0-9] \| [0-9]* \| [0-9]* .

    
por Aashu 16.07.2014 / 15:20

1 resposta

1

Este literal de string no awk

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

representa o seguinte valor de string:

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

Barra invertida seguida por outro caractere que não é uma letra ou dígito representa esse dígito. (Pelo menos com a implementação histórica do awk e com o GNU awk - algumas implementações do awk deixam a barra invertida sozinha quando é seguida por um caractere como | que o awk não considera especial.)

Quando você quiser que o awk emita a seqüência de caracteres \| , você precisa proteger a barra invertida em uma string literal, então escreva '"\ |".

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