Re: lug-bg: sum and sort with bash
- Subject: Re: lug-bg: sum and sort with bash
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Fri, 22 Oct 2004 14:36:57 +0300
On Fri, Oct 22, 2004 at 04:19:44AM -0700, Ivailo Ivanov wrote:
[snip]
> Prosto iskam da mi se porediat sorces po napraven
> trafik ot tiah kam, koito i da e destination. Kato
> razbira se kato ima niakolko zapisa na edin i sashti
> source da mu se sumirat baitovete. I naprimer ako
> trafika e nai goliam ot 1.2.3.4 da izleze nai otgore
> sas saotvetnata stionost na sumarnia trafik ot nego
> sled tova vtoria po trafik i.t.n. Po dobre ot tova ne
> moga da go opisha. Blagodaria za scriptovete i
> vnimanieto.
А, това за сортирането го бях пропуснал... Това, което пратих вчера,
което първо прави един sort и после с while read чете ред по ред и
проверява дали още сме на същия IP адрес, само извежда по IP адреси, не
ги подрежда после. Можеш да го накараш и да подреди с още едно
извикване на sort след това:
sort traffic.txt | sh sum.sh | sort -n -r -k2
Първото сортиране няма нужда да подрежда всичко както трябва, само
трябва да събере редовете, които започват по един и същи начин така, че
sum.sh да ги чете един след друг. След това sum.sh извежда нещата във
формат подобен на:
1.2.3.4 120
12.1.5.2 60
5.24.7.2 40
5.6.7.8 130
...а след това sort -n (числово, така че 12 да бъде след 2) -r (в
обратен ред, така че най-голямото число да бъде най-отгоре) -k2 (по
втората колона, защото първата съдържа IP адреса) ще ги подреди както
трябва:
5.6.7.8 130
1.2.3.4 120
12.1.5.2 60
5.24.7.2 40
Това е при положение, че traffic.txt и sum.sh са както следва:
----- begin traffic.txt
5.24.7.2 1.2.3.4 10 10 20
5.6.7.8 1.2.3.4 10 10 30
1.2.3.4 6.7.8.9 20 20 40
12.1.5.2 6.7.43.2 20 20 20
5.6.7.8 6.7.8.9 20 20 40
1.2.3.4 5.6.7.8 10 10 20
----- end traffic.txt
----- begin sum.sh
#!/bin/sh
cursrc=''
curtraf=0
while read src dst t1 t2 t3; do
if [ "$src" != "$cursrc" ]; then
# Polzvame printf, a ne echo -e "$cursrc\t$curtraf", zashtoto
# kakto maj spomenah i v po-ranen mail do lug-bg, vsyshtnost
# njama portable nachin da ubedim echo da izvezhda specialni
# simvoli kato tabulacijata.
[ ! -z "$cursrc" ] && printf '%s\t%d\n' "$cursrc" "$curtraf"
cursrc="$src"
curtraf=0
fi
curtraf=`expr "$curtraf" + "$t1" + "$t2" + "$t3"`
# Ako naistina polzvash bash, a ne sh, i iskash scriptyt ti
# da vyrvi *samo* s bash, a ne s sh na razlichni mashini,
# gornijat red mozhe da byde i...
# curtraf=$(($curtraf + $t1 + $t2 + $t3))
done
# Za poslednija adres...
if [ $curtraf -ne 0 ]; then
printf '%s\t%d\n' "$cursrc" "$curtraf"
fi
----- end sum.sh
Поздрави,
Петър
--
Peter Pentchev roam@xxxxxxxxxxx roam@xxxxxxxx roam@xxxxxxxxxxx
PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
I am not the subject of this sentence.
Attachment:
pgpT_3SenS_tQ.pgp
Description: PGP signature
|