PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : frage an sed speziallisten



Littletux
10.05.12, 23:10
Ich habe ein problem bei dem ich genau weiss es lässt sich mit sed lösen, da es aber doch etwas speziell ist hab ich keinen blassen Dunst wie ich das angehen müsste.
Problem ist folgendes:
Ich bräuchte eine via sed modifierte ausgabe des unsquashfs befehls, weil ich diese für eine zenity progressbar benötige
unsquashfs liefert schon so was wie eine Progressbar in der commandline, aber genau das ist das Problem. Das was ich als ausgabe benötige für die Zenity Progressbar sind der reine Prozentuale zahlenwert, also werte zwischen 0 und 100 ohne sonst was.
Wie bekomm ich das hin
also was ich bräuchte ist etwas wie
unsquashfsbefehl | sed irgendein kryptischer sed befehl so das nur noch der reine zahlwert von und bis 100 rauskommt
aber wie? kenn mich mit sed leider nur sehr notdürftig aus

Efraim
11.05.12, 03:33
Wenn der nicht hilft, poste mal eine konkrete Zeile vom "unsquashfsbefehl".

unsquashfsbefehl | sed -e "s|[^0-9]||g"

Littletux
11.05.12, 09:35
Der Befehl von Dir filtert einfach alle Buchstaben, und gibt nur noch zahlen aus. Das ist leider nicht das was ich brauch, ich häng mal ne ausgabe ohne und mit deinem sed befehl an

ohne sed befehl




Parallel unsquashfs: Using 2 processors
23797 inodes (23824 blocks) to write

[================================================== ================================================== ================================================== ======|] 23824/23824 100%
created 18567 files
created 1504 directories
created 5230 symlinks
created 0 devices
created 0 fifos



mit sed befehl


2
2379723824

10023824090023824310002382443200238241335002382414 36002382415400023824167600238243179002382433830023 82434890023824371010023824421180023824491250023824 52129002382454130002382454131002382454132002382455 13300238245513600238245714200238245914300238246014 40023824601450023824601510023824631520023824631530 02382464154002382464155002382465156002382465157002 38246515800238246615900238246616000238246716100238 24671620023824671630023824681640023824681650023824 69166002382469167002382470168002382470169002382470 18000238247519100238248019700238248219800238248320 30023824852080023824872110023824882120023824882130 02382489214002382489215002382490216002382490217002 38249121800238249121900238249122000238249223700238 24992380023824992382423824100
18567
1504
5230
0
0



die syntax von unsquashfs wäre

unsquashfs -d / irgend/ein/existierendes/leeres/verzeichnis -f /irgendein/squahshfs_file

Zum testen kannst Du
einfach eine Livecd mounten und dann das enthaltene squashfile mit unsquashfs entpacken. der grösse und effizienz wegen würde ich parted magic empfehlen.
die konkrete syntax ist
unsquashfs -d / irgend/ein/existierendes/leeres/verzeichnis -f /irgendein/squahshfs_file

marce
11.05.12, 10:18
ok, Du brauchst also eine RegEx die
- mit % endet
- davor 1-3 Zahlen hat
- davor wiederum ein Leerzeichen.

ich würde aber eher auf die Ausgabe auf die Zeile mit dem % beschränken und dann davon mit Trennzeichen [ ] das 3. Feld nehmen (-> grep $something| cut $singsome)

ThorstenHirsch
11.05.12, 11:19
$singsome? Sagen das die Amis/Engländer so, wenn $something schon vergeben ist? Quasi die nicht-nerd-version von $bar wenn $foo schon vergeben ist?

marce
11.05.12, 11:22
kein Ahnung.

ThorstenHirsch
11.05.12, 11:24
Arrrrgh, jetzt dacht ich, da lernt man hier mal was für's Leben und dann denkst du dir das einfach aus?!

marce
11.05.12, 11:26
Ja. Aber vielleicht hatte ich ja einen Glückstreffer...

