Erstellen eines Fortschrittsbalkens mit "dialog" aus der rsync-Ausgabe

16

Ich suche nach einer Möglichkeit, die rsync-Ausgabe so zu filtern / umzuleiten, dass sie dem Befehl "dialog --gauge" zugeführt werden kann, damit ich während der Dateisynchronisierung einen gut aussehenden Fortschrittsbalken bekomme. Derzeit habe ich es nur direkt an der Eingabeaufforderung getestet, aber ich plane, dies in einem (Bash-) Shell-Skript zu tun.

Ich habe mich im Internet umgesehen und Kleinigkeiten gefunden, aber mir fehlt immer noch etwas, damit es funktioniert

(Haftungsausschluss: Dies kann ein völlig falscher Ansatz sein und ist eine Monstrosität für Umleitungen / Piping.)

Was ich aktuell zusammengestellt habe:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Zuerst habe ich den eigentlichen Befehl rsync mit der Option --progress. Die Ausgabe von rsync wird an awk weitergeleitet und verwendet den folgenden awk-Filter:

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}

Dadurch wird die rsync-Ausgabe herausgefiltert und der Prozentsatz im folgenden Format angegeben:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Um die Dezimalzahlen loszuwerden, füttere ich die Ausgabe mit sed:

sed 's/\([0-9]*\).*/\1/'

Was die folgende Ausgabe ergibt:

64
66
68
70
72
74
75
77

Diese Nummern werden wie folgt in den Dialog geleitet:

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Soweit ich weiß, sollte "dialog --gauge" usw. dies akzeptieren, aber es wird nur ein Fortschritt von 0% angezeigt, bis es plötzlich 100% erreicht.

Kann mich hier jemand in die richtige Richtung weisen? Bin ich weit weg von einer funktionierenden Fortschrittsanzeige? Gibt es einen besseren Weg, dies zu erreichen?

Grüße,

Christer

EDIT : Nach der Einnahme @lynxlynxlynx‘Antwort berücksichtigt, die richtige Befehlszeile ist:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \ 
 | awk -f /home/user/rsync.awk \ 
 | sed --unbuffered 's/([0-9]*).*/\1/' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
chr1573r
quelle
1
Klingt so, als ob etwas (wahrscheinlich awk) die Ausgabe puffert, bis das Programm, bevor es in der Pipeline ist, die EOF sendet. Keine Ahnung, wie man das überprüft oder
angeht

Antworten:

12
for i in 10 20 30; do echo $i; sleep 1; done | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Funktioniert gut, also hat @Shadur recht und es wird gepuffert.

Das Hinzufügen des sedStrippers zum Mix zeigt, dass es der Schuldige ist (nur die Anzeigen 0 und 30):

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Nachdem das Problem bekannt ist, haben Sie mehrere Möglichkeiten. Am saubersten wäre es, den Prozentsatz awkentweder mit Mathematik oder mit Zeichenketten zu runden / zu reduzieren , aber da Sie GNU haben sed, müssen Sie nur den Trick hinzufügen -uoder --unbufferedtun.

Ein einfacher Testfall zeigt jedoch der Vollständigkeit halber awkauch die Pufferung:

for i in 10 20 30; do echo $i; sleep 1; done | awk '{print $0}' | sed -u 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Aber damit kommst du schon klar fflush, also erwarte ich keine Probleme.

lynxlynxlynx
quelle
Beeindruckend..! Tausend Dank! Hinzufügen - ungepuffert zu sed war das einzige, was benötigt wurde! Vielen Dank für Ihre Zeit und Ihr Wissen Shadur & lynxlynxlynx!
chr1573r
Für andere Leute, die sich fragen, wie der letzte Befehl aussieht: rsync -avz --progress -e "ssh" user @ server: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed --unbuffered 's / ([0-9] *). * / \ 1 /' | dialog --title "My Gauge" --gauge "Hallo, dies ist ein Messgerät-Widget" 20 70
chr1573r 06.08.12
Kein Problem und willkommen auf der Seite. :)
Shadur