Переменная в цикле for, которая будет использоваться в качестве массива для вывода csv

Вы можете использовать Vim в режиме Ex:

ex -sc '%s/^/     /|x' file
  1. % выбрать все строки

  2. s заменить

  3. x сохранить и закрыть

0
11.01.2019, 13:30
2 ответа

Я не знаком с snmpwalk, но из вопроса (и из моего предыдущего неправильного ответа) кажется, что он выдает несколько строк вывода. Мне также кажется, что большинство результатов вашего сценария повторяются/избыточны, т.е. всегда есть две строки с форматом:

A,B,C
...
A,B,D

и вы хотите получить другой результат с половиной строк и выглядящий как

A,B,C,D

В этом случае, возможно, будет проще оставить ваш сценарий как есть и передать вывод через трубу следующему сценарию AWK:

BEGIN{
  FS=",";
}
{
  if ( ($1,$2) in A ) {
     print A[$1,$2] "," $3;
  } else {
     A[$1,$2]=$1 "," $2 "," $3;
  }
}

который выглядит следующим образом для однострочного сценария, который вы можете вырезать и вставить.

| awk 'BEGIN{FS=","}{if ( ($1,$2) in A ) {print A[$1,$2] "," $3;} else {A[$1,$2]=$1 "," $2 "," $3;}}'

Это поможет?

0
29.04.2021, 00:28

Простой путь вперед - поместить выходные данные каждого вызова snmpwalk в переменную, а затем объединить их с небольшим awk фильтрация, что-то вроде:

#!/bin/sh
DBFILE=$(cat /tmp/routers.all | awk -F: '{print $1}'| grep access)

for OUTPUT in $DBFILE do
    FIRST_HALF=`/usr/bin/snmpwalk -Os -c pass -v 2c $OUTPUT iso.0.8802.1.1.2.1.4.1.1.8.0 | tr -d "\"" | sed -r 's/ /./g' |awk  -F. '{print "'"$OUTPUT"'"","$13","$22","}'`
    SECOND_HALF=`/usr/bin/snmpwalk -Os -c pass -v 2c $OUTPUT iso.0.8802.1.1.2.1.4.1.1.9.0 | tr -d "\"" | sed -r 's/ /./g' |awk  -F. '{print "'"$OUTPUT"'"","$13","$17","}' |awk 'BEGIN{FS=","}{print($3)}'`
    echo ${FIRST_HALF}${SECOND_HALF}
done

что, я думаю, приводит к

access1a,1,server6,eth0
access1a,2,server4,eth0
access1a,3,server1,eth0

Помогает ли это?

Раскрытие: я не знаком с snmpwalk, поэтому может быть лучший вариант.

0
29.04.2021, 00:28

Теги

Похожие вопросы