pibi
11.05.12, 13:58
Ja. Aber vielleicht hatte ich ja einen Glückstreffer...Ausgedacht? Glaube ich nicht. Google wirft fuer "singsome" genau 2150 Treffer aus;-)

Gruss Pit.

marce
11.05.12, 18:06
Hm, die sind nicht von mir. Aber doch - es ist ausgedacht, ein Hirnfurz, Gedankenblitz - nenn es, wie Du willst... In dem Fall ist meine Ahnungslosigkeit echt und nicht vorgetäuscht...

ThorstenHirsch
11.05.12, 18:15
Na, dann markier ich den Tag gleich mal rot im Kalender... ;)

Efraim
12.05.12, 09:26
Wäre ja auch zu einfach gewesen, einfach alles raus zu werfen, was nicht Zahl ist. Spontan fällt mir der ein:

unsquashfsbefehl | grep -Eo " [0-9]*%" | sed -e "s|[^0-9]||g"Wahrscheinlich gibt es noch jede Menge andere Lösungen und sed kann das auch alleine.

Littletux
12.05.12, 11:38
Hallo Efraim

Zuerst einmal ein ganz grosses dankeschön (leider nicht für die Lösung des Problems) das wenigstens einer das Board nicht als Chat missbraucht.

Deine Befehlsgruppe liefert zwar genau die Zahlenmenge die ich benötige, aber leider erst, nachdem der unsquashfs Befehl vollständig abeschlossen ist

Jetzt müsste es nur noch irgendwie möglich sein, schon ergebnisse zu bekommen, die in dem moment kommen, während der unsquashfsbefehl läuft.

ich hab mal versucht den sed befehl anstelle von -e mit -u für unbuffered zu verwenden, um zu sehen ob das was hilft, leider nein. Der sed Befehl muss wohl etwas komplexer sein um das zu erreichen, was ich möchte, denn es werden wohl einige nicht druckbare steuerzeichen ausgegeben, welche möglicherweise nicht einfach entfernt werden dürfen, um eine fortlaufende Ausgabe zu erhalten, da bin ich mir ziemlich sicher. Leider habe ich null Ahnung wie das geht.

Efraim
12.05.12, 12:03
Du setzt bei jedem Post noch eine Bedingung oben drauf. War das jetzt alles, oder kommt noch mehr?

Littletux
12.05.12, 14:39
Hallo Efraim

Entschuldige falls das so aussieht für Dich, aber ich habe wohl das Problem nicht zu 100% genau ausformuliert. Ich dachte das sollte klar sein, dass die Ausgabe fortlaufend sein sollte, da es sich wie in meinem ertsten Post beschrieben um eine Progressbar handelt, und die funktioniert nun mal nur wenn die werte kontinuierlich eingehen.

Ich hätte wohl gleich noch schreiben sollen, dass ich schlussendlich an die ausgabe die ich suche, noch ein | zenity --progress anhänge, aber das dachte ich sollte ersichtlich sein, da ich in meinem ersten post ja von zenity geschrieben habe.
Und ich betone es nochmal falls das untergegangen sein sollte, Du bist hier bisher der einzige von dem ich das Gefühl habe, das er wirklich helfen möchte.

marce
12.05.12, 14:48
Und ich betone es nochmal falls das untergegangen sein sollte, Du bist hier bisher der einzige von dem ich das Gefühl habe, das er wirklich helfen möchte.
Oh, danke für das Kompliment.

Hm, dann poste ich meine Idee wohl besser doch nicht. Viel Spaß und Erfolg noch.

ThorstenHirsch
12.05.12, 15:58
Ach, ******* drauf, von mir gibt's noch nen Hinweis: unsquashfs mit & in den Hintergrund schicken, damit STDOUT über die Pipe sofort an sed geht.

Littletux
12.05.12, 18:54
@ThorstenHirsch

