Dateibasierte Datenbanken bieten sich für viele Aufgaben an, bei denen relationale Datenbanksysteme mit einem zentralen Server überdimensioniert wären, wie einer Video- oder CD-Sammlung. Um hier die Vorteile einer Datenbank zu nutzen, bieten sich die Recutils [1] an. Die aktuelle Version erstellt bei Bedarf sogar verschlüsselte Datenbanken – das erweitert den Kreis der möglichen Einsatzszenarien nochmals erheblich.

Die Recutils implementieren eine Datenbank, die auf reinen Textdateien basiert. Die entsprechenden Dateien tragen in der Regel das Suffix .rec und heißen Recfiles. Um sie zu lesen oder zu schreiben, benötigen Sie keine besonderen Hilfsmittel. Bei Bedarf nutzen Sie einfach bewährte Werkzeuge, um zum Beispiel mit regulären Ausdrücken oder Awk- und Sed-Skripten zu arbeiten oder zeilenweise Datensätze auszuschneiden.

Das prädestiniert das System für den Einsatz in Skripten. Es fällt nicht schwer, eine Infrastruktur um eine derartige Datenbank zu stricken, die andere textbasierte Formate – etwa Wiki-Inhalte oder Quelltexte – konvertiert und in die Datenbank aufnimmt. Allerdings brauchen Sie für komplexe Aufgaben nicht erst eigne Tools zu schreiben, denn die Recutils bestehen aus einer Handvoll von Befehlen, um die Datenbank zu administrieren und zu benutzen. Für den Editor Emacs gibt es zudem einen speziellen Modus, um Recfiles zu bearbeiten.

Installation

Die aktuelle Version 1.4 der Recutils stammt vom 3. November 2011 und ist noch zu neu, um schon in den Repositories der meisten Distributionen gelandet zu sein. Allerdings finden sich im Build-Service von OpenSuse Pakete [2] für die Versionen 11.3, 11.4 und 12.1.

Für die Version 1.3 gibt es in Launchpad ein Repository [3]. Es stellt Pakete für die Versionen 11.10 ("Oneiric Ocelot") und die kommende LTS-Version 12.04 ("Precise Pangolin"). Auf der Seite findet sich auch ein Link zu einem weiteren Repository, dass Pakete für ältere Ubuntu-Versionen vorhält.

Die Homepage des Projekts verweist darüber hinaus auf fertig paketierte Versionen für weitere Distributionen.

Finden Sie kein Paket für das von Ihnen eingesetzte System, bleibt noch der Griff zum Compiler: Nach dem Laden und Auspacken des Recutils-Archivs erzeugen Sie via ./configure eine Konfiguration, die Sie mittels make übersetzen. Mittels make check überprüfen Sie diesen Schritt, bevor Sie mit make install die Software unter /usr/local/ installieren.

Mit make pdf erzeugen Sie die Dokumentation im PDF-Format, die viele weitere Informationen enthält. Falls die Bibliothek libmdb und die mdbtools samt Entwicklerpakete im System vorhanden sind, erzeugt das Setup zusätzlich den Befehl mdb2rec, mit dem sich Dateien aus Microsoft-Access-Datenbanken (MDB) in Recfiles umwandeln lassen.

Recfiles bearbeiten

Recfiles enthalten – wie andere Systeme auch – eine Datenbank, die sich aus Datensätzen ("Records") aufbaut. Datensätze enthalten Felder, bestehend aus einem Schlüssel (Feldnamen oder "Label") und dem dazugehörenden Wert ("Value"), der auch leer sein darf. Als Trennzeichen fungiert ein Doppelpunkt. Feldnamen stehen am Anfang einer Zeile und müssen mit einem Groß- oder Kleinbuchstaben beginnen, dem beliebig viele Buchstaben und Ziffern sowie Minuszeichen und Unterstriche folgen dürfen.

Bemerkenswerterweise dürfen Feldnamen mehrfach in einem Datensatz vorkommen. Feldnamen, die mit einem Prozentzeichen beginnen, haben eine besondere Funktion: Die dem Doppelpunkt folgenden Werte bis zum Zeilenende erkennen die Recutils als Schlüsselworte für die Datenbank.

Bei mehrzeiligen Werten maskiert ein Backslash den Zeilenumbruch. Ein Doppelkreuz (Hashmark) am Zeilenanfang leitet einen Kommentar ein, der bis zum Zeilenende reicht. Mittels Kommentarzeichen deaktivieren Sie auf einfache Weise bei Bedarf bestimmte Teile eines Recfiles, ohne sie direkt zu löschen.

