2013-09-30 3 views
0

IP 목록을 파일에 저장하고 싶습니다. 파일에 출력을 쓰는 데 문제가 있습니다.파일에 두 개의 var를 인쇄하십시오.

OID=1.3.6.1.2.1.25.3.2.1.3.1 
cat printers.csv | while read IP ; do 
     OUT=$(snmpget -v1 -c public $IP $OID) 
     printf '%s, %s\n' $IP $OUT >> printerNames.csv 
done 

저는 printf 명령을 처음 사용합니다. 나는 그것이 잘못되어 bc 출력이 잘못 작성되었다고 추측하고있다. 또한 응답이 없으면 콘솔에 에코되어 출력 파일에 기록하고 싶습니다. 어떤 도움을 많이 주시면 감사하겠습니다.

답변

1

이 시도 :

OID=1.3.6.1.2.1.25.3.2.1.3.1 
while read IP ; do 
    OUT=$(snmpget -v1 -c public "$IP" "$OID") && printf '%s, %s\n' "$IP" "$OUT" 
done < printers.csv 2>&1 > printerNames.csv 

그것은 좋은 생각 당신이 좋은 이유가되지 않음을하지 않는 한 항상 인용 매개 변수를 확장합니다. 리디렉션은 while 루프에 적용됩니다. read은 입력 파일에서 한 번에 한 줄씩 읽습니다 (no cat 필요). 표준 오류에 기록 된 것은 대신 표준 출력에 복사되고 표준 출력 (오류 포함)은 출력 파일로 재 지정됩니다. printfsnmpget 명령이 성공한 경우에만 실행됩니다 (조회가 실패 할 경우 종료 상태가 0이 아니라고 가정 할 경우).


그것은 printers.csv 같은 소리하는 것은 (\r\n) DOS 라인 엔딩을 가지고있다. 캐리지 리턴은 각 행의 마지막 문자로 포함됩니다. $IP을 인쇄하면 주소를 인쇄 한 다음 캐리지 리턴을 인쇄하여 커서를 줄의 시작 부분으로 되돌립니다. 이로 인해 나머지 줄 (, $OUT)이 주소를 덮어 씁니다. 캐리지 리턴을 제거하려면 dos2unix을 통해 입력 파일을 실행하거나 다른 방법을 사용하여 DOS 줄 끝을 UNIX 줄 끝 (\n 만)으로 바꿉니다.

+0

'$ OUT'은 이제 제대로 쓰여지고 있지만'$ IP'은 쓰여지지 않고 stderr은 방향 전환되지 않고 있습니까? 출력은'iso.3.6 ... = STRING : 올바른 출력 인 "HP LaserJet P3005"와 같습니다. – ExceptionLimeCat

+3

'2> & 1'은 ** 'printerNames.csv' 후에 ** 동일한 파일로 리디렉션되어야합니다. 그렇지 않으면 * old * stdin으로 리디렉션됩니다. –

+0

Sir Athos가 오류를 리디렉션했지만 어떤 이유로 '$ IP'가 쓰여지지 않습니다. 2 개의 변수를'printf' 할 수 있습니까? – ExceptionLimeCat

관련 문제