2017-04-24 35 views
0

我需要插入以下逗號分隔的字符串從標準輸出(SPEEDTEST-CLI)進入一個MySQL分貝進口逗號分隔的字符串從管到MySQL數據庫

1746,Vodafone DE,Frankfurt,2017-04-24T16:00:13.708464,292.1655728839447,267.019,119047915.27025849,12007236.796291795 

柱說明如下: SERVER_ID,SPONSOR,SERVER_NAME, TIMESTAMP,DISTANCE,PING,下載,上傳

什麼是最好的方式做到這一點,而不需要將數據保存到csv,然後將其導入到MySQL?

我能轉換逗號分隔的數據sqlable數據

SQL_RESULT_DATA=$(echo $RESULT_DATA | sed -e "s/,/','/g;s/^\(.*\)$/'\1'/") 

mysql --host=10.8.0.18 --user speedtest --password=speedtest < echo "INSERT INTO `TEST_DATA` (`SERVER_ID`, `SPONSOR`, `SERVER_NAME`, `TIMESTAMP`, `DISTANCE`, `PING`, `DOWNLOAD`, `UPLOAD`) VALUES ($SQL_RESULT_DATA)" 

失敗

-bash: TEST_DATA: command not found 
-bash: SERVER_ID: command not found 
-bash: SPONSOR: command not found 
-bash: SERVER_NAME: command not found 
-bash: TIMESTAMP: command not found 
-bash: DISTANCE: command not found 
-bash: PING: command not found 
-bash: DOWNLOAD: command not found 
-bash: UPLOAD: command not found 
-bash: echo: No such file or directory 

表說明:

MySQL [speedtest]> DESCRIBE TEST_DATA 
+-------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+-------------+---------+------+-----+---------+----------------+ 
| TEST_ID  | int(11) | NO | PRI | NULL | auto_increment | 
| SERVER_ID | int(11) | NO |  | NULL |    | 
| SPONSOR  | text | NO |  | NULL |    | 
| SERVER_NAME | text | NO |  | NULL |    | 
| TIMESTAMP | text | NO |  | NULL |    | 
| DISTANCE | int(11) | NO |  | NULL |    | 
| PING  | int(11) | NO |  | NULL |    | 
| DOWNLOAD | int(11) | NO |  | NULL |    | 
| UPLOAD  | int(11) | NO |  | NULL |    | 
+-------------+---------+------+-----+---------+----------------+ 
+0

在最少顯示隱含的mysql表的相應字段名稱 – RomanPerekhrest

+0

字段是否可能包含逗號,字段用引號括起來以保護它?這使得在shell腳本中解析它變得更加困難。 – Barmar

+1

關於'LOAD DATA INFILE'的MySQL文檔顯示瞭如何使用命名管道來避免將CSV數據保存到真實文件中。 – Barmar

回答

0

讓我對你的測試字符串解釋你的錯誤,

mysql --host=10.8.0.18 --user speedtest --password=speedtest < echo 

意味着

"「從名爲echo文件標準輸入讀取」,「開始另一個mysql參數作爲字符串,空格都包含在這個論點」

INSERT INTO `TEST_DATA` 

「執行命令TEST_DATA並插入它在這個字符串輸出」

(`SERVER_ID`, `SPONSOR`, `SERVER_NAME`, `TIMESTAMP`, `DISTANCE`, `PING`, `DOWNLOAD`, `UPLOAD`) VALUES ($SQL_RESULT_DATA)" 

包含相同的錯誤上面,因爲反引號用於產卵子shell的得到它的結果

要使用什麼是mysql命令的-e參數傳遞一個查詢,該查詢你需要的內部逃避反引號,因爲像

mysql --host=10.8.0.18 --user speedtest --password=speedtest -e "INSERT INTO \`TEST_DATA\` (\`SERVER_ID\`, \`SPONSOR\`, \`SERVER_NAME\`, \`TIMESTAMP\`, \`DISTANCE\`, \`PING\`, \`DOWNLOAD\`, \`UPLOAD\`) VALUES ($SQL_RESULT_DATA)"

參見:

確保引用SQL_RESULT_DATA表達這樣

SQL_RESULT_DATA="$(echo $RESULT_DATA | sed -e "s/,/','/g;s/^\(.*\)$/'\1'/")" 

,因爲否則可能導致未來討厭的通配和分詞的問題,都不可能導致安全問題,看到https://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells