2010-09-29 58 views
1

我需要將數據從一個數據庫複製到我自己的數據庫中,因爲我想將它作爲每日cronjob運行,所以我更喜歡將其用於bash。我還需要將值存儲在變量中,以便對值執行各種檢查/驗證。這是我走到這一步:使用bash將數據從一個數據庫複製到另一個數據庫

echo "SELECT * FROM table WHERE value='ABC' AND value2 IS NULL ORDER BY time" | mysql -u user -h ip db -p | sed 's/\t/,/g' | awk -F, '{print $3,$4,$5,$7 }' > Output 
cat Output | while read line 
do 
Value1=$(awk '{print "",$1}') 
Value2=$(awk '{print "",$2}') 
Value3=$(awk '{print "",$3}') 
Value4=$(awk '{print "",$4}') 
echo "INSERT INTO db (value1,value2,value3,value4,value5) VALUES($Value1,$Value2,'$Value3',$Value4,'n')" | mysql -u rb db -p 
done 

我得到我從數據庫中需要並將其存儲在由空格隔開一個新文件中的數據。然後我逐行讀取文件並將值存儲在變量中,最後我運行帶有正確變量的插入查詢。

我認爲存儲值時出現問題,但我無法真正弄清楚什麼地方出了問題。

+0

使用mysqlhotcopy的或pg_dump在 – MattSmith 2010-09-29 07:27:07

回答

0

用於獲取Value2,Value3和Value4的awk未獲得來自$line的輸入。你可以解決這個問題爲:

Value1=$(echo $line | awk '{print $1}') 
Value2=$(echo $line | awk '{print $2}') 
Value3=$(echo $line | awk '{print $3}') 
Value4=$(echo $line | awk '{print $4}')  
+0

感謝名單了很多,也做的工作對我來說! – Sander 2010-09-29 08:57:53

0

有沒有理由罵awk四次循環。這可能非常緩慢。如果因爲其他原因不需要臨時文件「輸出」,則根本不需要它 - 只需將輸出傳送到while循環。您可能不需要使用sed將選項卡更改爲逗號(順便說一句,您可以使用tr),因爲awk默認會在選項卡(和空格)上拆分字段(除非數據包含空格,但其中一些似乎不是) 。

echo "SELECT * FROM table WHERE value='ABC' AND value2 IS NULL ORDER BY time" | 
    mysql -u user -h ip db -p | 
    sed 's/\t/,/g' |     # can this be eliminated? 
    awk -F, '{print $3,$4,$5,$7 }' | # if you eliminate the previous line then omit the -F, 
    while read line 
    do 
     tmparray=($line) 
     Value1=${tmparray[0]} 
     Value2=${tmparray[1]} 
     Value3=${tmparray[2]} 
     Value4=${tmparray[3]} 
     echo "INSERT INTO predb (value1,value2,value3,value4,value5) VALUES($Value1,$Value2,'$Value3',$Value4,'n')" | mysql -u rb db -p 
    done 

它使用臨時數組將行中的值分開。這是另一種方式來做到這一點:

 set -- $line 
     Value1=$1 
     Value2=$2 
     Value3=$3 
     Value4=$4 
相關問題