我创建了一个 shell 脚本来从 dhcpd.log 文件连接到数据库和插入 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
Run Code Online (Sandbox Code Playgroud)
代码是正确的,但正如您所看到的,它在 while 内的每个插入查询都连接到数据库,我的问题是如何只连接到数据库一次然后执行多个查询然后退出而不连接到每个插入操作
您可以通过管道连接到 mysql:
while …
do
?
echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
done | mysql -u root …
Run Code Online (Sandbox Code Playgroud)
请注意我如何更改您的while循环以将它想要运行的查询输出到标准输出。然后我将你的 while do...done 循环传送到mysql.
您也可以通过管道传输子外壳,例如您可以执行以下操作:
(
echo "BEGIN;"
while … ; do
?
echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
done
echo "COMMIT;"
) | mysql -u root …
Run Code Online (Sandbox Code Playgroud)
这样,如果您在中间中止处理,MySQL 将回滚事务,因此您不会以半加载的文件结束。此外,在事务内运行(而不是单独提交每一行)通常要快得多。