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]* "
ただし、これをシェルに渡すとエラーが発生します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]* \""