2016-11-14 8 views
1

У меня есть полный файл хоста для распределенной системы сетевого мониторинга, который мне нужно разделить на два файла. Некоторые из хостов идут в одном файле, а остальные - в другом. Я использую sed, чтобы вытащить хосты, которые мне нужны, но я не знаю, как поместить все остальное в другой файл, вроде как -v для grep.Выделить все, кроме блока текста

Пример хост-файла:

object Host "router" { 
    import "template" 
    display_name = "router" 
    address = "xx.xx.xx.xx " 
} 

object Host "switch" { 
    import "template" 
    display_name = "switch" 
    address = "xx.xx.xx.xx " 
} 

object Host "router" { 
    import "template" 
    display_name = "router" 
    address = "xx.xx.xx.xx " 
} 

object Host "otherthing" { 
    import "template" 
    display_name = "otherthing" 
    address = "xx.xx.xx.xx " 
} 

object Host "switch" { 
    import "template" 
    display_name = "switch" 
    address = "xx.xx.xx.xx " 
} 

object Host "otherthing" { 
    import "template" 
    display_name = "otherthing" 
    address = "xx.xx.xx.xx " 
} 

sed команды я использую, чтобы вытащить из маршрутизаторов

sed '/router.*\n/p;//g;/{$/,/^}/H;//x;D' files/tmp/unsorted-host.tmp >> files/router.conf 

Кроме того, я не знаю, если это будет более эффективно сортировки вместо для создания большого файла хоста, но вот как я делаю большой файл хоста:

while read line 
     do 
       # The SNMP to check the device type outputs on multiple lines, check to ensure we only grab IP's 
       getip=$(echo $line | awk '{print $1}') 
       if ping -c 1 $getip &> /dev/null 
         then 
         ip=$getip 
         else 
         trash=$getip 
       fi 
       template="template" 
       host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community1 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}') 
       if [ -z "$host_name" ] 
         then 
         host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community2 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}') 
         if [ -z "$host_name" ] 
           then 
           host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community3 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}') 
           if [ -z "$host_name" ] 
             then 
             host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community4 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}') 
             if [ -z "$host_name" ] 
               then 
               host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community5 $ip 1.3.6.1.2.1.1.5.0 | awk '{print $NF}') 
               if [ -z "$host_name" ] 
                 then 
                 host_name=$(echo " Not found ") 

               fi 
             fi 
           fi 
         fi 
       fi 
       echo " 
object Host $host_name { 
    import \"$template\" 
    display_name = $host_name 
    address = \"$ip \" 
}" 
     done <files/tmp/hosts.tmp> files/tmp/unsorted-hosts.tmp 

Целью было бы иметь два файла: один с маршрутизаторами и один со всем остальным. Спасибо заранее за любые советы!

+0

Я не смотрел ваш оператор 'sed' подробно, но если вы можете найти все, что вам нужно, с помощью' sed', то вы не можете просто сделать ' sed', чтобы удалить материал маршрутизатора? – TTT

ответ

1

Это не ответ: Я считаю, что большой вложенной if болезненным. Быстрый ответ:

while read -r ip rest_of_line; do 
    # The SNMP to check the device type outputs on multiple lines, check to ensure we only grab IP's 
    ping -c 1 "$ip" &> /dev/null || continue 
    template="template" 
    host_name= 
    for n in 1 2 3 4 5; do 
     host_name=$(timeout -s KILL 2 /usr/bin/snmpwalk -v 2c -c community$n "$ip" 1.3.6.1.2.1.1.5.0 | awk '{print $NF}') 
     [ -n "$host_name" ] && break 
    done 
    if [ -z "$host_name" ]; then 
     echo "host not found for ip $ip" >&2 
     continue 
    fi 
    echo " 
object Host $host_name { 
    import \"$template\" 
    display_name = $host_name 
    address = \"$ip \" 
}" 
done <files/tmp/hosts.tmp> files/tmp/unsorted-hosts.tmp 
+0

Хотел бы я сделать что-то подобное, но сообщества на самом деле являются текстовыми строками. Я просто заменил их community1 community2 и т. Д. Для обеспечения конфиденциальности. – cflinspach

+0

Тогда сделайте 'для c в community1 community2 community3 ...' –

+0

Я дам ему шанс, спасибо! Этот сайт действительно потрясающий, и вы все очень помогаете. – cflinspach