mysql列の結果をawk変数として読み込みます。

mysql列の結果をawk変数として読み込みます。

awkのmysqlクエリから単一の値を読み取ることはできません。 bashでは読めますが、awkでは読めません。私はawkで書かれたいくつかの動的条件に基づいてクエリをトリガーしたいので、awkから結果変数を読みたいと思います。

awk '{
 cmd="(mysql --host='abc' --user='def' --password='..' --database='ghf' -sNe \"select VALUE from table where KEY='171-125';\")"
 cmd|getline $lastdiff;
 print "diff is "lastdiff;
}'


diff is

diff is

私も試してみましたがgrep -Eo \" [0-9]* \"/助けにはなりませんでした。私はそれらをすべて使用しましたsystem()またはcmd | getline結果を変数に入れますが、常に0を返します。

 sudo awk 'BEGIN {
>  myvalue=system("mysql --host='abc' --user='def' --password='..' --database='ghf' -sNe \"select VALUE from table where KEY='171-125';\" ");
>  print "diff is ",myvalue;
> }'
diff is  0

Bashが結果を提供しています

mysql --host='abc' --user='def' --password='..' --database='ghf' -sNe "select VALUE from table where KEY='171-125';"
1

awkのlastdiff変数にVALUE値を読みたいです。推奨されるソリューション。

答え1

mysql ... | awk '{ print "diff is", $0 }'

そうでなければ

mysql ... 'SELECT CONCAT("diff is ", VALUE) FROM ...'

中からawk

awk 'BEGIN { cmd = "mysql ..." }
     { cmd | getline value;
       printf("diff is %s\n", value); # or print "diff is", value;
       close(cmd) }'

これにより、スクリプトへの各入力行に対してコマンドが一度実行されますawk。それ以外の場合は、close()一度実行され、valueコマンドの各連続出力行の値を提供します。

スクリプトはwithの$lastdiff代わりに使用します。これらのうち、現在の入力レコードのフィールド番号を表します。lastdiffgetlineawk$lastdifflastdiff

答え2

bashで変数を生成し、-vフラグを使用してawkに渡す必要があります。

cmd=$(mysql --host='abc' --user='def' --password='..' --database='ghf' -sNe \"select VALUE from table where KEY='171-125';\")
awk -v cmd=$cmd '{ some awk script }'

または mysql の出力を解析するには:

awk '{ some awk script }' <<< $cmd

関連情報