Recutils: eenvoudige databases voor jouw informatie

We leven in een drukke wereld met steeds meer data. Voor de meesten van ons neemt ook deze persoonlijke data alleen maar toe. Hoe breng je structuur aan als je niet afgestudeerd bent als database administrator? In dit artikel deel ik een mogelijke oplossing die vrij, open en gratis is.

Wat is een database?

Vroeger hadden we kasten met archiefmappen of een Rolodex met kaartjes. De voorloper van de digitale database. Het had wel structuur, maar niet zo vergaand als computersystemen dat kunnen bieden. Een moderne database bestaat uit een geheel van componenten om data veilig en efficiënt op te slaan. Met ondersteunende applicaties kunnen we deze data dan weer opvragen of wijzigen.

Het beheren van een database vergt specifieke kennis. Het is niet zozeer alleen de technische kennis die nodig is om het te gebruiken, maar ook qua inrichting en beheer. Een database-oplossing is voor de meeste mensen dan ook niet erg toegankelijk.

Waarom geen spreadsheet?

Een alternatief voor een database is de spreadsheet, in Excel of liever nog met een open dataformaat, zoals dat door LibreOffice en andere software wordt gebruikt. Met deze spreadsheet kunnen we data, zoals onze cd-verzameling ook in een gestructureerde manier opslaan. Met een filter zouden we kunnen zoeken alleen bepaalde rijen tonen die voldoen aan onze opdracht. Wie nog een stap verder wil gaan kan data aan elkaar linken in verschillende tabbladen of zelfs met externe data.

Spreadsheets kunnen een prima oplossing zijn, maar er zijn meer opties. Wie graag digitale vrijheid voor zijn of haar data wil behouden, kan ook kijken naar een alternatief met platte tekst.

De simpele database: platte tekst

Hoe mooi zou het zijn als er een simpeler systeem was? Een beetje zoals die oude archiefmappen of kaartsystemen, maar dan digitaal en op je eigen computer. Dat de data gemakkelijk ingevoerd kan worden zonder afleiding of zware programma’s en met eigen filters snel omhoog kunnen krijgen. Dit is wat GNU recutils mogelijk maakt.

Wat is recutils?

Recutils is open source software om data te structuren, echter opgeslagen als platte tekst (plaintext). Het is alsof je fysieke kaartjes invult, met voor ieder kaartje dezelfde velden, zoals bijvoorbeeld voornaam, achternaam, woonplaats en het telefoonnummer. Echter omdat het digitaal is, kun je (optioneel) aangeven welke velden verplicht zijn en hoe ze gesorteerd moeten worden. Je bepaalt zelf wat voor data er in jouw bestand komt en welke velden daar bij horen. Met behulp van een zoekcommando kun je zelf kiezen waar je op wil zoeken.

Je databasebestand zelf kan eenvoudig gelezen en aangepast worden, aangezien alles platte tekst is. Doe je dat graag in een grafische tekstverwerker? Prima. Liever met vim, nano of emacs? Ook prima. Een backup maken is zo simpel als hem ergens heen kopiëren of opnemen in je back-upprogramma

In de meeste Linux-distributies is het pakket onder de naam recutils te vinden en te installeren.

Hoe werkt het?

Je ‘database’ bestaat uit twee delen:

  1. Structuur
  2. Records

De structuur (Engels: record descriptor) geeft aan welke velden er zijn, eventuele verplichtingen of verwachtingen, een optionele omschrijving, etc. De records zijn je daadwerkelijke stukjes data, zoals je kaartjes in de kaartenbak. Dat kan dus heel diverse zijn, zoals contactpersonen, cd’s, boeken, of andere verzamelingen van informatie.

De velden die je gebruikt wil je natuurlijk zo relevant mogelijk maken. Een ISBN-nummer is zinvol voor een boek, maar niet voor een contactpersoon. Een voornaam juist weer niet voor een boek, wel voor personen. Kortom, je knipt de data zo op dat de velden logisch zijn.

Voorbeeldje: een contactpersoon

Bij een contactpersoon wil je waarschijnlijk de voor- en achternaam opslaan, of wellicht als gehele naam. Dan mogelijk het adres waar deze persoon woont, een e-mailadres (of meerdere) en telefoonnummer(s). Dan zouden een record er zo uit kunnen zien:

voornaam: Koos
achternaam: Jansen
email: koos.jansen@example.org
telefoonnummer: 020-1234567
telefoonnummer: 06-87654321
relatie: kaartclub

Een nieuw contactpersoon toevoegen is dan zo simpel als een nieuw blok toevoegen, gescheiden met een lege regel.

Een database opzetten: bookmarks

Wil je je eigen favoriete websites opslaan en eenvoudig terug kunnen vinden? Dan zou dat op de volgende manier kunnen.

De velden in het voorbeeld (id/title/description/url) zijn Engelstalig, maar kun je dus ook omzetten naar het Nederlands. In dat geval dient het bovenste gedeelte ook aangepast te worden, zoals achter %auto, %key, %mandatory, %singular, %sort en %type.

%rec: Bookmark
%doc: Bookmark of useful websites
%auto: id
%auto: created_at
%key: id
%mandatory: url
%singular: url
%sort: title
%type: created_at date

id: 1
title: Cloudflare speed test
description: run a test of the internet connection to see how fast and stable it is
url: https://speed.cloudflare.com/

Data invoeren

We kunnen nu handmatig een nieuw record toevoegen, maar het is gemakkelijker om dat met een commando te doen. Zeker als we daar een klein script omheen maken met de gewenste invoer.

