csv 출력을 위한 배열로 사용되는 for 루프의 변수

csv 출력을 위한 배열로 사용되는 for 루프의 변수

전체 데이터 센터를 cat6에서 cat6a로 다시 연결해야 하기 때문에 결과를 쉼표로 구분된 열로 구성하는 것을 목표로 솔루션을 찾으려고 노력해 왔습니다.

$DBFILE의 출력은 access1a access1b ...입니다.

표적:

    switch,switch-port,server,server-port
    access1a,1,server6,eth0
    access1a,2,server4,eth0
    access1a,3,server1,eth0

내 현재 출력은 다음과 같습니다.

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

for OUTPUT in $DBFILE
do
    /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","}'
    /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","}'
done

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

나는 다양한 배열과 for 루프 변형을 시도했지만 마지막 쿼리만 얻거나 전혀 작동하지 않습니다. 다음을 수행할 방법을 찾을 수 없는 것 같아서 물어볼 것이라고 생각했습니다.

답변1

간단한 전달 경로는 각 호출의 출력을 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에 익숙하지 않으므로 더 나은 옵션이 있을 수 있습니다.

답변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;}}'

이것이 도움이 됩니까?

관련 정보