[(ba)sh] Eine Zeile aus einer Datei extrahieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
bitnuke0
Beiträge: 7
Registriert: 23.06.2009 14:42:11

[(ba)sh] Eine Zeile aus einer Datei extrahieren

Beitrag von bitnuke0 » 01.07.2009 16:59:48

Hallo shell-freakz

Und zwar habe ich folgendes Problem:

Ich habe eine Datei, die eine Zeichenkette pro Zeile enthält. Mein Ziel ist es jetzt, per Shell-Befehl eine Zeile aus der Datei zu extrahieren. Dabei soll die Zeile auf STDOUT ausgegeben und aus der Datei gelöscht werden. Es spielt dabei keine Rolle, ob es die erste oder letzte Zeile der Datei ist. Halt das, was einfacher realisierbar ist. Ich hoffe, ihr habt mein Problem verstanden und könnt mir helfen. :)

Danke.

//Edit:
Tut mir leid, ich hab es selbst rausgefunden:

Code: Alles auswählen

befehl "$(tail -n 1 "$1" && sed -i "$ d" "$1")"
Das Problem ist nur, dass dieser Weg nicht sehr sicher ist. Was z.B., wenn mit tail die Zeile ausgelesen wird und in der Zwischenzeit die Datei geändert wird. Dann löscht sed ja nicht das, was er soll. Weiß jemand auch dafür ne Lösung?

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: [(ba)sh] Eine Zeile aus einer Datei extrahieren

Beitrag von cosmac » 02.07.2009 02:11:55

hi,

ich glaub, du suchst ein fifo, auch "named pipe" genannt. Mit normalen Dateien funktioniert sowas nur, wenn der Leser genau weiß, wie der Schreiber arbeitet; und auch dann nur vielleicht. Normalerweise wird nicht zeilenweise geschrieben, sondern in Blöcken von z.B. 4096 Zeichen. Dann liefert tail meistens eine "halbe" Zeile. Das nächste Problem ist, dass sed eine neue Datei erzeugt, aber die nächste neue Zeile an die Original-Datei angehängt wird -- oder nicht?
Beware of programmers who carry screwdrivers.

Benutzeravatar
bitnuke0
Beiträge: 7
Registriert: 23.06.2009 14:42:11

Re: [(ba)sh] Eine Zeile aus einer Datei extrahieren

Beitrag von bitnuke0 » 03.07.2009 00:06:48

Du hast natürlich Recht. Das wird dann wahrscheinlich nicht funzen. Gibt es denn so eine Art lock? Dann könte ich die Datei erst sperren, dann lesen/schreiben, dann entsperren. So eine Art transaktion meine ich.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: [(ba)sh] Eine Zeile aus einer Datei extrahieren

Beitrag von cosmac » 03.07.2009 00:21:58

jein, es gibt schon ein Lock, aber das muss auch mit dem schreibenden Programm zusammenspielen. Wenn das die Datei öffnet, eine Zeile schreibt und sie wieder schließt, könnte es funktionieren. Aber auch nur, wenn es darauf vorbereitet ist, dass das open dank lock schief geht. Wenn es die Datei nie schließt, funktioniert das lock sowieso nicht.

Vielleicht solltest du doch ein paar Einzelheiten verraten, besonders wie, oder von welchem Programm, die Zeilen erzeugt werden.
Edit: Kann man evt. auf das Löschen der Zeilen verzichten? Plattenplatz kostet doch nichts mehr...
Beware of programmers who carry screwdrivers.

Benutzeravatar
bitnuke0
Beiträge: 7
Registriert: 23.06.2009 14:42:11

Re: [(ba)sh] Eine Zeile aus einer Datei extrahieren

Beitrag von bitnuke0 » 05.07.2009 15:03:21

Es geht sich doch nicht um Plattenplatz! :) Mein Ziel ist es halt, dass ich bei jedem Aufruf des Skriptes eine Zeile aus der Datei bekomme und jedesmal eine andere. Mir ist eigentlich relativ egal mit welcherm Programm gelesen/gelöscht wird. Deshalb frage ich ja auch hier. Wie ich oben im ersten Post nachträglich noch geschrieben habe, lese ich mit tail und lösche mit sed. Es kann aber auch was anderes sein.

Danke.

Antworten