同时运行文件的所有行



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 {}