Импортировать вывод команды linux в таблицу MySQL

0

Я пытаюсь создать инвентарь моих экземпляров Google Cloud Cloud и сохранить его в отдельной базе данных MySQL, поэтому я могу использовать его в наших существующих локальных ресурсах.

Чтобы получить список экземпляров gcloud, я могу запустить следующее:

$> gcloud sql instances list

Что вернет что-то вроде:

NAME    DATABASE_VERSION  LOCATION        TIER         ADDRESS         STATUS
inst3   MYSQL_5_7         europe-west4-b  db-f1-micro  xx.xx.xx.xx     RUNNABLE
inst2   MYSQL_5_6         europe-west4-b  db-f1-micro  xx.xx.xx.xx     RUNNABLE
zandra  MYSQL_5_7         europe-west4-c  db-f1-micro  xx.xx.xx.xx     RUNNABLE

В сценарии bash, если я запускаю это как:

$> allinstances='gcloud sql instances list'

чтобы установить переменную, называемую allinstances, как я тогда вставляю ее в таблицу mysql, называемую gcloudinv

Я пробовал это, ожидая ошибки:

$> mysql -uuser -ppassword gcloudinv < allinstances

Я знаю, что это не сработает, но что мне нужно сделать между ними, чтобы превратить вывод в формат, с которым может работать mysql.

В идеале я буду переписывать этот базовый инвентарь ежедневно.

Спасибо

  • 1
    Я бы сделал это как скрипт bash. Запустите команду в одной строке и выполните цикл по каждой строке результата ( stackoverflow.com/questions/35927760/… ), игнорируя первую, сохраняя каждое значение в переменной. Затем используйте команду mysql, чтобы вставить значения, необходимые для ваших целей.
Теги:
google-cloud-platform
google-cloud-sql

1 ответ

2
Лучший ответ
# just craete table if does not exists query
query="CREATE TABLE IF NOT EXISTS 'gcloud' ( NAME varchar(255), DATABASE_VERSION  varchar(255), LOCATION varchar(255), TIER varchar(255), ADDRESS varchar(255), STATUS varchar(255) ); "
# convert the lines in format 'string[spaces]string[spaces] and so on' into a 'insert into 'gcloud' ( string , string, and so on );'
query+="$(  gcloud sql instances list | tail -n +2 | while read -r name database_location location tier address status; do echo "insert into 'gcloud' ( '$name', '$database_location', '$location', '$tier', '$address', '$status' );"; done )"
# execute the query
mysql -uuser -ppassword gcloudinv -e "$query"

Заметки:

  • tail -n +2 удаляет первую строку со входа
  • Не используйте '' для получения вывода команды, он устарел и не может быть вложенным. Используйте $(.. )
  • Вы можете передать содержимое переменной в команду, используя HERE-строки, например: mysql -uuser -ppassword gcloudinv <<<"$allinstances"
  • После удаления первой строки это метр преобразования строки в оператор вставки mysql.
  • 0
    Спасибо за это, выглядит достаточно просто. Один вопрос, я получаю синтаксическую ошибку для состояния вставки, поскольку строковые значения не выводятся с одинарными кавычками или запятыми между: insert into instances ( mydb MYSQL_5_7 europe-west4-c db-f1-micro 00.00.00.00 RUNNABLE ); Какую часть я должен отредактировать, чтобы записать это в вывод?
  • 1
    mysql есть отличная документация, доступная онлайн: w3schools.com/sql/sql_insert.asp . Значения во вставке должны быть разделены запятой. Также я думаю, что забыл про qoutes. Вы разместили свой текст с пробелами внутри, возможно, в gcloud есть вкладки, не пробелы, а вы разместили пробелы. Попробуйте использовать while без IFS=' ' например, или используйте sed с s/[[:space:]]\+/, /g

Ещё вопросы

Сообщество Overcoder
Наверх
Меню