Tworzenie paska postępu z „dialogiem” z wyjścia rsync

16

Szukam sposobu na filtrowanie / przekierowywanie danych wyjściowych rsync w sposób, w którym można je podawać do polecenia „dialog -gauge”, aby uzyskać ładnie wyglądający pasek postępu podczas synchronizacji plików. Obecnie testowałem to tylko bezpośrednio po znaku zachęty, ale planuję to zrobić w skrypcie powłoki (bash).

Rozejrzałem się po Internecie i znalazłem kawałki, ale wciąż brakuje mi czegoś, co sprawi, że zadziała

(Zastrzeżenie: To może być całkowicie niewłaściwe podejście i jest to potworność przekierowania / potoku)

Co aktualnie skompletowałem:

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

Najpierw mam rzeczywistą komendę rsync z opcją --progress Dane wyjściowe z rsync są przesyłane do awk i wykorzystują następujący filtr awk:

{
   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();
}

To odfiltrowuje dane wyjściowe rsync i podaje wartość procentową w następującym formacie:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Aby pozbyć się liczb dziesiętnych, przesyłam dane wyjściowe do sed:

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

Co daje następujące dane wyjściowe:

64
66
68
70
72
74
75
77

Te liczby są przesyłane do okna dialogowego w następujący sposób:

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

O ile mi wiadomo, „dialog - wskaźnik” itp. Powinien to zaakceptować, ale wyświetla tylko postęp w wysokości 0%, aż nagle osiągnie 100%

Czy ktoś może skierować mnie tutaj we właściwym kierunku? Czy jestem daleko od działającego paska postępu? Czy istnieje lepszy sposób na osiągnięcie tego?

Pozdrowienia,

Christer

EDYCJA : Po uwzględnieniu odpowiedzi @lynxlynxlynx poprawny wiersz poleceń to:

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
źródło
1
Wygląda na to, że coś (prawdopodobnie awk) buforuje dane wyjściowe, dopóki program w potoku nie wyśle ​​EOF. Nie wiem, jak to sprawdzić lub rozwiązać ...
Shadur,

Odpowiedzi:

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

działa dobrze, więc @Shadur ma rację i buforowanie jest odtwarzane.

Dodanie sedstrippera do miksu pokazuje, że jest to winowajcą (pokazuje tylko 0 i 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

Teraz, gdy problem jest znany, masz wiele opcji. Najczystszym rozwiązaniem byłoby zaokrąglanie / zmniejszanie procentu za awkpomocą operacji matematycznych lub łańcuchowych, ale ponieważ masz GNU sed, po prostu dodaj -ulub --unbufferedpowinieneś załatwić sprawę.

Jednak ze względu na kompletność, prosty przypadek testowy pokazuje awkrównież buforowanie:

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 

Ale już sobie z tym poradzisz fflush, więc nie oczekuję problemów.

lynxlynxlynx
źródło
Łał..! Stukrotne dzięki! Jedyne, czego potrzeba, to dodanie - niebuforowanego do sed! Dziękujemy za podzielenie się czasem i wiedzą Shadur i lynxlynxlynx!
chr1573r,
Dla innych osób zastanawiających się, jak wygląda ostateczne polecenie: rsync -avz --progress -e "ssh" użytkownik @ serwer: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed --unbuffered 's / ([0-9] *). * / \ 1 /' | dialog - tytuł „Mój miernik” - miernik „Cześć, to widget miernika” 20 70
chr1573r
Nie ma problemu i witamy na stronie. :)
Shadur,