Tut mir leid, aber leider hinkt deine idee ein wenig, denn nach einem & ist ne pipe ein syntax error, was eigentlich auch logisch ist, denn hinter dem und werden keine befehle mehr angenommen, ausser die welche mit> umgelenkt werden.Da aber weder grep noch sed über ein umlenkzeichen angesprochen werden können geht das leider nicht

ThorstenHirsch
12.05.12, 20:21
Starte 2 Shells. In Shell 1) unsquashfs > out.txt
In Shell 2) tail -f out.txt | sed

Littletux
13.05.12, 01:45
leider bin ich dann wieder da wo ich schon mal war, die Ausgabe erfolgt immer noch erst wenn der befehl schon abgearbeitet ist

Efraim
13.05.12, 03:42
Nach einigen Tests glaube ich, dass grep buffert (ich teste das mit wget, anstelle "unsquashfsbefehl"). So sollte es funktionieren:

unsquashfsbefehl | grep --line-buffered -Eo " [0-9]*%" | sed -e "s|[^0-9]||g"

Es geht auch nur mit grep:

unsquashfsbefehl | grep --line-buffered -Eo " [0-9]*%" | grep --line-buffered -Eo "[0-9]*"

Littletux
13.05.12, 11:19
leider wieder nein
ich vermute das problem ist das, dass die ausgabe aller werte schon auf einer zeile ist, und somit nutzt auch der zusatz --linebuffered nichts

Aqualung
13.05.12, 12:38
Hier sieht es so aus, als würde "unbuffer" aus dem "expect"-Paket das gewünschte tun:


unsquashfsbefehl | unbuffer -p grep -Eo " [0-9]*%"

Efraim
14.05.12, 11:09
leider wieder nein
ich vermute das problem ist das, dass die ausgabe aller werte schon auf einer zeile ist, und somit nutzt auch der zusatz --linebuffered nichtsDas wird ja immer schlimmer. :D

Mal einen Zeilenvorschub nach dem Prozentzeichen erzwingen:

unsquashfsbefehl | sed -ue "s|%|%\n|g" | grep --line-buffered -Eo " [0-9]*%" | grep --line-buffered -Eo "[0-9]*"

Littletux
15.05.12, 00:44
@Aqualung

das einzige packet welches ich habe was expect heisst ist dev-tcltk/expect welches aber den befehl unbuffer anscheinend nicht enthält, und ich somit ein command not found bekomme

@Efraim



Das wird ja immer schlimmer.


ich hab ja deswegen als frage geschrieben an sed speziallisten, weil ich mir fast sicher war, dass das keine einfache aufgabe sein wird

und leider hat auch Dein neues command nicht den gewünschten erfolg erzielt

ich vermute auch mittlerweile das die grösste chance auf erfolg in einem oder auch mehreren nur sed commands besteht, und zusätzliche grep commands nicht zum erfolg führen werden, ist aber nur eine vermutung. ich frag mich auch ein wenig, wieso die entwickler von unsquashfs nicht daran gedacht haben, auch ne option mitzuliefern, die nicht nur erlaubt das progress ganz ein oder auszuschalten, sondern nur die reine zahl des fortschritts anzeigen zu lassen. Ich habe deshalb an den entwickler von squashfs eine Mail verfasst um ihn danach zu fragen, ob er das vielleicht als aufruf einbauen könne.

framp
15.05.12, 22:31
@Littletux: Kurzes <OT> Feedback meinerseits: Bin eben auf Deinen Thread gestossen - aber ich weigere mich einen Text lesen der nur Kleinbuchstaben hat :ugly: </OT>

naraesk
16.05.12, 08:42
Hoffentlich wirst du nie in einem englischen Forum nach einer Lösung für ein Problem suchen müssen.
Also ehrlich, man kann es auch übertreiben. Die Sätze sind ordentlich formuliert, mit Interpunktion und bis auf den letzten Beitrag auch alle mit Groß- und Kleinschreibung. Meiner Meinung nach kein Grund sich aufzublasen.