In den folgenden Beispielen kommt eine Datenbank zum Einsatz, die im Recutils-Paket Version 1.3 als Beispiel enthalten ist, und die Sie unter /usr/share/doc/recutils/examples/movie-database/movies.rec finden. Einen Auszug aus der Datei zeigt Listing 1.

Die Datensätze beginnen mit dem Schlüsselwort Id, gefolgt von einer Nummer. Der Auszug zeigt, dass Datensätze weder numerisch sortiert in den Recfiles vorzuliegen brauchen, sondern sie dürfen in beliebiger Reihenfolge stehen. Allerdings dürfen die Datensätze nur nicht-leere Felder enthalten, woraus eine ganz unterschiedliche Länge der Einträge resultiert.

Listing 1

Id: 74
Title: Long zai jiang hu
Alternative_titles: Long zai jiang hu
Country: Hong Kong
Date: 1998
Director: Jing Wong
Genre: Action |  Crime |  Drama
Length: 112 min
Add_date: 01/05/2003
Audio: Cantonese (OGG)
Identifier: 472
Location: Box 1
Media: CD
Amount_of_Media: 1
Rating: 6
Subtitles: English
Video_format: DX50
Viewed: 1
Borrower: none
Favourite: 0

Die Befehle

Wie bereits erwähnt, verbirgt sich hinter den Recutils nicht ein spezielles Programm, sondern eine Reihe von Shell-Befehlen (Tabelle "Kommandos"), für jeweils genau abgegrenzte Aufgaben. So gibt recinf grundsätzliche Informationen über die Datenbank und die enthaltene Datensatztypen aus.

Die Option -t Typ erlaubt, das Bearbeiten auf einen bestimmten Typ einzuschränken, mit -d erhalten Sie eine Übersicht der vorhandenen Typen sowie weitere Informationen. Ähnliche Optionen bieten auch die meisten anderen Befehle.

Kommandos

Befehl Funktion
recinf zeigt allgemeine Informationen über Recfiles
recsel gibt Datensätze aus, implementiert die Suchfunktion
recins fügt neue Datensätze in ein Recfile ein
recdel löscht Datensätze aus Recfiles
recset manipuliert Datensätze
recfix prüft und repariert Recfiles
recfmt formatiert Ausgaben anhand von Vorlagen
csv2rec wandelt CSV-Files in Recfiles um
rec2csv wandelt Recfiles in CSV-Files um
mdb2rec konvertiert MDB-Files (MS-Access) in Recfiles

Der Befehl recins dient dem Einfügen neuer Datensätze in die Datenbank. Wieder legt -t den Typ fest, während -f Feldname und -v Wert den Datensatz definieren. Beide dürfen dabei mehrfach auftreten (Listing 2, Zeile 1).

Listing 2

$ recins -t movies -f Title -v "Erleuchtung garantiert" -f Audio -v "German" -f Genre -v "Komödie" movies.rec
$ recins -t movies -f Year -v 2000 -f Regie -v "Doris Dörrie" movies.rec

Das Beispiel ergänzt die geniale Komödie von Doris Dörrie in der Film-Datenbank. Durch -t movies wird dieser Eintrag als letzter eingefügt. Ohne diese Einschränkung schreibt recins den neuen Eintrag an den Anfang eines Recfiles. Nun fehlen noch die Angaben zur Regie und zum Erscheinungsjahr (Listing 2, Zeile 2). Beide Felder gibt es bisher noch nicht in der Datenbank, recins legt sie ohne Probleme an, allerdings nur für den aktuellen Datensatz (Listing 3)

Listing 3

...
Viewed: 0
Title: Erleuchtung garantiert
Audio: German
Genre: Komödie
Year: 2000
Regie: Doris Dörrie
...

Analog zu recins löscht recdel Datensätze aus Recfiles. Wieder definiert -t den Datensatztyp und -e ein Muster zum Beschreiben der gewünschten Datensätze.

Das Kommando recset dient dem Bearbeiten von Feldern vorhandener Datensätze. Auch hier wählen Sie zunächst die gewünschten Datensätze aus (-e) und erledigen dann die mit zusätzlichen Optionen definierten Veränderungen. Die Option -i veranlasst recset, Datensätze ohne Berücksichtigung von Groß-/Kleinschreibung zu finden, -t Typ beschränkt das auf die angegebenen Typen.

