如何循环调用snmpwalk并将设备名称拼接至Shell脚本输出行
如何循环调用snmpwalk并将设备名称拼接至Shell脚本输出行
我来帮你搞定这个需求!其实你只需要在现有脚本的输出后面加一个循环处理逻辑,逐行提取IP、调用snmpwalk获取设备名称,最后把结果拼接成你想要的格式就行。
完整脚本方案
直接把你原有的日志处理命令和新增的snmpwalk逻辑结合起来,代码如下:
grep 'Interface GigabitEthernet' * | \ sed 's/104-8-20-23.lightspeed.gnvlsc.sbcglobal.net/104.8.20.23/g' | \ sed 's/0.0.0.0: //g' | \ sed 's/.log:/ /g' | \ sed 's/Line protocol on //g' | \ sed 's/, changed state to//g' | \ awk '{print $1" "$2" "$3" "$4" "$12" "$13}' | \ sort -u -r -k 5,5 -k 4,4 | \ awk '!seen[$5]++' | while read ip date time interface state; do # 调用snmpwalk并提取设备名称(处理双引号包裹的字符串) device_name=$(snmpwalk -v1 -c public "$ip" 1.3.6.1.2.1.1.5.0 2>/dev/null | awk -F'"' '{print $2}') # 处理snmpwalk失败的情况,设置默认值 if [[ -z "$device_name" ]]; then device_name="Unknown" fi # 输出拼接后的结果行 echo "$ip $device_name $date $time $interface $state" done
关键部分解释
- 逐行读取输出:用
while read ip date time interface state把原有输出的每一行拆分成对应的字段,第一个字段就是我们需要的设备IP。 - 调用snmpwalk并提取设备名:
2>/dev/null用来屏蔽snmpwalk的错误输出(比如设备不可达、社区名错误等),避免干扰结果。- 用
awk -F'"' '{print $2}'提取snmpwalk结果中双引号包裹的设备名称,刚好对应你示例里的"C3725"。
- 容错处理:如果snmpwalk执行失败(比如IP不通),设备名会是空值,这时候我们给它设置一个默认值"Unknown",保证输出格式统一。
- 拼接输出:按照你想要的格式,把IP、设备名、原有字段依次拼接后输出。
注意事项
- 确保你的执行环境能访问目标设备的UDP 161端口(SNMP默认端口),防火墙没有限制流量。
- 确认目标设备的SNMP社区名是
public,如果不是,记得把脚本里的-c public替换成正确的社区名。 - 如果需要处理的设备数量很多,串行执行snmpwalk会比较慢,你可以考虑用
xargs之类的工具做并行处理,但普通场景下串行已经足够使用。
备注:内容来源于stack exchange,提问作者Lafayette
相关产品推荐
相关产品推荐

