나는 오랫동안 이 문제에 갇혀 있었습니다. 인터넷 검색을 시도했지만 원하는 것을 찾을 수 없습니다.
배열의 모든 값을 추가하기만 하면 됩니다. (패킷이라는 배열) 추가할 수 있는 수준까지 왔는데, 이렇게 되면 나중에 스크립트에서 숫자 값을 호출할 수 없게 됩니다.
다음은 매우 간단한 전체 스크립트입니다. 패킷 데이터 볼륨과 시간(대역폭이라고도 함)을 확인하세요.
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)
.