Die bearbeiteten Felder definiert das Argument von -f. Als Aktion gibt es mehrere Möglichkeiten: -s Wert schreibt einen neuen Wert in das Feld ("set"), -a Ergänzung ergänzt ("add"), -S Wert setzt den Wert und erzeugt das Feld, falls es noch nicht besteht. -r Name benennt das Feld um ("rename"), -d löscht es; -c kommentiert es aus.

Der wahrscheinlich wichtigste Befehl der Recutils ist recsel, mit dem Sie die Datenbank abfragen. Neben den oben beschriebenen Optionen (-t, -d) besonders wichtig sind noch -s Passwort für verschlüsselte Datenbanken sowie -S Feldname: Diese Angabe sorgt bei umfangreicheren Ausgaben für Übersichtlichkeit, indem die Datensätze nach dem angegebenen Kriterium sortiert erscheinen.

Die im Argument von -e übergebenen Abfragekriterien dürfen neben der Tilde und dem Gleichheitszeichen noch numerische (<, >, <=, >=, !=) und logische Operatoren (&&, ||, !) sowie Klammern zum Gruppierung enthalten.

Eine speziell formatierte Ausgabe ermöglicht recfmt. Der Befehl verwendet ein Template, um die Ausgabe zu erzeugen, und dient in der Regel als als Filter in einer Pipe. In dieser Schablone erscheinen die Werte für die zwischen doppelten geschweiften Klammern angegebenen Feldnamen.

Normalerweise gehen die textbasierten Recfiles kaum kaputt. Sollte das doch einmal der Fall sein, hilft recfix sie zu überprüfen (--check) und zu reparieren. Mittels --sort geben Sie die Datensätze zum Überprüfen sortiert aus. Mittels rec2csv konvertieren Sie Datenbanken in das weit verbreitete CSV-Format, das unter anderem Tabellenkalkulationen beherrschen. Umgekehrt wandelt csv2rec dieses Format in Recfiles um. Eine Umwandeln von Access-Datenbanken (MDB-Files) in Recfiles ermöglicht das bereits erwähnte mdb2rec.

Reguläre Ausdrücke

Die Recutils unterstützen in Abfragen als Argumente von -e Muster aus regulären Ausdrücken, analog zu denen, die Egrep oder grep -e zulassen. Eine Besonderheit der Recfiles stellen die Statements mit einem vorangestellten Prozentzeichen (Tabelle "Spezielle Datensätze") dar: Mit ihnen organisieren Sie die Datenbank.

Spezielle Datensätze

Statement Wirkung
%rec definiert den Typ eines Datensatzes und kennzeichnet Datensatzbeschreibungen (Record Descriptors)
%mandatory, %prohibit legt fest, welche Felder in Datensätzen auftreten dürfen und welche nicht
%unique, %key definiert eindeutige (Primär-)Schlüssel
%auto bewirkt das automatische Erzeugen von Felder
%doc erlaubt, zusätzliche Informationen zu Datensätzen aufzunehmen
%typedef, %type erzeugt Typnamen und ordnet Typen und Felder zu
%sort sortiert Datensätze nach vorgegebenen Feldern
%size ermöglicht, die Größe von Datensätzen einzustellen
%confidential verschlüsselt Informationen

In Emacs

Im Prinzip eignet sich jeder Editor zum Bearbeiten von Recfiles, doch außer Emacs bietet keiner spezielle Funktionen, die Ihnen die Arbeit erleichtern. Die Recutils bringen einen speziellen (Major-)Modus für Emacs mit, der sich in der Datei rec-mode.el verbirgt. Dieser entstand speziell zum Bearbeiten von Recfiles. Steht in der ersten Zeile einer geladenen Datei die Zeichenkette # -*- mode: rec -*-, interpretiert Emacs diese als Recfile und aktiviert automatisch den passenden Modus.

Datensätze erscheinen nun eingefärbt: Schlüsselwörter sind blau, Werte schwarz und Kommentare grün. Weiterhin gibt es nun eine Reihe spezieller Tastenbindungen, mit denen Sie Funktionen zum Bearbeiten direkt aufrufen. Die Tabelle "Tastenbindungen im Emacs" fasst die wichtigsten davon zusammen.

Tastenbindungen im Emacs

