Сценарий 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