2010-09-29 54 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 
相关问题