데이터베이스에 연결하고 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
코드는 정확하지만 보시다시피 모든 삽입 쿼리에서 데이터베이스에 연결됩니다. 제 질문은 데이터베이스에 한 번만 연결한 다음 여러 쿼리를 실행하고 모든 삽입 쿼리에서 동일한 작업을 수행하지 않고 종료하는 방법입니다.
답변1
mysql에 파이핑하여 이 작업을 수행할 수 있습니다.
while …
do
⋮
echo "INSERT INTO IP_MACTable (IP_Address, MAC) VALUES ('$ip','$mac');"
done | mysql -u root …
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 …
이렇게 하면 중간에 처리를 중단하면 MySQL이 트랜잭션을 롤백하므로 파일이 절반만 로드되는 일이 발생하지 않습니다. 또한 각 행을 개별적으로 커밋하는 대신 트랜잭션 내에서 실행하는 것이 일반적으로 훨씬 빠릅니다.