배열의 모든 값을 추가하는 방법

배열의 모든 값을 추가하는 방법

나는 오랫동안 이 문제에 갇혀 있었습니다. 인터넷 검색을 시도했지만 원하는 것을 찾을 수 없습니다.

배열의 모든 값을 추가하기만 하면 됩니다. (패킷이라는 배열) 추가할 수 있는 수준까지 왔는데, 이렇게 되면 나중에 스크립트에서 숫자 값을 호출할 수 없게 됩니다.

다음은 매우 간단한 전체 스크립트입니다. 패킷 데이터 볼륨과 시간(대역폭이라고도 함)을 확인하세요.

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

이는 메서드 내에서 정보를 공유하지 않고 순차적으로 실행되는 수천 개의 명령이 아니라 동시에 실행되는 두 개의 명령입니다. 또한 타임스탬프도 올바르게 처리합니다.

어떤 이유로 쉘 변수에 해당 항목을 추가하려면 다음을 수행하십시오.

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).

관련 정보