#!/bin/bash
cat input.txt | while read ips
do
cmd="$(snmpwalk -v2c -c abc@123 $ips sysUpTimeInstance)"
echo "$ips ---> $cmd"
echo "$ips $cmd" >> out_uptime.txt
done
如何将线程添加到这个bash脚本中,我有大约80000个输入,这需要很多时间?
最佳答案
简单的方法。假设输出的顺序不重要,并且snmpwalk
的输出如果失败也不重要,那么在每个命令的结尾处放置一个&&
作为后台命令,除了最后一个命令的结尾处应该有一个&
:
#!/bin/bash
while read ips
do
cmd="$(nice snmpwalk -v2c -c abc@123 $ips sysUpTimeInstance)" &&
echo "$ips ---> $cmd" &&
echo "$ips $cmd" >> out_uptime.txt &
done < input.txt
不那么简单。如果
snmpwalk
可能会失败,并且还需要输出,则丢失&&
,并用大括号将代码括起来,{}
,然后是&
。要重定向附加的输出以包含标准错误,请使用&>>
:#!/bin/bash
while read ips
do {
cmd="$(nice snmpwalk -v2c -c abc@123 $ips sysUpTimeInstance)"
echo "$ips ---> $cmd"
echo "$ips $cmd" &>> out_uptime.txt
} &
done < input.txt
大括号可以包含更复杂的
if ... then ... else ... fi
语句,所有这些语句都是基于背景的。对于那些没有复杂的
snmpwalk
命令要测试的人,这里有一个类似的循环,它打印1到5个命令,但在echo
命令之间随机休眠:for f in {1..5}; do
RANDOM=$f &&
sleep $((RANDOM/6000)) &&
echo $f &
done 2> /dev/null | cat
每次输出都是相同的(对于不同的输出,删除
RANDOM=$f &&
),并需要三秒钟来运行:2
4
1
3
5
将其与不带
&&
s和&
的代码进行比较:for f in {1..5}; do
RANDOM=$f
sleep $((RANDOM/6000))
echo $f
done 2> /dev/null | cat
运行时,代码需要7秒钟才能运行,输出如下:
1
2
3
4
5