Como adicionar todos os valores em uma matriz

2

Eu tenho sido preso nisso por muito tempo agora. Tentei googling e não consegui encontrar o que eu estava procurando.

Eu simplesmente preciso adicionar todos os valores em uma matriz (matriz chamada pacotes) Cheguei ao ponto em que posso adicioná-los, no entanto, quando isso acontece, o valor numérico não pode ser chamado mais tarde no script.

Aqui está o script inteiro, bastante simples, apenas verificando a quantidade de dados de pacote em comparação com o tempo, também conhecido como largura de banda.

rawdata='tcpdump -nn -S -r test.pcap | awk '{print $1" "$NF}''
time="'echo "$rawdata" | sed -r 's/(.{15}).*//''"
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 ------------------------------------
    
por Korilic 08.06.2015 / 11:19

2 respostas

6

A coisa toda em awk , loops de shell não é a ferramenta certa para fazer esse tipo de processamento :

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

Observe como esses dois comandos são executados ao mesmo tempo em que milhares são executados em sequência sem compartilhar informações em sua abordagem. Este também lida com carimbos de hora corretamente.

Se, por algum motivo, você quiser aquelas variáveis do shell, você faria:

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"
    
por 08.06.2015 / 12:27
2

Para preencher a variável packets como uma matriz (linha única para um único item), altere a linha 12 para:

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

para processar itens individuais da matriz, você precisa usar @ em vez de * na linha 14:

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

Nota: Em vez de backticks como 'commands' , é preferível usar $(commands) .

    
por 08.06.2015 / 12:14