Text-Processing

製作表格輸出

  • April 24, 2015

如果可以在 perl 腳本中執行 snmpwalk 並將輸出放入表中以進行某種關聯,例如對於我在同一行中的每個主機名,如果 index 和 desc 我在 bash 中有腳本但我有輸出不要給我想要的協會所以我需要你的幫助

#!/bin/bash
Rep_Scripts='/home/scripts'
out_file='/home/scripts/out_file'
rm -rf $Rep_Scripts/out_file

for i in `cat $Rep_Scripts/IP_ALU_LIST.txt | awk '{print}'`
do
read hostname ip <<< $(echo $i |sed 's/;/ /')


       echo "${hostname} ==> ${ip} If_Name" >> out_file
       snmpwalk -v2c -c ${ip} OID>> out_file
       echo "${hostname} ==> ${ip} Global_If_Index" >> out_file
        snmpwalk -v2c -c ${ip} OID >>  out_file
       echo "${hostname} ==> ${ip} If_Statut" >> out_file
       snmpwalk -v2c -c  ${ip} OID >> out_file


done

我在 IP_ALU_LIST.txt

router2;89.100.12.100
router3;100.100.100.100

首先,重構你的問題:

如何建構一個 perl 腳本,為每個 IP/主機從 snmpwalk 輸入數據並為每個 OID 輸出一個表。

其次,您的範例snmpwalk命令沒有意義。OID如果是一個變數,這可能是有意義的。您可能的意思是使用 snmpwalk -v2 -c public $ {ip} $ {OID}

你可以這樣做:

#!/usr/bin/env perl -w
# Invoke via $0 <ip-address-file> <OIDs ... >
$input_file=shift @ARGV;
$oids=join(" ",@ARGV);
$oids gt '' || die "Please provide at least one OID for snmpget to fetch"

format STDOUT_TOP = 
@<<<<<<<<<<<  @>>>>>>>>>>>>>>>>>>>
$ip,$hostname
.
format STDOUT = 
@<<<<<<<<<<<<<<<<<<<<< @||||||||||||| @>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
$oid,$type,$value
.
$^L="\n\n\n";

# parse inputfile
open(IPFILE,$input_file) or die "Cannot open $input_file";
while (my $host=<IPFILE>) { 
 chomp $host;
 my ($hostname,$ip) = split(";",$host,2);

 open(SNMP,"snmpget -v2 -cpublic $ip $oids |") or die "Cannot run snmpwalk"
 print "$hostname => $ip :\n";
 while ($_ = <SNMP>) { 
      if ( ($oid,$type,$value) = /^(.*?) = ([^:]+): (.*)$/ ) { 
         write
      } else {
         print STDERR  "Could not parse this output:\n  $_";
      }
 }
 $- = 0;
}

snmpget將為每個 OID 輸出一行。有關Perl“格式”和相關命令的更多資訊,請參見http://linux.die.net/man/1/perlform 。write$^L頁面分隔符設置為三個換行符,而不是傳統的頁面彈出字元(即 CTRL-L)。$- = 0;下次呼叫“write”時,該位實質上會強制一個新頁面(帶有新標題)。下次呼叫它時,它將具有新的$hostname$ip

引用自:https://unix.stackexchange.com/questions/198324