Taste Funktion
[Tab] zum nächsten Feld wechseln
[Eingabe] weiter springen
[Leertaste] Sichtbarkeit umschalten
[#] Datensätze zählen
[Umschalt]+[A] Daten an aktuelles Feld anhängen
[Umschalt]+[B] Editiermodus umschalten
[Umschalt]+[I] Informationen zur Datenbank zeigen
[Umschalt]+[R] aktuellen Datensatz bearbeiten
[Umschalt]+[T] Feldtyp bearbeiten
[B] zurück springen
[E] Datensatz bearbeiten
[L] Datensätze suchen
[M] Feld trimmen
[N] zum nächsten Datensatz wechseln
[P] zum vorigen Datensatz wechseln
[S] Suchfunktion
[T] Datensatzbeschreibung zeigen
[Strg]+[C],[T] Datensatztypen suchen

Im Rec-Modus beschränkt Emacs die Darstellung der Datensätze durch sogenanntes "Narrowing" auf die momentan relevanten Teile, beispielsweise den aktuellen Datensatz. Das erhöht die Übersicht, wenn Sie genau wissen, was Sie gerade bearbeiten. Falls dieses Verhalten Sie irritiert, heben Sie es durch [Strg]+[X],[N],[W] auf. Über [Strg]+[X],[N],[N] aktivieren Sie es erneut.

In der Emacs-typischen Schreibweise finden Sie diese Tastenkombination auch als C-x x n und C-x n n beschrieben. Das funktioniert auch über [Umschalt]+[B] und schaltet dabei den Buffer mit der Datenbank in den Editiermodus; voreingestellt öffnet der Emacs Recfiles schreibgeschützt.

Ein Teil der Emacs-Funktionen entspricht jenen, welche die Befehle der Recutils bereitstellen: So wirkt [Umschalt]+[I] wie recinf, [L] stellt eine interaktive Variante von recsel bereit. Gerade diese Funktion hilft, die Arbeitsweise der Recutils zu verstehen. Ein Beispiel verdeutlicht den Einsatz des Modus, der voreingestellten Tastenbindungen und der Befehle.

Nach dem Laden der Beispieldatenbank movies.rec zeigt der Emacs nur eine Zeile, sofern der Rec-Modus aktiv ist:

%rec: movies

Das Schlüsselwort %rec legt den Typ aller folgenden Datensätze fest, bis das Dateiende erreicht ist oder ein neues Statement dieser Art auftritt. Im obigen Beispiel haben die Datensätze also zunächst alle den Typ movies. Falls es weitere Typen im Recfile gibt, zeigt [Umschalt]+[I] sie in der Statuszeile an. Da hier nur 898 movies erscheint, kennen Sie den Umfang der Datenbank und den Typ der Einträge.

Um die Datenbank selbst im Detail zu sehen und zu editieren, wechseln Sie [Umschalt]+[B] in den Editiermodus (Edit buffer zeigt dies an). Alle üblichen Editierbefehle stehen nun bereit. Insbesondere aktiviert [Strg]+[S] die inkrementelle (Volltext-)Suche über alle Felder, mit der Sie in allen Datensätzen suchen. Auch Suchen und Ersetzen steht hier zur Verfügung, ebenso wie das Einfügen oder Löschen von Zeilen (sprich: Feldern) in den Datensätzen. Es lohnt sich aber, dafür die speziellen Befehle des Rec-Modus zu nutzen.

Mit [Strg]+[C],[Strg]+[C] beenden Sie diesen Modus und sehen dann den Datensatz an, in dem sich der Cursor gerade befand. Über [Umschalt]+[A] haben Sie nun die Möglichkeit, ein neues Feld anzulegen, beispielsweise ein Genre, oder etwas zu ergänzen. Auch lassen sich die angezeigten Felder und ihre Werte nun für diesen ausgewählten Datensatz verändern, bis [Strg]+[C],[Strg]+[C] wieder den Modus beendet.

Über [Tab] wechseln Sie zum nächsten Feld. [Umschalt]+[T] erlaubt es, neue Datensatztypen in Recfiles anzulegen. Diese Datensatztypen strukturieren Recfiles auf einer Ebene über den Datensätzen und erlauben es, unterschiedliche Datensatztypen in einem Recfile aufzunehmen.

Beim Betätigen der Taste springt der Cursor zur aktuellen Definition, die mittels %rec: erfolgt. Bei movies.rec definiert in der ersten Zeile %rec: movies den Typ. Bei Bedarf kopieren Sie einfach die Zeile und fügen sie an anderer Stelle im Recfile – etwa vor dem gewünschten Datensatz oder am Ende der Datei – erneut ein, wobei Sie den Typ anpassen.

Es gibt in der Beispieldatenbank drei Einträge zum Film mit dem Titel "Mr. Nice Guy". Wenn Sie nun zwischen dem zweiten und dritten Eintrag den Typ wechseln, haben Sie die Möglichkeit, die drei Datensätze trotz gleicher Titel unterschiedlichen Typen zuzuordnen und entsprechend zu verwalten (Listing 4). Sichern Sie diese veränderte Datenbank unter einem neuen Namen, etwa als movies1.rec.

Listing 4

Id: 539
Title: Mr. Nice Guy
Alternative_titles: Yatgo ho yan
Add_date: 16.07.2002
Audio: German
Identifier: 883
Location: Box 1
Media: (DivX)
Amount_of_Media: 1
Video_format: (DivX);-) V3.11 LOW MOTION
Viewed: 0
%rec: movies1
Id: 540
Title: Mr. Nice Guy - Uncut
Alternative_titles: Yatgo ho yan
Add_date: 16.07.2002
Audio: English
Identifier: 147
Location: Box 2
Media: (DivX)
Amount_of_Media: 1
Subtitles: English [SubRip]
Video_format: (DivX);-) MPEG4 v3
Viewed: 0