recins -t Bookmark \
  -f titel -v "Linux voor een beginner" \
  -f "description" -v "Een toegankelijke blog met informatie voor iedereen die wil beginnen met Linux" \
  -f "url" -v "https://linux.vooreenbeginner.nl/" \
  bookmarks.rec`

Okee, dat ziet er de eerste keer wellicht wat indrukwekkend uit. Laten we het commando eens ontleden

  • -t Bookmark (dit is het recordtype, zoals achter %rec)
  • -f XYZ (het veld)
  • -v ABC (de waarde, komt achter het veld)
  • bookmarks.rec (naam van het bestand)

Ons bestand ziet er nu als volgt uit:

%rec: Bookmark
%doc: Bookmark of useful websites
%auto: id
%auto: created_at
%key: id
%mandatory: url
%singular: url
%sort: title
%type: created_at date

id: 1
title: Cloudflare speed test
description: run a test of the internet connection to see how fast and stable it is
url: https://speed.cloudflare.com/

id: 2
created_at: Thu, 20 Aug 2026 20:19:22 +0200
title: Linux voor een beginner
description: Een toegankelijke blog met informatie voor iedereen die wil beginnen met Linux
url: https://linux.vooreenbeginner.nl/

Waar komt nu ineens die ‘created_at’ vandaan? Die is automatisch aangemaakt door het gebruik van %auto en %key. Hij ziet dat het een nummer is, dus weet dat ieder nieuw record met 1 opgehoogd dient te worden.

Laten we nog een record toevoegen, zodat we daarna kunnen gaan zoeken.

recins -t Bookmark -f title -v "Privacy voor een beginner" -f "description" -v "Een Nederlandstalige website over privacy" -f "url" -v "https://privacy.vooreenbeginner.nl/" bookmarks.rec

Zoeken in onze database

Stel dat we op zoek zijn naar een blog en we weten dat hij te maken heeft met Linux, dan zouden we ervoor kunnen kiezen in de titel te zoeken op linux en in de omschrijving op blog. Als 1 van de twee een zoekresultaat heeft, dan zal het betreffende record worden getoond.

recsel --case-insensitive --expression='(title ~ "linux" || description ~ "blog")' bookmarks.rec
id: 2
created_at: Thu, 20 Aug 2026 20:19:22 +0200
title: Linux voor een beginner
description: Een toegankelijke blog met informatie voor iedereen die wil beginnen met Linux
url: https://linux.vooreenbeginner.nl/

Dit voorbeeld gebruikt –case-insensitive om niet-hoofdlettergevoelig te zoeken. We kunnen hier ook de verkorte versie -i voor gebruiken. Voor –expression kunnen we -e gebruiken.

We kunnen de uitvoer aanpassen door aan te geven met -p dat we alleen de titel, omschrijving en de link willen zien. Met -P geven we vervolgens aan dat we de veldnamen niet meer hoeven te zien, alleen de waarde zelf.

recsel -i -e '(title ~ "linux" || description ~ "blog")' -p title,description,url -P title,description,url bookmarks.rec
Linux voor een beginner
Een toegankelijke blog met informatie voor iedereen die wil beginnen met Linux
https://linux.vooreenbeginner.nl/

Wil je in alle velden zoeken op een bepaalde waarde, zoals ‘beginner’?

recsel -i -q beginner bookmarks.rec

Kort en krachtig!

Templates gebruiken

Wat als we nou de data een beetje leuk willen opmaken?

Maak in dezelfde map het bestand ‘bookmarks.template’ aan, met de volgende informatie:

≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
🚀 {{ title }}
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

❓ {{ description }}

🌐 {{ url }}

Tevens maken we een script aan bijvoorbeeld ‘bookmarks-search’, om het ons later nog gemakkelijker te maken:

#!/bin/sh
set -o nounset
if [ $# -eq 0 ]; then echo "Provide search string"; exit 1; fi
recsel -i -q "$1" bookmarks.rec | recfmt -f bookmarks.template 

Maak dit script uitvoerbaar met chmod +x bookmarks-search, zodat we hem daarna vanuit de lokale map kunnen opstarten.

./bookmarks-search beginner

De resultaten zijn nu mooi opgemaakt:

≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
🚀 Linux voor een beginner
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

❓ Een toegankelijke blog met informatie voor iedereen die wil beginnen met Linux

🌐 https://linux.vooreenbeginner.nl/

≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
🚀 Privacy voor een beginner
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

❓ Een Nederlandstalige website over privacy

🌐 https://privacy.vooreenbeginner.nl/

Interactieve zoekfunctie maken

Wil je een interactieve zoekoptie waarbij je kan zoeken in de titel en omschrijving? Dat kan bijvoorbeeld door hem te combineren met het programma fzf.

recsel -C -R "id,title,description" bookmarks.rec | fzf --preview "recsel -e '(id = {1})' bookmarks.rec | recfmt -f bookmarks.template"

Hierbij tonen we met het eerste commando het id gevolgd door titel en omschrijving. Zo kunnen we zoeken in deze velden, wat gebeurt door middel van fzf. Het ‘id’ gebruiken we om een preview te kunnen tonen van de actieve regel. Natuurlijk willen we weer de mooie opmaak uit onze eerdere template, dus die maken we onderdeel van de preview.

Ook handig om te weten

Data-vrijheid: data migreren van en naar CSV

Heb je al wat data in CSV staan, dan kun je deze data omzetten met csv2rec. Ook omgekeerd, als je bijvoorbeeld jouw database, of een deel ervan, juist weer ergens wil gebruiken waar je CSV-bestanden kan importeren. Maximale vrijheid dus om je gegevens op verschillende manieren beschikbaar te hebben.