Text-Processing
製作表格輸出
如果可以在 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
。