#!/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

10-06 13:51