我有一个包含4列的.csv文件。我在向表中输入第一列时遇到了问题。下面是脚本:
#!/bin/bash
_csvfile="/logstash/Mysql-Data.csv"
#Create the tables if they dont exists
mysql -u user -ppassword logstash << eof
CREATE TABLE IF NOT EXISTS \`elkDevIndexAssoc\` (
cenDevSID varchar(255),
cenDevFQDN varchar(255),
cenDevIP varchar(255),
cenDevServiceName varchar(255)
)
eof
#Format the csv, replace ";" with ","
sed -i -e 's/;/,/g' $_csvfile
#sed -i -e 's/^/,/g' $_csvfile
IFS=,
while read column1 column2 column3 column4
do
echo "INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('$column1', '$column2', '$column3', '$column4');"
done < Mysql-Data.csv | mysql --user='user' --password='password' -D logstash;如果我回显每个列变量,例如$column1 - 4,输出看起来很好。如下所示:
123213 serverfqdn 127.0.0.1 mysql但是当我随后尝试将其导入mysql时,第一列丢失了,如下所示:
mysql> select * from elkDevIndexAssoc;
+-----------+------------------------------------------------+---------------- -+--------------------+
| column1 | column2 | column3 | column4 |
+-----------+------------------------------------------------+---------------- -+--------------------+
|column1 | column2 | column3 | column4
| | serverfqdn | 127.0.0.1 | mysql我不明白为什么当我将第一列导入mysql时,第一列会丢失,而当我分别回显每个变量时,却不会丢失。
编辑:我的.csv文件格式如下:
S123123,serverfqdn,127.0.0.1,service
S123123,serverfqdn,127.0.0.1,service
S123123,serverfqdn,127.0.0.1,service
S123123,serverfqdn,127.0.0.1,service发布于 2018-06-18 19:21:39
您的mysql命令应该在您的循环中:
while read column1 column2 column3 column4; do
echo "INSERT INTO ..." | mysql --user='user' --password='password' -D logstash;
done < Mysql-Data.csvOT:您不需要在echo字符串中使用分号来终止mysql命令。
发布于 2018-06-18 20:46:45
好的,这样它应该可以工作(在本地测试):
IFS=,
while read column1 column2 column3 column4; do
echo "INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('$column1', '$column2', '$column3', '$column4')"
done < <(sed 's/;/,/g' < Mysql-Data.csv)sed不会修改您的csv文件,但您的循环会从中读取。在我的示例中,循环输入来自done后面。注意IFS=,它将影响脚本的其余部分,因此最好将其限制为sed命令(以某种方式)。
上面的脚本将您的数据扩展为:
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')在循环中通过管道将echo命令的以下输出发送到mysql:
while ...
echo "..." | mysql -u... -p...
done ...并且不要忘记在验证之前截断您的表,这样您就不会计算旧的(错误的)数据。;)
https://stackoverflow.com/questions/50907901
复制相似问题