while循环运行正常。
但是想知道是否有一种方法可以同时运行文件中的所有行,然后通过相同的命令集运行变量,而不是等待每个接口3秒?
while read line; do
before=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$line | awk '{print $4}')
sleep 3
after=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$line | awk '{print $4}')
res=$(bc <<< "$after-$before")
zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) " | bc)
per=$(echo "scale=1; 100 * $zxc / (1000) " | bc)
done < intfile.txt
Thnaks
可以使用GNU的并行
将命令移动到单独的文件command.sh:
before=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$1 | awk '{print $4}')
sleep 3
after=$(snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$1 | awk '{print $4}')
res=$(bc <<< "$after-$before")
zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) " | bc)
per=$(echo "scale=1; 100 * $zxc / (1000) " | bc)
然后执行parallel以intfile.txt作为输入:
cat intfile.txt | parallel -j 5 'bash command.sh {}'
- :j 设置同时运行的作业数
根据@Gonzalo的回答,您可以使用bash函数将command.sh
移动到相同的脚本中:
walk_one() {
do_the_walk() {
snmpwalk -v2c -c public 1.1.1.1 .1.3.6.1.2.1.2.2.1.16.$1 |
awk '{print $4}'
}
before=$(do_the_walk $1)
sleep 3
after=$(do_the_walk $1)
res=$(bc <<< "$after-$before")
zxc=$(echo "$res * 8 * 100 / (1000000000 * 3) " | bc)
per=$(echo "scale=1; 100 * $zxc / (1000) " | bc)
}
export -f walk_one
cat intfile.txt | parallel -j 5 walk_one {}