15

我想制作一个连接到我的 MySQL 服务器并从 txt 文件中插入一些值的 bash 脚本。我把这个写下来:

#!/bin/bash
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test;

但我收到以下错误:

第 1 行的错误 1136 (21S01):列计数与第 1 行的值计数不匹配

我想错误在我的 txt 文件中,但我尝试了很多变体,但仍然没有成功的希望。

我的 txt 文件如下所示:

10.16.54.29 00:f8:e5:33:22:3f 马尔萨拉

4

5 回答 5

20

试试这个:

#!/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 命令执行。

于 2013-08-01T15:07:00.400 回答
11

假设您有很多行要添加,您可能需要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通过阅读文档,您会发现许多选项。

于 2013-08-01T15:01:12.260 回答
5

您试图在需要 3 个参数(IP、MAC 和 SERVER)的 INSERT 语句中将值“cat test.txt”作为字符串插入数据库中,这就是您收到此错误消息的原因。

您需要先阅读文本文件并提取 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;
于 2013-08-01T15:03:04.163 回答
3

我使用它并且它有效:

mysql -uroot -proot < infile

或者先选择数据库

./mysql -uroot -proot db_name < infile

或将整个 SQL 复制到剪贴板并粘贴

pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile
于 2014-06-25T11:59:27.270 回答
1
#!/bin/bash

username=root
password=root
dbname=myDB
host=localhost
TS=$(date +%s)

echo $1
mysql -h$host -D$dbname -u$username -p$password -e"INSERT INTO dailyTemp (UTS, tempF) VALUES ($TS, $1);"

exit 0 
于 2020-10-07T23:22:19.963 回答