LINUX.ORG.RU

Сообщения kondencator

 

sed замена переменной

Форум — Admin

Здравствуйте!

Мне нужно парсить файл(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. Знаю, что на Питоне/Перле и т.д. это можно сделать гораздо красивей

 , ,

kondencator
()

RSS подписка на новые темы