Я не могу прочитать отдельное ЗНАЧЕНИЕ из запроса mysql в awk. Я могу прочитать его в 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
Я хочу прочитать числовое ЗНАЧЕНИЕ в переменной lastdiff в awk. Любые рекомендуемые решения.
Вам нужно будет создать переменную в bash перед передачей ее в awk с -флагом v и так:
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
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
значение каждой последующей строки вывода команды.
Ваш скрипт использует $lastdiff
вместо lastdiff
с getline
. В awk
$lastdiff
относится к номеру поля lastdiff
текущей входной записи.