Filter Ledger Transactions using Tags
17 Apr 2025I have been testing using Ledger-Cli to track my expenses, so far I have found the tagging system useful. In my ledger journal, each transaction is associated with a project, for example, the below transaction is assigned to project “2024 Monitor Stand”
2024-12-08 Screwfix
; project: 2024 Monitor Stand
Expenses:HomeImprovement:Tools £ 4.99
Expenses:HomeImprovement:PPE £ 19.98
Expenses:HomeImprovement:PPE £ 14.99
; :refund:
Assets:Amex
This constraint I came up with helps avoid meaningless spending on new shiny tools. Operationally, imposing this limitation on my book provides flexible ways of querying the data.
For example, bring up the transactions that do not have projects assigned to:
ledger reg exp and "expr" "not has_meta('project')" \
--format "| %(date) | %P | %(amount) | %(note) |\n"
Date | Payee | Amount | Note |
---|---|---|---|
2024/12/22 | Selco | £ 30.570 | ; CaberFloor p5 T&G 2400x600x18mm x 2 |
There is only one post that I forgot to add the project tag, so pretty good.
A bit of explanation of the ledger-cli query syntax
- exp: check only accounts contain ‘exp’, in the ledger’s convention, it is all expending accounts, i.e. Expense::*
- expr: invoke filters using expressions
- has_meta(‘project’): check if the transactions have the metadata key ‘project’
- and, not: logical operators
- –format: specify the output formatting
Another use case is counting the number of transactions per project. I use the number of purchased items as a proxy to gauge the project size.
ledger reg exp and "expr" "has_meta('project')" \
--format "%(meta('project'))\n" \
| sort | uniq -c | sort -bgr
No. Items | Project |
---|---|
39 | 2024 Loft Lights |
34 | 2024 Loft Insulation |
32 | 2025 Garage Conversion |
8 | 2024 Monitor Stand |
2 | General |
The data shows the “2024 Loft Lights” project is by far the largest . That was a simple project by itself, however, since that was my first electrical project, I had to purchase a lot of stuff, 1.5mm cables, clamps, grommets, connectors, switches, sockets etc.
Finally, I have the “refund” tag so I can flag up the items to remind of myself to check if I received the refund fully.
ledger reg "expr" "has_tag('refund')" \
--format "| %(date) | %P | %(amount) | %(note) |\n"
Date | Payee | Amount | Note |
---|---|---|---|
2024/12/08 | Screwfix | £ 14.990 | Site Optimus Gel Knee Pads |
So far I enjoyed the plain text accounting using ledger-cli. The format and syntax are simple, and yet I can do complicated queries.