Здравствуйте!
Мне нужно парсить файл(FILE): брать оттуда имя пира, IP, по IP узнавать MAC (и сравнивать его с нужным типом оборудования), потом это все записывать в файл(GW_INFO) в виде:
$Peer-$GW_IP:$GW_MAC (вот так: [G14448]-192.168.1.223:38:3F:10:04:D4:AC )
Содержимое файла$FILE:
[G13646]
type=friend
host=192.168.1.234 ]
allow=g729
allow=g723
allow=alaw
allow=ulaw
qualify=yes
context=out
progressinband=never
[G14408]
type=friend
host=192.168.1.171
allow=g729
allow=g723
allow=alaw
allow=ulaw
qualify=yes
context=out
progressinband=never
[G14408]
type=friend ..и т.д. в таком же духе.....
и т.д.
Делаю это все в цикле (для эксперимента вынес sed за цикл)
Проблема с последним: sed'ом заменять переменную $Peer на строку:
$Peer-$GW_IP:$GW_MAC
Получается следующее:
1) Файл GW_INFO содержит: (до выполнения следующего пункта):
[G13646]-
[G14408]-
[G14409]-
[G14412]-
[G14448]-
2) После выполнения
sed -i "s/${Peer}/\[${Peer}\]-${GW_IP}:${GW_MAC}/g" /root/GW_INFO
[[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC36[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC6]-
[[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC0[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC]-
[[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC09]-
[[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC2]-
[[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC[[G14448]]-192.168.1.223:38:3F:10:04:D4:AC]-
Хочу в таком виде:
[G13646]-192.168.1.234:38:3F:10:04:D4:AC
[G14408]-192.168.1.171:38:3F:XX:XX:XX:XX
Теперь вопросы:
-почему при прохождении цикла оно каждый раз записывает одну и ту же переменную ( что не так с алгоритмом?)
-как преобразовать регулярку в sed для моей задачи?
Сам код:
#!/bin/bash
### VARIABLES
FILE=/root/GW_INFO #Destination of the file with GW's MAC-adresses
SIP_CONF=/etc/asterisk/sip.conf
COUNT=0
### END OF VARIABLES
### Block creates file GW_INFO and write to it GW's MAC-adresses getting ip-adresses from sip.conf
if test ! -f $FILE # Use "!" after "test" for test mode
then
echo "File GW_INFO exists"
else
touch /root/GW_INFO
echo "File GW_INFO created"
### END of block
GW_quantity=$(grep -c "\[G....." $SIP_CONF )
echo "GW counted, quantity = $GW_quantity"
### Creates \n in $File. P.S. rudimentaly for using SED command
### For Sed use "echo -e "\n" >> $FILE" only ( create only 1 line)
while [ $GW_quantity -ne 0 ]
do
echo -e "\n" >> $FILE
GW_quantity=$[$GW_quantity - 1]
done
### END of block
### Parse sip.conf
while read LINE
do
# Peer=0
# GW_IP=0
# GW_MAC=0
if [[ $LINE == "[G"* ]];
then
Peer=0
Peer=$LINE
let "COUNT = COUNT + 1"
echo $Peer
sed -i "${COUNT}a\ $Peer-" /root/GW_INFO
fi
if [[ $LINE == "host"* ]];
then
GW_IP=0
GW_IP=`echo "$LINE" | cut -d= -f2`
echo $GW_IP
GW_MAC=`echo $(nmap $GW_IP) | awk -F"MAC Address: " '{print $2}' | grep -v :38 | awk '{print $1}'`
echo $GW_MAC
fi
#sed -i "s/${Peer}/${Peer}-${GW_IP}:${GW_MAC}/g" /root/GW_INFO Изначально планировал sed здесь
done < $SIP_CONF
echo "FOR TEST:"
echo $Peer
echo $GW_IP
echo $GW_MAC
sed -i "s/${Peer}/\[${Peer}\]-${GW_IP}:${GW_MAC}/g" /root/GW_INFO
fi
P.S. Это мой первый опыт использования bash
P.S.S. Знаю, что на Питоне/Перле и т.д. это можно сделать гораздо красивей