linux – 如何只连接一次Mysql?

我创建了一个shell脚本来连接到dhcpd.log文件中的DB和INSERT IP和MAC
脚本工作正常:

#/!bin/bash
#Defining Variables
dhcpLogFile="/var/log/dhcpd.log"

#Begin Code
# extrcting the Information of IPs and MACs from log file
# and eleminating the duplicate Entry
NumberOfLines=$(awk '/DHCPACK/ { print $8} ' $dhcpLogFile | awk '!x[$0]++'|awk 'BEGIN{i=0}{i++;}END{print i}')
j=1
while [ $NumberOfLines -gt 0 ]
do
ip=$(awk '/DHCPACK/ { print $8} ' $dhcpLogFile | awk '!x[$0]++' |cut -f$j -d$'\n')
mac=$(awk '/DHCPACK/ { print $10} ' $dhcpLogFile | awk '!x[$0]++' |cut -f$j -d$'\n')
echo $ip
echo $mac   
let "j +=1"
let "NumberOfLines -=1"
mysql -u root --password='pw' MatchingDB <<- _END_ 
INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');
_END_
done

代码是正确的,但正如你可以看到它在while内的每个插入查询都连接到DB,我的问题是如何只连接到DB一次然后执行多个查询然后退出而不连接每个插入操作

最佳答案
你可以通过管道到mysql来做到这一点:

while …
do
    ⋮
    echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
done | mysql -u root …

请注意我如何更改while循环以输出要运行到stdout的查询.然后我通过管道你做了…完成循环到mysql.

您也可以管道子shell,例如,您可以执行以下操作:

(
    echo "BEGIN;"
    while … ; do
        ⋮
        echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
    done
    echo "COMMIT;"
) | mysql -u root …

因此,如果您在中间中止处理,MySQL将回滚事务,因此您不会使用半载文件.此外,在事务内部运行(而不是单独提交每一行)通常要快得多.

转载注明原文:linux – 如何只连接一次Mysql? - 代码日志