[英]Copy data from one database into another using bash
我需要将数据从一个数据库复制到我自己的数据库中,因为我想将其作为日常cronjob运行,所以我希望将其存储在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
我从数据库中获取了我需要的数据,并将其存储在一个用空格分隔的新文件中。 然后,我逐行读取文件并将值存储在变量中,最后我使用正确的变量运行插入查询。
我认为在存储值时出了点问题,但我无法弄清楚到底出了什么问题。
用于获取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}')
没有理由循环调用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.