Sziasztok,
Egy olyan problémába ütköztem, hogy adott egy többszörös rsync script, ami loggolásra kerül, és szeretném összesíteni az átvitt file-oknak a nagyságát. Azt hittem, hogy ez elég egyszerű lesz, mert egyszerűen greppelem azt a sort ami kiírja minden egyes rsync file átvitelének méretét, és összeadom. Ez ugye egyszerű:
cat rsync.log | grep "transferred file" | cut -d" " -f 5 | awk '{ SUM += $1} END { print SUM }'
Viszont a probléma, hogy nem konzekvensen van a mértékegység, hiszen ez lehet K, M és G is hozzáírva, így nem tudja összeadni, vagyis ezek bár sed-el ki lehetne törölni, de ugye a helyiértéket is hozzá kellene igazítani mielőtt összeadom.
Tud valaki erre egy "egyszerű" megoldást?
- 347 megtekintés
Hozzászólások
Hogy paraméterezed az rsync-et, aminek logolod a tevékenységét? Mert nekem konzekvensen byte-ban írja.
Inkább az rsync paramétereiben keress megoldást, az lehet a könnyebb út. ;)
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
rsync -avh van használatban ahogy nézem.
És eredménynek greppelve ezt látom:
Total transferred file size: 6.50M bytes
Total transferred file size: 81.92K bytes
Akkor lehet hogy a -h csinálja ezt.
- A hozzászóláshoz be kell jelentkezni
A paraméterből vedd le a h -t (mint human readable)! ;)
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
Köszi. Akkor így már jó is lesz :)
cat rsync.log | grep "transferred file" | cut -d" " -f 5 | echo "Total transferred file size: "$(awk '{ SUM += $1} END { print SUM/1024 }')"K bytes"
- A hozzászóláshoz be kell jelentkezni
Nincs mit.
De halkan megsúgom, hogy az rsync-nek van olyan paramétere, hogy --log-file=/path/to/file, és akkor nem kell kimenetet irányítgatni. Csak mert ezt nem láttam a paramétereidben amit bemásoltál.
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
Jah ez már egy meglévő log fileból dolgozna, tehát az rsync loggol egy fileba, és x óra múlva történne csak maga a feldolgozás.
- A hozzászóláshoz be kell jelentkezni
Nah ma kiderült, hogy ez sajnos nem működő megoldás, ugyanis az rsync a h paraméter nélkül így írja be a számokat:
6,501,224
81,920
Ezt viszont ha awk-al összeadom, akkor ez jön ki: 87 :D Szal kell még bele egy sed "s/,//g" is. Illetőleg a leírtak alapján ezt is lehet awk-al.
- A hozzászóláshoz be kell jelentkezni
gsub(",", "", $1);
- A hozzászóláshoz be kell jelentkezni
Azert a grep es a cut egy sorban az AWK-val :)
- A hozzászóláshoz be kell jelentkezni
Arra gondolsz, hogy pl a cut-ot ki lehetett volna váltani awk {'print $5'}-el? Amúgy megszokás miatt használtam a cut-ot. Vagy más miatt nem célszerű együtt rakni őket?
- A hozzászóláshoz be kell jelentkezni
az AWK egyben tudja az osszes funkcionalitast.
1) delimitert allitasz (ha kell) parameterbol vagy a BEGIN { ... } blokkban.
2a) regexp szures: /rekettyesujfalu/ { ... }
2b) X = X + $# a 2) blokkban
/// 2-es ponthoz hasonloan csinalhatsz barmennyi blokkot
3) END { print X }
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Ez alapján akkor majd összeállítom csak awk-al is, hogy ezt is megtanuljam.
- A hozzászóláshoz be kell jelentkezni
Ne bántsd. :)
A lényeg, hogy működik. Nyilván lehetne elegánsabban egy darab awk-val, de felteszem nem az volt a cél, hogy szép legyen a sor a crontabban.
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
Akkor már értem. Az awk-hoz csak kicsit értek, ezért nem azzal csináltam egybefűzve mindent. Nem vagyok Pro, ez a magyarázata. Ezért nekem így az átláthatóbb, de ha valaki egybefűzi nekem awk-val az egészet, akkor megtanulom, hogy miért és hogy működik.
- A hozzászóláshoz be kell jelentkezni
Valahogy így:
echo "transferred files 2 3 4 5 6" | awk '/transferred files/{SUM += $5} END{print "summa ", SUM, "kB\n"}'
summa 4 kB
awk-ban minden {} parancs elé tehetsz egy mintát / jelek közé, ekkor csak a mintára illeszkedő sorokra hajtja végre (grep helyett). A cut-ot ki tudod váltani a $5-tel, ahogy írtad is. A print-be pedig tehetsz szöveget is kombinálva a változókkal.
- A hozzászóláshoz be kell jelentkezni
Köszi a példát. Akkor ezt is megtanulom.
- A hozzászóláshoz be kell jelentkezni