Portál AbcLinuxu, 26. dubna 2024 22:24
Dobry den,
pri mereni uploadu mam textovy vystup ve forme:
upload.exe: 5.57 MB 3.47 MB/s
nevim jak bych mohl ale tento textovy vystup zkratit pouze na posledni hodnotu tedy v tomto pripade 3.47MB/s abych ji mohl nasledne ulozit do promene.Asi to pude pomoci sedu ale nevim jak to provest.
Dekuji vsem za pripadnou pomoc.
Kamil
$ echo "upload.exe: 5.57 MB 3.47 MB/s" | sed -r s/'( +)/ /g' | cut -d " " -f 4,5 3.47 MB/s
ta rychlost je ale pokazde jina.tedy misto toho vystupu ktery vykazuje prikaz ncftpput forme nazev souboru -upload.exe- ,velikost souboru -5.57MB- a rychlost x.xx MB/s
upload.exe: 5.57 MB 3.47 MB/s mi staci jen ta rychlost x.xx MB/s ktera je pokazde jina
jeste jsem zapomel dodat ze abych to mohl ulozit do promene to oznaceni MB/s musi byt take odfiltrovano aby zustala ciste ciselna hodnota kterou potom ulozim do promene a dale pouzivam.
kamil
RYCHLOST=$(echo "upload.exe: 5.57 MB 3.47 MB/s" |sed 's/.* \([0-9\.]*\) MB\/s/\1/')
Nebo:
sed 's/.* \([0-9\.]* MB\/s\)/\1/'
omlouvam se ale asi jsem se spatne vyjadril.situace je takova :
po zadani
ncftpput -u jmeno -p heslo ipadresa / upload.exe
se v konzole objevi
upload.exe: 5.57 MB 3.53 MB/s
no a ja bych potreboval zpracovat ten menici se udaj udaj x.xx MB/s tak aby s neho vznikla ciselna promena
kamil
Tohle mi uz funguje:
/usr/local/sbin//ncftpput -u jmeno -p heslo ipadresa / upload.exe 2>&1|sed 's/.* \([0-9\.]*\) MB\/s/\1/'
ale vysledek jsou dva radky treba
3.45
3.45
jak to zredukovat na jednoradkovy vystup?
kamil
Programy ncftpget a ncftpput vypisuji na stderr informaci o průběhu své činosti, vše se vypisuje na jeden řádek, protože programy využívají '\r' tj. znak "návrat vozíku", takže se původní řádek vždy přepíše. Takže pro relevantní informace nemůžeš použít uvedené řešení pomocí sed. Jako příklad uvádím řešení v Pythonu (v komentáři je uvedeno co se vypisuje na stderr, vše se načte do proměných a s nimi můžeš nakládat dle libosti):
#!/usr/bin/python import subprocess ftp_client = "ncftpget" ftp_file = "ftp://cdimage.debian.org/debian-cd/5.0.0/i386/iso-cd/debian-500-i386-CD-1.iso" pipe = subprocess.Popen("%s %s" % (ftp_client, ftp_file), shell = True, universal_newlines = True, stderr = subprocess.PIPE).stderr while (1): line = pipe.readline() try: # debian-500-i386-CD-1.iso: ETA: 78:31 35.71/646.46 MB 132.75 kB/s file, eta, time, sum, sum_unit, speed, speed_unit = line.split() print "%s %s %s" % (file, speed, speed_unit) except: pass pipe.close()
$ ./ftp.py
debian-500-i386-CD-1.iso: 104.90 kB/s
debian-500-i386-CD-1.iso: 68.32 kB/s
debian-500-i386-CD-1.iso: 66.48 kB/s
debian-500-i386-CD-1.iso: 65.90 kB/s
debian-500-i386-CD-1.iso: 65.68 kB/s
debian-500-i386-CD-1.iso: 63.53 kB/s
sed -nr '$s/.* ([0-9.]+ [^ ]+)$/\1/p'
sed -nr '$s/.* ([0-9.]+ [^ ]+)$/\1/p'
tohleto mi nefunfuje. neco podobneho pouzivam pro wget :
wget soubor 2>&1 | sed -n 's/.*(\([^ ]*\).*saved.*/\1/;T;p'
a vyhodi to jen ciselnou hodnotu. opravdu to nejde nejak vymaknout aby to na jednom radku vypsalo ciste hodnotu za pouziti ncftppup ?
dekuji vsem za ruzne napady uz jsem to vyresil .
ncftpput -u jmeno -p heslo ipadresa / upload.exe 2>&1|sed 's/.* \([0-9\.]*\) MB\/s/\1/' | sed '$d'
vypise to jen jeden radek
Dekuji vsem za rady.
Kamil
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.