Сценарий Bash для вставки значений в MySQL
Я хочу создать скрипт bash, который подключается к моему MySQL-серверу и вставляет некоторую информацию из txt файла. Я написал это:
#!/bin/bash
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test;
но я получаю следующую ошибку:
ОШИБКА 1136 (21S01) в строке 1: Количество столбцов не соответствует количеству значений в строке 1
Я предполагаю, что ошибка в моем txt файле, но я пробовал много вариантов и до сих пор не надеюсь на успех.
Мой txt файл выглядит так:
10.16.54.29 00: f8: e5: 33: 22: 3f marsara
Ответы
Ответ 1
Попробуй это:
#!/bin/bash
inputfile="test.txt"
cat $inputfile | while read ip mac server; do
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('$ip', '$mac', '$server');"
done | mysql -uroot -ptest test;
Таким образом, вы также передаете файл, а также выполнение команды mysql.
Ответ 2
Предполагая, что у вас есть много строк для добавления, вам, вероятно, нужен оператор LOAD DATA INFILE
, а не INSERT
. Исходный файл должен быть на сервере, но, похоже, здесь.
Что-то вроде того:
#!/bin/bash
mysql -uroot -ptest test << EOF
LOAD DATA INFILE 'test.txt'
INTO TABLE tbl_name
FIELDS TERMINATED BY ' ';
EOF
LOAD DATA INFILE
имеет множество опций, которые вы обнаружите, прочитав документ.
Ответ 3
Вы пытаетесь вставить значение "cat test.txt" в виде строки в базе данных в инструкции INSERT, которая требует 3 параметра (IP, MAC и SERVER), поэтому вы получаете это сообщение об ошибке.
Сначала вам нужно прочитать текстовый файл и извлечь значения IP, MAC и сервера, а затем использовать их в запросе, который будет выглядеть так:
#!/bin/bash
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('10.16.54.29', '00:f8:e5:33:22:3f', 'marsara');" | mysql -uroot -ptest test;
Ответ 4
Я использую это, и он работает:
mysql -uroot -proot < infile
или сначала выберите базу данных
./mysql -uroot -proot db_name < infile
или скопировать весь SQL в буфер обмена и вставить его с помощью
pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile