wget, wput százalék elkapás

Van-e valamilyen módszer arra, hogy ha letöltök valamit wget-el vagy feltöltök wput-al csak magát a százalék értékét irassa ki, ne húzzon csikot meg pöttyöket. Van egy speckó kijelző és max echo-val tudok rá irogatni egy speckó pipe-on keresztül. A legjobb az lenne ha valami wrapper-el lehetne megoldani a problémát, ami kiolvasná egy fájlból vagy bárhonnan a wget aktuális százalékát, majd echo-val kinyomná a kijelzőre.

Hozzászólások

... vagy a progress.c-t átírva olyat írni, ami megfelel.

Add meg opcióként a background-ot, így kilogolja neked a statust. Ezt egy tail-lal már ki tudod szedni x időnként. /szerintem/

Csináltam egy ilyen dolgot, lehet, hogy használ:


#! /bin/bash
j=0
while true
do
clear
echo "=== Frissites Nr$j ==="
for i in `ls /home/zolej/wget-log*`
do
/usr/bin/awk -F " " '{print $7}' /home/zolej/wget-log | tail -2
done
let j++
sleep 5
done

Szóval nem megkövezni, soha nem szoktam scriptet írni, még csak tanulom.
Le lehet egyszerűsíteni, nekem a kijelzésre jó, elhagyhatod a clear-t, az inputba rakhatod a saját fájlodat (pl ./figyelo.sh ./amit-figyelsz.log) Több egyidejű letöltéshez meg kell bolondítani a scriptet, illetve a spéci kimenetedet hozzá kell fűznöd. Mivel az én szerveremen baromi gyors az internet, kellett keresnem valami lassú mirrort a nagy fájlomnak, mert mire elkezdtem a monitorozást, addigra az le is jött :)))
Előfeltétele, hogy a wget-et -b kapcsolóval indítsd, ahogy írtam fentebb. Ahogy gondolom, ezer meg ezer megoldás létezik, ez az én barkácsom. Használd, ha tudod.

Nem tudom kipróbálni, de ilyesmi nem lenne jó?

wget http://domain.com/foo.bar 2>&1| awk '/^[0-9]+\%/ { print $1; }'

szerk.: nem, nem lesz jó.

szerk.2:

wget http://domain.com/foo.bar 2>&1| less | awk '/^[0-9]+\%/ { print $1; }'

Így már talán.

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Ez a background paraméter nagyon kecsegtető, viszont kellene egy kis ötlet, hogy tudnék az alábbi sorokból bizonyos részeket kivenni:

0K ........ ........ ........ ... 100% 3.98K=8.4s

vagy

0K ........ ........ ........ ........ ........ 3% 5.96K 3m39s
50K ........ ........ ........ ........ ........ 7% 9.38K 2m52s
100K ........ ........ ........ ........ ........ 11% 17.0K 2m14s
150K ........ ........ ........ ........ ........ 14% 4.61K 2m39s
200K ........ ........ ........ ........ ........ 18% 28.8K 2m9s
250K ........ ........ ........ ........ ........ 22% 7.49K 2m6s
300K ........ ........ ........ ........ ........ 25% 14.3K 1m53s
350K ........ ........ ........ ........ ........ 29% 9.70K 1m46s
400K ........ ........ ........ ........ ........ 33% 10.1K 99s
...
...
1250K ........ ........ ........ ........ ........ 96% 9.77K 6s
1300K ........ ........ ........ ........ ........ 99% 9.35K 0s
1350K ... 100% 1.67M=2m36s

Tehát minden sorból a xx% és az idő értékek lennének fontosak.
Az awk '{print $7}' és awk '{print $9}' sajna az első esetnél nem jön be, mert ott kevesebb az "oszlopok" száma, mivel a fájl kisebb mint 50K, ráadásul "100%" esetében ott van egy egyenlőség jel a sebesség és az idő közt, ami megint bonyolít a dolgon.

A szazalekmezot mondjuk igy:


egrep -o '[0-9]+%'

Ehhez GNU grep kell, mert a tobbi nem ismeri a '-o' opciot (igy a grep csak azt printeli, ami illeszkedett).

A hatralevo ido bonyolultabb, mert a regex konkret formaja nagyban mulik azon, hogy milyen idoformatumban printel a wget: a 2h0m3s elofordulhat mondjuk a kimenetben, vagy az mindig 2h3s lesz?


egrep -o '((([0-9]+d)?[0-9]+h)?[0-9]+m)?[0-9]+s' # 2h0m3s
egrep -o '([0-9]+[dhms])+'                       # 2h3s

Ha jol latom, a 0 erteku idoegysegeket nem printeli a wget, szoval valoszinuleg a masodik a nyero.

Vagy mindket mezot egyszerre perllel igy:


perl -nE 'say "$1 $2" if m/ ( \d+% ) .*? ( (?:\d+[dhms])+ ) /x'

Avagy a konkret formatumot elnezve a mezok sorveg felol indexelese is hasznalhatonak tunik:


perl -naF'[\s=]+' -E 'say "@F[-3, -1]" if /%/'

Egy kis magyarazat:
a bemenet minden sorat (

-n

)
oszd fel (autosplit,

-a

) mezokre (

@F

tomb),
ugy hogy a mezoket nem csak whitespace (

\s+

),
hanem egyenlosegjelek (

[\s=]+

) is hatarolhatjak,
majd printeld hatulrol a harmadik es az elso mezot (

say "@F[-3, -1]"

),
de csak ha az aktualis sorban szerepel egy szazalekjel (

if /%/

).

A fentiek mindegyike a kovetkezo formatumban mukodik:


cat wget-log | ... | tail -1

Remelem sikerult erthetoen leirnom, hogy ezek mit csinalnak. Ugy altalaban, ha egy szovegfile soraibol ki akarsz gyujteni bizonyos reszeket, akkor erdemes regexekhez nyulni, akar grepet, sedet, awkot vagy perlt hasznalva.

A sed csodakra kepes:)

Ime egy megoldas:

user@gep# cat temp
50K ........ ........ ........ ........ ........ 7% 9.38K 2m52s
100K ........ ........ ........ ........ ........ 11% 17.0K 2m14s
150K ........ ........ ........ ........ ........ 14% 4.61K 2m39s
200K ........ ........ ........ ........ ........ 18% 28.8K 2m9s
250K ........ ........ ........ ........ ........ 22% 7.49K 2m6s
300K ........ ........ ........ ........ ........ 25% 14.3K 1m53s
350K ........ ........ ........ ........ ........ 29% 9.70K 1m46s
400K ........ ........ ........ ........ ........ 33% 10.1K 99s
user@gep# cat temp | sed 's/%.*//;s/\.//g;s/.*\ //'
7
11
14
18
22
25
29
33
user@gep#

lx verziója is egész jó, de a rubasov féle tűnik eddig a legjobbnak.
Már csak 1 gond akadt, hogy a letöltés gprs kapcsolaton történik és ezmiatt kissé lassú a sorok feltöltése, és a "while read line" kissé nyügösen kezeli a dolgot ha a sor még épp nincs kész:

200K ........ ..
200K ........ ........ ..
200K ........ ........ ........ .......
200K ........ ........ ........ ........ ........ 18% 5.62K 2m44s

Szóval a "while read line" -t hogy lehetne kényszeríteni hogy várjon addig amig a sor nem teljes (várjon a sorvége jelekre)?