Die Auswirkungen dieser Modifikation zeigen sich bei Abfragen an die Datenbank. In der Shell dient recsel zum Suchen von Datensätzen. recsel -e "Title ~ 'Nice'" sucht alle Datensätze, die im Titel-Feld das Wort "Nice" enthalten (Listing 5). Die Tilde zwischen dem Schlüsselwort Title und der Zeichenkette Nice, die in Hochkommata stehen muss, bewirkt, dass jedes Auftreten der Zeichenkette als Treffer gilt ("soft match"). Mit einem Gleichheitszeichen finden Sie nur exakte, vollständige Übereinstimmungen ("hard match").

Listing 5

$ recsel -e "Title ~ 'Nice'" movies.rec
Id: 538
Title: Mr. Nice Guy
...
Id: 539
Title: Mr. Nice Guy
...
Id: 540
Title: Mr. Nice Guy - Uncut
...

Bei der veränderten Datenbank movies1.rec findet recsel zwei unterschiedliche Datensatztypen und meldet dies (Listing 6). Nach der Angabe eines Typs liefert das Tool das korrekte Ergebnis.

Listing 6

$ recsel -e "Title ~ 'Nice'" movies.rec
recsel: Fehler: Verschiedene Datensatztypen gefunden. Bitte mit -t einen angeben.
$ recsel -t movies -e "Title ~ 'Nice'" movies1.rec
Id: 538
Title: Mr. Nice Guy
...
Id: 539
Title: Mr. Nice Guy
...

Für den Typ movies1 liefert die Abfrage aus Listing 7 den fehlenden Eintrag. Dieselbe Abfrage ließe sich übrigens direkt im Emacs bewerkstelligen: [L] aktiviert die Suchfunktion, [Umschalt]+[E] die Suchmethode. Alle weiteren Parameter fragt Emacs dann ab. [Eingabe] übernimmt die Angaben.

Listing 7

$ recsel -t movies1 -e "Title ~ 'Nice'" movies1.rec
Id: 540
Title: Mr. Nice Guy - Uncut
...

Fazit

Bei den Recutils handelt es sich um ein typisches GNU-Projekt: Klein, leichtgewichtig und sehr flexibel kommen sie daher. Dabei stellen sie eine erstaunlich leistungsfähige Infrastruktur für eine Datenbank bereit. Es macht Spaß, mit ihnen zu experimentieren. Die vielen jetzt schon implementierten Features machen diese Datenbank schon heute zu einem nützlichen Werkzeug für kleine Projekte.

Durch den Einsatz von Kommandozeilenwerkzeugen drängt sich das Skripting quasi auf. Das macht es zudem einfach, eine simple grafische Oberfläche als Schnittstellen zu erzeugen, basierend auf den diversen Dialog-Varianten oder Tcl/Tk. Ein Video auf der Homepage zeigt mit Beispielen die Möglichkeiten der Datenbank [5]

Infos

[1] Recutils: http://www.gnu.org/software/recutils/

[2] Recutils im Build-Service von OpenSuse: https://build.opensuse.org/package/repositories?package=recutils&project=home%3Acyberiad%3AFactory

[3] Recutils in Launchpad: https://launchpad.net/ubuntu/+source/recutils

[4] Reguläre Ausdrücke: Frank Hofmann, "Schnipseljagd", LU 09/2011, S. 84, http://www.linux-community.de/24091

[5] Video: http://balance.fsf.org/video/The_GNU_Record_Utilities.ogv

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Related content

Kommentare