如何将数组中的所有值相加

如何将数组中的所有值相加

我已经坚持这个问题很长时间了。尝试谷歌搜索,但找不到我要找的东西。

我只需要添加一个数组中的所有值。(称为数据包的数组)我已经达到了可以添加它们的程度,但是当发生这种情况时,稍后在脚本中无法调用数字值。

这是整个脚本,非常简单,只需检查数据包数据量与时间(又称带宽)的比较。

rawdata=`tcpdump -nn -S -r test.pcap | awk '{print $1" "$NF}'`
time="`echo "$rawdata" | sed -r 's/(.{15}).*/\1/'`"
starttime="`echo "$time" | awk 'NR > 1 { exit }; 1'`"
endtime="`echo "$time" | awk 'END{print}'`"
stime=`date --date="$starttime" +%s`
etime=`date --date="$endtime" +%s`
difftime="echo $(($etime - $stime))"
echo $difftime
echo $addedpackets
echo $sum
echo ------------------------------------
packets="`echo "$rawdata" | awk '{print $2}' | sed 's/[^0-9]*//g'`"
echo ------------------------------------
for i in "${packets[*]}"
do
    plus=$(printf '%d+' ${i})0
    added="echo $(($plus))"
done
echo ------------------------------------
$added
$difftime
bc -l <<< "$added/$difftime"
echo ------------------------------------

答案1

完成所有事情awkshell 循环不是进行此类处理的正确工具:

tcpdump -tt -nn -S -r test.pcap | awk '
  NR == 1 {start = $1}
  {total += $NF}
  END {
    duration = $1 - start
    print "total:", total
    print "duration:", duration
    print "average:", total/duration
  }'

请注意,这是两个命令同时运行,而不是数千个命令按顺序运行,而无需在您的方法中共享信息。这也可以正确处理时间戳。

如果由于某种原因,你想要 shell 变量中的那些,你会这样做:

eval "$(
  tcpdump -tt -nn -S -r test.pcap | awk '
    NR == 1 {start = $1}
    {total += $NF}
    END {
      duration = $1 - start
      print "total=" total
      print "duration=" duration
      print "average=" total/duration
    }'
)"
echo "$total $duration $average"

答案2

要将变量填充packets为数组(单行填充单个项目),请将第 12 行更改为:

origifs="$IFS"
IFS=$'\r\n'
packets=($(echo "$rawdata" | awk '{print $2}' | sed 's/[^0-9]*//g'))
IFS="$origifs"

要处理数组中的各个项目,您必须使用@而不是*在第 14 行:

for i in "${packets[@]}"

注意:`commands`最好使用 ,而不是像这样的反引号$(commands)

相关内容