|grep|tr|cut liefert nur erstes Zeilenupdate

Hallo zusammen,
ich möchte mir ein kleines Skript basteln, um den gesamten rsync-kopier-Vorgang in einem Fortschrittsbalken darszustellen. Dazu will ich die Ausgabe von rsync auslesen und die Anzahl der übertragenen Bytes aufsummieren.
Leider bekomme ich beim Kombinieren von grep, tr und cut (auch awk) immer nur das erste Lineupdate, bei größeren Dateien fehlen also etliche Bytes. Ich habe mal ein paar Ausgaben gepostet, die verdeutlichen was ich meine.
Am liebsten wäre es mir, wenn ich jedes Update der Zeile zurückbekomme und eine extra Info, wenn die nächste Zeile ausgegeben wird z.B.:

while (gleiche Zeile) do(für jedes Update)
irgentwas
end

Wenn das nicht geht, wäre es auch ok, wenn ich nur das letzte Update der Zeile bekomme.
Hoffe ihr könnt mir weiterhelfen.
Gruß Zorki

$ rsync -av --progress $src $dest | tr -s " " | grep xfer
17136 100% 0.00kB/s 0:00:00 (xfer#1, to-check=10/12)
492718 100% 46.99MB/s 0:00:00 (xfer#2, to-check=9/12)
5365 100% 436.60kB/s 0:00:00 (xfer#3, to-check=8/12)
5351 100% 435.47kB/s 0:00:00 (xfer#4, to-check=7/12)
11653 100% 948.32kB/s 0:00:00 (xfer#5, to-check=6/12)
1434878 100% 39.10MB/s 0:00:00 (xfer#6, to-check=5/12)
8915 100% 241.83kB/s 0:00:00 (xfer#7, to-check=4/12)
8915 100% 241.83kB/s 0:00:00 (xfer#8, to-check=3/12)
13785 100% 373.94kB/s 0:00:00 (xfer#9, to-check=2/12)
614677 100% 12.74MB/s 0:00:00 (xfer#10, to-check=1/12)
1298656 100% 17.69MB/s 0:00:00 (xfer#11, to-check=0/12)

$ rsync -av --progress $src $dest | tr -s " " | grep xfer | cut -d " " -f 2 ; rm -r test/*
17136
32768
5365
5351
11653
32768
8915
8915
13785
32768
32768

$ rsync -av --progress $src $dest | tr -s " " | grep xfer | cut -d " " -f 3
100%
6%
100%
100%
100%
2%
100%
100%
100%
5%
2%

Hallo,

Leider bekomme ich beim Kombinieren von grep, tr und cut (auch
awk) immer nur das erste Lineupdate

das passiert, weil alle „Lineupdates“ zu einer einzigen Zeile gehören. Dazwischen stehen Carriage Returns (\r); erst am Ende folgt ein Newline (\n).

Also nimm doch einfach ein „sed ‚s/\r/\n/g‘“ vorne in deine Pipeline auf. Dann hast du jedes „Lineupdate“ als einzelne Zeile und kannst mit grep und cut weiterarbeiten.

Gruß,

Andreas

Hallo Andreas,

Also nimm doch einfach ein „sed ‚s/\r/\n/g‘“ vorne in deine
Pipeline auf.

Das wird nicht ausreichen (zumindest bei mir hat es nicht ausgereicht), weil rsync den Output buffert. Diese Erkenntnis habe ich von hier
http://www.meinews.net/fortschrittsanzeige-t78926.html
wo das Problem ausführlich diskutiert und auch gleich die Lösung mitgeliefert wird :smile:

Viele Grüße
Marvin

Hallo Marvin,

Das wird nicht ausreichen (zumindest bei mir hat es nicht
ausgereicht), weil rsync den Output buffert.

klar, das ist ein separates Problem. Aber wer will schon einen Fortschrittsbalken in Echtzeit dargestellt haben … :wink:

Andreas