配列のすべての値を追加する方法

配列のすべての値を追加する方法

私は長い間この問題に閉じ込められていました。インターネットを検索しようとしましたが、欲しいものが見つかりませんでした。

配列のすべての値を追加するだけです。 (パケットという配列)追加できるレベルまで来ましたが、これにより後でスクリプトから数値を呼び出すことができなくなります。

以下は非常にシンプルなフルスクリプトです。パケットデータ量と時間(帯域幅とも呼ばれます)を確認してください。

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

すべての仕事を終えるawkシェルループは、このタイプの処理に適したツールではありません。:

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

これは、メソッド内で情報を共有せずに順次実行される何千ものコマンドではなく、同時に実行される2つのコマンドです。また、タイムスタンプも正しく処理します。

何らかの理由でシェル変数に対応するエントリを追加するには:

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)

関連情報