• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Mal wieder was mit sed

fabmo

Member
Hallo,
ich brauche mal wieder Hilfe.
also ich starte ein skipt. Dieses skript gibt Zeilenweise Daten aus. Im Sekundentakt
Ich brauche immer die beiden letzten ausgegebenen Zeilen.
Ich dachte da an sowas wie


Code:
./skript.sh | sed "aktuelle Zeile und vorherige" > Datei

In der Datei sollen also immer die beiden letzten Zeilen, welche von dem skript aus ausgegebn werden stehen.

Meine momentane Lösung ist:

Code:
./skript.sh >> Datei.tmp
Code:
tail -2 Datei.tmp > Datei
 

regexer

Advanced Hacker
Es geht natürlich auch mit sed:
Code:
sed -n '$H;$x;$p;h'
Entscheide, was du nehmen willst :wink:
 
OP
F

fabmo

Member
Vielen Dank erstmal.

Äh ja momentan mach ich das noch mit tail. Der Sed Ausdruck will noch nicht so richtig.

Code:
sed -n '$H;$x;$p;h'
Das $ Steht ja immer für die vorherige Zeile.
aber wofür ist das H X p dann da? Konnte ich auch
im Manual nicht so richtig finden.
 
OP
F

fabmo

Member
Hallo,

haha ich hab mich selbst verarscht mit tail geht es doch nicht.
Das skript, welches gestartet wird, gibt im sekundentakt immer zwei Zeilen aus.
Diese zwei Zeilen (also immer die neusten)möchte ich haben. Tail wartet aber immer bis auf das Ende und gibt dann die letzten 2 Zeilen aus.
Gibts da ne möglichket Tail zu "verarschen"? Indem ich bei dem gestarteten skript immer ein EOF mit rausgebe?
 

regexer

Advanced Hacker
fabmo schrieb:
Der Sed Ausdruck will noch nicht so richtig
Warum? Der macht doch so ziemlich das gleiche wie ein tail -2.

Code:
prompt> echo -e '1\n2\n3' | tail -2
2
3
prompt> echo -e '1\n2\n3' | sed -n '$H;$x;$p;h'
2
3

fabmo schrieb:
Das $ Steht ja immer für die vorherige Zeile.
Nein für die letzte.
aber wofür ist das H X p dann da? Konnte ich auch
im Manual nicht so richtig finden.
man sed sagt:
h H Copy/append pattern space to hold space.
[...]
x Exchange the contents of the hold and pattern spaces.
p Print the current pattern space.

Aber gut, nimm den tail -2. War ja auch eher als kleine sed-Übung gedacht.
 

regexer

Advanced Hacker
fabmo schrieb:
Das skript, welches gestartet wird, gibt im sekundentakt immer zwei Zeilen aus.
Diese zwei Zeilen (also immer die neusten)möchte ich haben. Tail wartet aber immer bis auf das Ende und gibt dann die letzten 2 Zeilen aus.
Gibts da ne möglichket Tail zu "verarschen"? Indem ich bei dem gestarteten skript immer ein EOF mit rausgebe?
Sorry, auch nach mehrmaligem Lesen habe ich nicht kapiert was du eigentlich willst. Was schreibt das Script raus? Du sagst: Jede Sekunde zwei Zeilen. Du willst die zwei zur Zeit aktuellsten? Dann leite die Ausgabe in eine Datei um und benutze tail -2 oder tail -n 2. Oder habe ich etwas falsch verstanden?
 
OP
F

fabmo

Member
Hallo,
also es ist so: Ein Shellskript wird gestartet. dieses gibt im Sekundentakt immer zwei Zeilen raus nämlich den Durchsatz der Netzwerkschnittstelle. Jetzt möchte ich eine Datei anlegen, in der immer der aktuellste Stand steht. Also immer die letzten Werte, die das skript ausgibt.

Den Versuch mit alles in eine datei umlenken und dann von der Datei einfach tail -2 zu machen habe ich auch schon mal getestet. Funktioniert auch. Problem ist nur, man müllt sich die Platte voll. Ist zwar bei den heutigen Platten kein Problem...Ich dachte nur, vielleicht gibts ne elegantere Methode.
 

regexer

Advanced Hacker
fabmo schrieb:
Den Versuch mit alles in eine datei umlenken und dann von der Datei einfach tail -2 zu machen habe ich auch schon mal getestet. Funktioniert auch. Problem ist nur, man müllt sich die Platte voll.
Du meinst also die File wird immer größer, oder? Na gut, aber dann müsstest du das Ausgangs-Skript selbst entsprechend modifizieren, indem du dort schon die Ausgabe in eine Datei umlenkst und diese in der Verarbeitungs-Schleife immer wieder überschreibst. Eine andere Lösung fällt mir im Moment wirklich nicht ein...
 
OP
F

fabmo

Member
Hallo,

Nochmal vielen Dank für die HIlfe an alle. Ich hab das Problem jetzt so gelöst, wie notoxp es eben beschrieben hat.
Vielleicht hab ich da etwas zu kompliziert gedacht.
Jedenfalls läuft jetzt alles. Das sktipt schreibt in eine Datei und überschreibt immer die letzten Werte.

Gruß

fabmo
 
Oben