3192 lines
137 KiB
Plaintext
3192 lines
137 KiB
Plaintext
|
|
hledger(1) hledger User Manuals hledger(1)
|
|
|
|
|
|
|
|
NAME
|
|
hledger - a command-line accounting tool
|
|
|
|
SYNOPSIS
|
|
hledger [-f FILE] COMMAND [OPTIONS] [ARGS]
|
|
hledger [-f FILE] ADDONCMD -- [OPTIONS] [ARGS]
|
|
hledger
|
|
|
|
DESCRIPTION
|
|
hledger is a reliable, cross-platform set of programs for tracking
|
|
money, time, or any other commodity, using double-entry accounting and
|
|
a simple, editable file format. hledger is inspired by and largely
|
|
compatible with ledger(1).
|
|
|
|
This is hledger's command-line interface (there are also terminal and
|
|
web interfaces). Its basic function is to read a plain text file de-
|
|
scribing financial transactions (in accounting terms, a general jour-
|
|
nal) and print useful reports on standard output, or export them as
|
|
CSV. hledger can also read some other file formats such as CSV files,
|
|
translating them to journal format. Additionally, hledger lists other
|
|
hledger-* executables found in the user's $PATH and can invoke them as
|
|
subcommands.
|
|
|
|
hledger reads data from one or more files in hledger journal, time-
|
|
clock, timedot, or CSV format specified with -f, or $LEDGER_FILE, or
|
|
$HOME/.hledger.journal (on windows, perhaps
|
|
C:/Users/USER/.hledger.journal). If using $LEDGER_FILE, note this must
|
|
be a real environment variable, not a shell variable. You can specify
|
|
standard input with -f-.
|
|
|
|
Transactions are dated movements of money between two (or more) named
|
|
accounts, and are recorded with journal entries like this:
|
|
|
|
2015/10/16 bought food
|
|
expenses:food $10
|
|
assets:cash
|
|
|
|
For more about this format, see hledger_journal(5).
|
|
|
|
Most users use a text editor to edit the journal, usually with an edi-
|
|
tor mode such as ledger-mode for added convenience. hledger's interac-
|
|
tive add command is another way to record new transactions. hledger
|
|
never changes existing transactions.
|
|
|
|
To get started, you can either save some entries like the above in
|
|
~/.hledger.journal, or run hledger add and follow the prompts. Then
|
|
try some commands like hledger print or hledger balance. Run hledger
|
|
with no arguments for a list of commands.
|
|
|
|
COMMON TASKS
|
|
Here are some quick examples of how to do some basic tasks with
|
|
hledger. For more details, see the reference section below, the
|
|
hledger_journal(5) manual, or the more extensive docs at
|
|
https://hledger.org.
|
|
|
|
Getting help
|
|
$ hledger # show available commands
|
|
$ hledger --help # show common options
|
|
$ hledger CMD --help # show common and command options, and command help
|
|
$ hledger help # show available manuals/topics
|
|
$ hledger help hledger # show hledger manual as info/man/text (auto-chosen)
|
|
$ hledger help journal --man # show the journal manual as a man page
|
|
$ hledger help --help # show more detailed help for the help command
|
|
|
|
Find more docs, chat, mail list, reddit, issue tracker:
|
|
https://hledger.org#help-feedback
|
|
|
|
Constructing command lines
|
|
hledger has an extensive and powerful command line interface. We
|
|
strive to keep it simple and ergonomic, but you may run into one of the
|
|
confusing real world details described in OPTIONS, below. If that hap-
|
|
pens, here are some tips that may help:
|
|
|
|
o command-specific options must go after the command (it's fine to put
|
|
all options there) (hledger CMD OPTS ARGS)
|
|
|
|
o running add-on executables directly simplifies command line parsing
|
|
(hledger-ui OPTS ARGS)
|
|
|
|
o enclose "problematic" args in single quotes
|
|
|
|
o if needed, also add a backslash to hide regular expression metachar-
|
|
acters from the shell
|
|
|
|
o to see how a misbehaving command is being parsed, add --debug=2.
|
|
|
|
Starting a journal file
|
|
hledger looks for your accounting data in a journal file,
|
|
$HOME/.hledger.journal by default:
|
|
|
|
$ hledger stats
|
|
The hledger journal file "/Users/simon/.hledger.journal" was not found.
|
|
Please create it first, eg with "hledger add" or a text editor.
|
|
Or, specify an existing journal file with -f or LEDGER_FILE.
|
|
|
|
You can override this by setting the LEDGER_FILE environment variable.
|
|
It's a good practice to keep this important file under version control,
|
|
and to start a new file each year. So you could do something like
|
|
this:
|
|
|
|
$ mkdir ~/finance
|
|
$ cd ~/finance
|
|
$ git init
|
|
Initialized empty Git repository in /Users/simon/finance/.git/
|
|
$ touch 2020.journal
|
|
$ echo "export LEDGER_FILE=$HOME/finance/2020.journal" >> ~/.bashrc
|
|
$ source ~/.bashrc
|
|
$ hledger stats
|
|
Main file : /Users/simon/finance/2020.journal
|
|
Included files :
|
|
Transactions span : to (0 days)
|
|
Last transaction : none
|
|
Transactions : 0 (0.0 per day)
|
|
Transactions last 30 days: 0 (0.0 per day)
|
|
Transactions last 7 days : 0 (0.0 per day)
|
|
Payees/descriptions : 0
|
|
Accounts : 0 (depth 0)
|
|
Commodities : 0 ()
|
|
Market prices : 0 ()
|
|
|
|
Setting opening balances
|
|
Pick a starting date for which you can look up the balances of some
|
|
real-world assets (bank accounts, wallet..) and liabilities (credit
|
|
cards..).
|
|
|
|
To avoid a lot of data entry, you may want to start with just one or
|
|
two accounts, like your checking account or cash wallet; and pick a re-
|
|
cent starting date, like today or the start of the week. You can al-
|
|
ways come back later and add more accounts and older transactions, eg
|
|
going back to january 1st.
|
|
|
|
Add an opening balances transaction to the journal, declaring the bal-
|
|
ances on this date. Here are two ways to do it:
|
|
|
|
o The first way: open the journal in any text editor and save an entry
|
|
like this:
|
|
|
|
2020-01-01 * opening balances
|
|
assets:bank:checking $1000 = $1000
|
|
assets:bank:savings $2000 = $2000
|
|
assets:cash $100 = $100
|
|
liabilities:creditcard $-50 = $-50
|
|
equity:opening/closing balances
|
|
|
|
These are start-of-day balances, ie whatever was in the account at
|
|
the end of the previous day.
|
|
|
|
The * after the date is an optional status flag. Here it means
|
|
"cleared & confirmed".
|
|
|
|
The currency symbols are optional, but usually a good idea as you'll
|
|
be dealing with multiple currencies sooner or later.
|
|
|
|
The = amounts are optional balance assertions, providing extra error
|
|
checking.
|
|
|
|
o The second way: run hledger add and follow the prompts to record a
|
|
similar transaction:
|
|
|
|
$ hledger add
|
|
Adding transactions to journal file /Users/simon/finance/2020.journal
|
|
Any command line arguments will be used as defaults.
|
|
Use tab key to complete, readline keys to edit, enter to accept defaults.
|
|
An optional (CODE) may follow transaction dates.
|
|
An optional ; COMMENT may follow descriptions or amounts.
|
|
If you make a mistake, enter < at any prompt to go one step backward.
|
|
To end a transaction, enter . when prompted.
|
|
To quit, enter . at a date prompt or press control-d or control-c.
|
|
Date [2020-02-07]: 2020-01-01
|
|
Description: * opening balances
|
|
Account 1: assets:bank:checking
|
|
Amount 1: $1000
|
|
Account 2: assets:bank:savings
|
|
Amount 2 [$-1000]: $2000
|
|
Account 3: assets:cash
|
|
Amount 3 [$-3000]: $100
|
|
Account 4: liabilities:creditcard
|
|
Amount 4 [$-3100]: $-50
|
|
Account 5: equity:opening/closing balances
|
|
Amount 5 [$-3050]:
|
|
Account 6 (or . or enter to finish this transaction): .
|
|
2020-01-01 * opening balances
|
|
assets:bank:checking $1000
|
|
assets:bank:savings $2000
|
|
assets:cash $100
|
|
liabilities:creditcard $-50
|
|
equity:opening/closing balances $-3050
|
|
|
|
Save this transaction to the journal ? [y]:
|
|
Saved.
|
|
Starting the next transaction (. or ctrl-D/ctrl-C to quit)
|
|
Date [2020-01-01]: .
|
|
|
|
If you're using version control, this could be a good time to commit
|
|
the journal. Eg:
|
|
|
|
$ git commit -m 'initial balances' 2020.journal
|
|
|
|
Recording transactions
|
|
As you spend or receive money, you can record these transactions using
|
|
one of the methods above (text editor, hledger add) or by using the
|
|
hledger-iadd or hledger-web add-ons, or by using the import command to
|
|
convert CSV data downloaded from your bank.
|
|
|
|
Here are some simple transactions, see the hledger_journal(5) manual
|
|
and hledger.org for more ideas:
|
|
|
|
2020/1/10 * gift received
|
|
assets:cash $20
|
|
income:gifts
|
|
|
|
2020.1.12 * farmers market
|
|
expenses:food $13
|
|
assets:cash
|
|
|
|
2020-01-15 paycheck
|
|
income:salary
|
|
assets:bank:checking $1000
|
|
|
|
Reconciling
|
|
Periodically you should reconcile - compare your hledger-reported bal-
|
|
ances against external sources of truth, like bank statements or your
|
|
bank's website - to be sure that your ledger accurately represents the
|
|
real-world balances (and, that the real-world institutions have not
|
|
made a mistake!). This gets easy and fast with (1) practice and (2)
|
|
frequency. If you do it daily, it can take 2-10 minutes. If you let
|
|
it pile up, expect it to take longer as you hunt down errors and dis-
|
|
crepancies.
|
|
|
|
A typical workflow:
|
|
|
|
1. Reconcile cash. Count what's in your wallet. Compare with what
|
|
hledger reports (hledger bal cash). If they are different, try to
|
|
remember the missing transaction, or look for the error in the al-
|
|
ready-recorded transactions. A register report can be helpful
|
|
(hledger reg cash). If you can't find the error, add an adjustment
|
|
transaction. Eg if you have $105 after the above, and can't explain
|
|
the missing $2, it could be:
|
|
|
|
2020-01-16 * adjust cash
|
|
assets:cash $-2 = $105
|
|
expenses:misc
|
|
|
|
2. Reconcile checking. Log in to your bank's website. Compare today's
|
|
(cleared) balance with hledger's cleared balance (hledger bal check-
|
|
ing -C). If they are different, track down the error or record the
|
|
missing transaction(s) or add an adjustment transaction, similar to
|
|
the above. Unlike the cash case, you can usually compare the trans-
|
|
action history and running balance from your bank with the one re-
|
|
ported by hledger reg checking -C. This will be easier if you gen-
|
|
erally record transaction dates quite similar to your bank's clear-
|
|
ing dates.
|
|
|
|
3. Repeat for other asset/liability accounts.
|
|
|
|
Tip: instead of the register command, use hledger-ui to see a live-up-
|
|
dating register while you edit the journal: hledger-ui --watch --regis-
|
|
ter checking -C
|
|
|
|
After reconciling, it could be a good time to mark the reconciled
|
|
transactions' status as "cleared and confirmed", if you want to track
|
|
that, by adding the * marker. Eg in the paycheck transaction above,
|
|
insert * between 2020-01-15 and paycheck
|
|
|
|
If you're using version control, this can be another good time to com-
|
|
mit:
|
|
|
|
$ git commit -m 'txns' 2020.journal
|
|
|
|
Reporting
|
|
Here are some basic reports.
|
|
|
|
Show all transactions:
|
|
|
|
$ hledger print
|
|
2020-01-01 * opening balances
|
|
assets:bank:checking $1000
|
|
assets:bank:savings $2000
|
|
assets:cash $100
|
|
liabilities:creditcard $-50
|
|
equity:opening/closing balances $-3050
|
|
|
|
2020-01-10 * gift received
|
|
assets:cash $20
|
|
income:gifts
|
|
|
|
2020-01-12 * farmers market
|
|
expenses:food $13
|
|
assets:cash
|
|
|
|
2020-01-15 * paycheck
|
|
income:salary
|
|
assets:bank:checking $1000
|
|
|
|
2020-01-16 * adjust cash
|
|
assets:cash $-2 = $105
|
|
expenses:misc
|
|
|
|
Show account names, and their hierarchy:
|
|
|
|
$ hledger accounts --tree
|
|
assets
|
|
bank
|
|
checking
|
|
savings
|
|
cash
|
|
equity
|
|
opening/closing balances
|
|
expenses
|
|
food
|
|
misc
|
|
income
|
|
gifts
|
|
salary
|
|
liabilities
|
|
creditcard
|
|
|
|
Show all account totals:
|
|
|
|
$ hledger balance
|
|
$4105 assets
|
|
$4000 bank
|
|
$2000 checking
|
|
$2000 savings
|
|
$105 cash
|
|
$-3050 equity:opening/closing balances
|
|
$15 expenses
|
|
$13 food
|
|
$2 misc
|
|
$-1020 income
|
|
$-20 gifts
|
|
$-1000 salary
|
|
$-50 liabilities:creditcard
|
|
--------------------
|
|
0
|
|
|
|
Show only asset and liability balances, as a flat list, limited to
|
|
depth 2:
|
|
|
|
$ hledger bal assets liabilities --flat -2
|
|
$4000 assets:bank
|
|
$105 assets:cash
|
|
$-50 liabilities:creditcard
|
|
--------------------
|
|
$4055
|
|
|
|
Show the same thing without negative numbers, formatted as a simple
|
|
balance sheet:
|
|
|
|
$ hledger bs --flat -2
|
|
Balance Sheet 2020-01-16
|
|
|
|
|| 2020-01-16
|
|
========================++============
|
|
Assets ||
|
|
------------------------++------------
|
|
assets:bank || $4000
|
|
assets:cash || $105
|
|
------------------------++------------
|
|
|| $4105
|
|
========================++============
|
|
Liabilities ||
|
|
------------------------++------------
|
|
liabilities:creditcard || $50
|
|
------------------------++------------
|
|
|| $50
|
|
========================++============
|
|
Net: || $4055
|
|
|
|
The final total is your "net worth" on the end date. (Or use bse for a
|
|
full balance sheet with equity.)
|
|
|
|
Show income and expense totals, formatted as an income statement:
|
|
|
|
hledger is
|
|
Income Statement 2020-01-01-2020-01-16
|
|
|
|
|| 2020-01-01-2020-01-16
|
|
===============++=======================
|
|
Revenues ||
|
|
---------------++-----------------------
|
|
income:gifts || $20
|
|
income:salary || $1000
|
|
---------------++-----------------------
|
|
|| $1020
|
|
===============++=======================
|
|
Expenses ||
|
|
---------------++-----------------------
|
|
expenses:food || $13
|
|
expenses:misc || $2
|
|
---------------++-----------------------
|
|
|| $15
|
|
===============++=======================
|
|
Net: || $1005
|
|
|
|
The final total is your net income during this period.
|
|
|
|
Show transactions affecting your wallet, with running total:
|
|
|
|
$ hledger register cash
|
|
2020-01-01 opening balances assets:cash $100 $100
|
|
2020-01-10 gift received assets:cash $20 $120
|
|
2020-01-12 farmers market assets:cash $-13 $107
|
|
2020-01-16 adjust cash assets:cash $-2 $105
|
|
|
|
Show weekly posting counts as a bar chart:
|
|
|
|
$ hledger activity -W
|
|
2019-12-30 *****
|
|
2020-01-06 ****
|
|
2020-01-13 ****
|
|
|
|
Migrating to a new file
|
|
At the end of the year, you may want to continue your journal in a new
|
|
file, so that old transactions don't slow down or clutter your reports,
|
|
and to help ensure the integrity of your accounting history. See the
|
|
close command.
|
|
|
|
If using version control, don't forget to git add the new file.
|
|
|
|
OPTIONS
|
|
General options
|
|
To see general usage help, including general options which are sup-
|
|
ported by most hledger commands, run hledger -h.
|
|
|
|
General help options:
|
|
|
|
-h --help
|
|
show general usage (or after COMMAND, command usage)
|
|
|
|
--version
|
|
show version
|
|
|
|
--debug[=N]
|
|
show debug output (levels 1-9, default: 1)
|
|
|
|
General input options:
|
|
|
|
-f FILE --file=FILE
|
|
use a different input file. For stdin, use - (default:
|
|
$LEDGER_FILE or $HOME/.hledger.journal)
|
|
|
|
--rules-file=RULESFILE
|
|
Conversion rules file to use when reading CSV (default:
|
|
FILE.rules)
|
|
|
|
--separator=CHAR
|
|
Field separator to expect when reading CSV (default: ',')
|
|
|
|
--alias=OLD=NEW
|
|
rename accounts named OLD to NEW
|
|
|
|
--anon anonymize accounts and payees
|
|
|
|
--pivot FIELDNAME
|
|
use some other field or tag for the account name
|
|
|
|
-I --ignore-assertions
|
|
disable balance assertion checks (note: does not disable balance
|
|
assignments)
|
|
|
|
General reporting options:
|
|
|
|
-b --begin=DATE
|
|
include postings/txns on or after this date
|
|
|
|
-e --end=DATE
|
|
include postings/txns before this date
|
|
|
|
-D --daily
|
|
multiperiod/multicolumn report by day
|
|
|
|
-W --weekly
|
|
multiperiod/multicolumn report by week
|
|
|
|
-M --monthly
|
|
multiperiod/multicolumn report by month
|
|
|
|
-Q --quarterly
|
|
multiperiod/multicolumn report by quarter
|
|
|
|
-Y --yearly
|
|
multiperiod/multicolumn report by year
|
|
|
|
-p --period=PERIODEXP
|
|
set start date, end date, and/or reporting interval all at once
|
|
using period expressions syntax
|
|
|
|
--date2
|
|
match the secondary date instead (see command help for other ef-
|
|
fects)
|
|
|
|
-U --unmarked
|
|
include only unmarked postings/txns (can combine with -P or -C)
|
|
|
|
-P --pending
|
|
include only pending postings/txns
|
|
|
|
-C --cleared
|
|
include only cleared postings/txns
|
|
|
|
-R --real
|
|
include only non-virtual postings
|
|
|
|
-NUM --depth=NUM
|
|
hide/aggregate accounts or postings more than NUM levels deep
|
|
|
|
-E --empty
|
|
show items with zero amount, normally hidden (and vice-versa in
|
|
hledger-ui/hledger-web)
|
|
|
|
-B --cost
|
|
convert amounts to their cost at transaction time (using the
|
|
transaction price, if any)
|
|
|
|
-V --value
|
|
convert amounts to their market value on the report end date
|
|
(using the most recent applicable market price, if any)
|
|
|
|
--auto apply automated posting rules to modify transactions.
|
|
|
|
--forecast
|
|
generate future transactions from periodic transaction rules,
|
|
for the next 6 months or till report end date. In hledger-ui,
|
|
also make ordinary future transactions visible.
|
|
|
|
When a reporting option appears more than once in the command line, the
|
|
last one takes precedence.
|
|
|
|
Some reporting options can also be written as query arguments.
|
|
|
|
Command options
|
|
To see options for a particular command, including command-specific op-
|
|
tions, run: hledger COMMAND -h.
|
|
|
|
Command-specific options must be written after the command name, eg:
|
|
hledger print -x.
|
|
|
|
Additionally, if the command is an addon, you may need to put its op-
|
|
tions after a double-hyphen, eg: hledger ui -- --watch. Or, you can
|
|
run the addon executable directly: hledger-ui --watch.
|
|
|
|
Command arguments
|
|
Most hledger commands accept arguments after the command name, which
|
|
are often a query, filtering the data in some way.
|
|
|
|
You can save a set of command line options/arguments in a file, and
|
|
then reuse them by writing @FILENAME as a command line argument. Eg:
|
|
hledger bal @foo.args. (To prevent this, eg if you have an argument
|
|
that begins with a literal @, precede it with --, eg: hledger bal --
|
|
@ARG).
|
|
|
|
Inside the argument file, each line should contain just one option or
|
|
argument. Avoid the use of spaces, except inside quotes (or you'll see
|
|
a confusing error). Between a flag and its argument, use = (or noth-
|
|
ing). Bad:
|
|
|
|
assets depth:2
|
|
-X USD
|
|
|
|
Good:
|
|
|
|
assets
|
|
depth:2
|
|
-X=USD
|
|
|
|
For special characters (see below), use one less level of quoting than
|
|
you would at the command prompt. Bad:
|
|
|
|
-X"$"
|
|
|
|
Good:
|
|
|
|
-X$
|
|
|
|
See also: Save frequently used options.
|
|
|
|
Queries
|
|
One of hledger's strengths is being able to quickly report on precise
|
|
subsets of your data. Most commands accept an optional query expres-
|
|
sion, written as arguments after the command name, to filter the data
|
|
by date, account name or other criteria. The syntax is similar to a
|
|
web search: one or more space-separated search terms, quotes to enclose
|
|
whitespace, prefixes to match specific fields, a not: prefix to negate
|
|
the match.
|
|
|
|
We do not yet support arbitrary boolean combinations of search terms;
|
|
instead most commands show transactions/postings/accounts which match
|
|
(or negatively match):
|
|
|
|
o any of the description terms AND
|
|
|
|
o any of the account terms AND
|
|
|
|
o any of the status terms AND
|
|
|
|
o all the other terms.
|
|
|
|
The print command instead shows transactions which:
|
|
|
|
o match any of the description terms AND
|
|
|
|
o have any postings matching any of the positive account terms AND
|
|
|
|
o have no postings matching any of the negative account terms AND
|
|
|
|
o match all the other terms.
|
|
|
|
The following kinds of search terms can be used. Remember these can
|
|
also be prefixed with not:, eg to exclude a particular subaccount.
|
|
|
|
REGEX, acct:REGEX
|
|
match account names by this regular expression. (With no pre-
|
|
fix, acct: is assumed.) same as above
|
|
|
|
amt:N, amt:<N, amt:<=N, amt:>N, amt:>=N
|
|
match postings with a single-commodity amount that is equal to,
|
|
less than, or greater than N. (Multi-commodity amounts are not
|
|
tested, and will always match.) The comparison has two modes: if
|
|
N is preceded by a + or - sign (or is 0), the two signed numbers
|
|
are compared. Otherwise, the absolute magnitudes are compared,
|
|
ignoring sign.
|
|
|
|
code:REGEX
|
|
match by transaction code (eg check number)
|
|
|
|
cur:REGEX
|
|
match postings or transactions including any amounts whose cur-
|
|
rency/commodity symbol is fully matched by REGEX. (For a par-
|
|
tial match, use .*REGEX.*). Note, to match characters which are
|
|
regex-significant, like the dollar sign ($), you need to prepend
|
|
\. And when using the command line you need to add one more
|
|
level of quoting to hide it from the shell, so eg do: hledger
|
|
print cur:'\$' or hledger print cur:\\$.
|
|
|
|
desc:REGEX
|
|
match transaction descriptions.
|
|
|
|
date:PERIODEXPR
|
|
match dates within the specified period. PERIODEXPR is a period
|
|
expression (with no report interval). Examples: date:2016,
|
|
date:thismonth, date:2000/2/1-2/15, date:lastweek-. If the
|
|
--date2 command line flag is present, this matches secondary
|
|
dates instead.
|
|
|
|
date2:PERIODEXPR
|
|
match secondary dates within the specified period.
|
|
|
|
depth:N
|
|
match (or display, depending on command) accounts at or above
|
|
this depth
|
|
|
|
note:REGEX
|
|
match transaction notes (part of description right of |, or
|
|
whole description when there's no |)
|
|
|
|
payee:REGEX
|
|
match transaction payee/payer names (part of description left of
|
|
|, or whole description when there's no |)
|
|
|
|
real:, real:0
|
|
match real or virtual postings respectively
|
|
|
|
status:, status:!, status:*
|
|
match unmarked, pending, or cleared transactions respectively
|
|
|
|
tag:REGEX[=REGEX]
|
|
match by tag name, and optionally also by tag value. Note a
|
|
tag: query is considered to match a transaction if it matches
|
|
any of the postings. Also remember that postings inherit the
|
|
tags of their parent transaction.
|
|
|
|
The following special search term is used automatically in hledger-web,
|
|
only:
|
|
|
|
inacct:ACCTNAME
|
|
tells hledger-web to show the transaction register for this ac-
|
|
count. Can be filtered further with acct etc.
|
|
|
|
Some of these can also be expressed as command-line options (eg depth:2
|
|
is equivalent to --depth 2). Generally you can mix options and query
|
|
arguments, and the resulting query will be their intersection (perhaps
|
|
excluding the -p/--period option).
|
|
|
|
Special characters in arguments and queries
|
|
In shell command lines, option and argument values which contain "prob-
|
|
lematic" characters, ie spaces, and also characters significant to your
|
|
shell such as <, >, (, ), | and $, should be escaped by enclosing them
|
|
in quotes or by writing backslashes before the characters. Eg:
|
|
|
|
hledger register -p 'last year' "accounts receivable (receiv-
|
|
able|payable)" amt:\>100.
|
|
|
|
More escaping
|
|
Characters significant both to the shell and in regular expressions may
|
|
need one extra level of escaping. These include parentheses, the pipe
|
|
symbol and the dollar sign. Eg, to match the dollar symbol, bash users
|
|
should do:
|
|
|
|
hledger balance cur:'\$'
|
|
|
|
or:
|
|
|
|
hledger balance cur:\\$
|
|
|
|
Even more escaping
|
|
When hledger runs an addon executable (eg you type hledger ui, hledger
|
|
runs hledger-ui), it de-escapes command-line options and arguments
|
|
once, so you might need to triple-escape. Eg in bash, running the ui
|
|
command and matching the dollar sign, it's:
|
|
|
|
hledger ui cur:'\\$'
|
|
|
|
or:
|
|
|
|
hledger ui cur:\\\\$
|
|
|
|
If you asked why four slashes above, this may help:
|
|
|
|
unescaped: $
|
|
escaped: \$
|
|
double-escaped: \\$
|
|
triple-escaped: \\\\$
|
|
|
|
(The number of backslashes in fish shell is left as an exercise for the
|
|
reader.)
|
|
|
|
You can always avoid the extra escaping for addons by running the addon
|
|
directly:
|
|
|
|
hledger-ui cur:\\$
|
|
|
|
Less escaping
|
|
Inside an argument file, or in the search field of hledger-ui or
|
|
hledger-web, or at a GHCI prompt, you need one less level of escaping
|
|
than at the command line. And backslashes may work better than quotes.
|
|
Eg:
|
|
|
|
ghci> :main balance cur:\$
|
|
|
|
Unicode characters
|
|
hledger is expected to handle non-ascii characters correctly:
|
|
|
|
o they should be parsed correctly in input files and on the command
|
|
line, by all hledger tools (add, iadd, hledger-web's search/add/edit
|
|
forms, etc.)
|
|
|
|
o they should be displayed correctly by all hledger tools, and on-
|
|
screen alignment should be preserved.
|
|
|
|
This requires a well-configured environment. Here are some tips:
|
|
|
|
o A system locale must be configured, and it must be one that can de-
|
|
code the characters being used. In bash, you can set a locale like
|
|
this: export LANG=en_US.UTF-8. There are some more details in Trou-
|
|
bleshooting. This step is essential - without it, hledger will quit
|
|
on encountering a non-ascii character (as with all GHC-compiled pro-
|
|
grams).
|
|
|
|
o your terminal software (eg Terminal.app, iTerm, CMD.exe, xterm..)
|
|
must support unicode
|
|
|
|
o the terminal must be using a font which includes the required unicode
|
|
glyphs
|
|
|
|
o the terminal should be configured to display wide characters as dou-
|
|
ble width (for report alignment)
|
|
|
|
o on Windows, for best results you should run hledger in the same kind
|
|
of environment in which it was built. Eg hledger built in the stan-
|
|
dard CMD.EXE environment (like the binaries on our download page)
|
|
might show display problems when run in a cygwin or msys terminal,
|
|
and vice versa. (See eg #961).
|
|
|
|
Input files
|
|
hledger reads transactions from a data file (and the add command writes
|
|
to it). By default this file is $HOME/.hledger.journal (or on Windows,
|
|
something like C:/Users/USER/.hledger.journal). You can override this
|
|
with the $LEDGER_FILE environment variable:
|
|
|
|
$ setenv LEDGER_FILE ~/finance/2016.journal
|
|
$ hledger stats
|
|
|
|
or with the -f/--file option:
|
|
|
|
$ hledger -f /some/file stats
|
|
|
|
The file name - (hyphen) means standard input:
|
|
|
|
$ cat some.journal | hledger -f-
|
|
|
|
Usually the data file is in hledger's journal format, but it can also
|
|
be one of several other formats, listed below. hledger detects the
|
|
format automatically based on the file extension, or if that is not
|
|
recognised, by trying each built-in "reader" in turn:
|
|
|
|
Reader: Reads: Used for file extensions:
|
|
-----------------------------------------------------------------------------
|
|
journal hledger's journal format, also .journal .j .hledger .ledger
|
|
some Ledger journals
|
|
time- timeclock files (precise time .timeclock
|
|
clock logging)
|
|
timedot timedot files (approximate time .timedot
|
|
logging)
|
|
csv comma-separated values (data .csv
|
|
interchange)
|
|
|
|
If needed (eg to ensure correct error messages when a file has the
|
|
"wrong" extension), you can force a specific reader/format by prepend-
|
|
ing it to the file path with a colon. Examples:
|
|
|
|
$ hledger -f csv:/some/csv-file.dat stats
|
|
$ echo 'i 2009/13/1 08:00:00' | hledger print -ftimeclock:-
|
|
|
|
You can also specify multiple -f options, to read multiple files as one
|
|
big journal. There are some limitations with this:
|
|
|
|
o directives in one file will not affect the other files
|
|
|
|
o balance assertions will not see any account balances from previous
|
|
files
|
|
|
|
If you need those, either use the include directive, or concatenate the
|
|
files, eg: cat a.journal b.journal | hledger -f- CMD.
|
|
|
|
Output destination
|
|
hledger commands send their output to the terminal by default. You can
|
|
of course redirect this, eg into a file, using standard shell syntax:
|
|
|
|
$ hledger print > foo.txt
|
|
|
|
Some commands (print, register, stats, the balance commands) also pro-
|
|
vide the -o/--output-file option, which does the same thing without
|
|
needing the shell. Eg:
|
|
|
|
$ hledger print -o foo.txt
|
|
$ hledger print -o - # write to stdout (the default)
|
|
|
|
Output format
|
|
Some commands (print, register, the balance commands) offer a choice of
|
|
output format. In addition to the usual plain text format (txt), there
|
|
are CSV (csv), HTML (html) and JSON (json). This is controlled by the
|
|
-O/--output-format option:
|
|
|
|
$ hledger print -O csv
|
|
|
|
or, by a file extension specified with -o/--output-file:
|
|
|
|
$ hledger balancesheet -o foo.html # write HTML to foo.html
|
|
|
|
The -O option can be used to override the file extension if needed:
|
|
|
|
$ hledger balancesheet -o foo.txt -O html # write HTML to foo.txt
|
|
|
|
Some notes about JSON output:
|
|
|
|
o This feature is marked experimental, and not yet much used; you
|
|
should expect our JSON to evolve. Real-world feedback is welcome.
|
|
|
|
o Our JSON is rather large and verbose, as it is quite a faithful rep-
|
|
resentation of hledger's internal data types. To understand the
|
|
JSON, read the Haskell type definitions, which are mostly in
|
|
https://github.com/simonmichael/hledger/blob/master/hledger-
|
|
lib/Hledger/Data/Types.hs.
|
|
|
|
o The JSON output from hledger commands is essentially the same as the
|
|
JSON served by hledger-web's JSON API, but pretty printed, using line
|
|
breaks and indentation. Our pretty printer has the ability to elide
|
|
data in certain cases - rendering non-strings as if they were
|
|
strings, or displaying "FOO.." instead of FOO's full details. This
|
|
should never happen in hledger's JSON output; if you see otherwise,
|
|
please report as a bug.
|
|
|
|
o hledger represents quantities as Decimal values storing up to 255
|
|
significant digits, eg for repeating decimals. Such numbers can
|
|
arise in practice (from automatically-calculated transaction prices),
|
|
and would break most JSON consumers. So in JSON, we show quantities
|
|
as simple Numbers with at most 10 decimal places. We don't limit the
|
|
number of integer digits, but that part is under your control. We
|
|
hope this approach will not cause problems in practice; if you find
|
|
otherwise, please let us know. (Cf #1195)
|
|
|
|
Regular expressions
|
|
hledger uses regular expressions in a number of places:
|
|
|
|
o query terms, on the command line and in the hledger-web search form:
|
|
REGEX, desc:REGEX, cur:REGEX, tag:...=REGEX
|
|
|
|
o CSV rules conditional blocks: if REGEX ...
|
|
|
|
o account alias directives and options: alias /REGEX/ = REPLACEMENT,
|
|
--alias /REGEX/=REPLACEMENT
|
|
|
|
hledger's regular expressions come from the regex-tdfa library. In
|
|
general they:
|
|
|
|
o are case insensitive
|
|
|
|
o are infix matching (do not need to match the entire thing being
|
|
matched)
|
|
|
|
o are POSIX extended regular expressions
|
|
|
|
o also support GNU word boundaries (\<, \>, \b, \B)
|
|
|
|
o and parenthesised capturing groups and numeric backreferences in re-
|
|
placement strings
|
|
|
|
o do not support mode modifiers like (?s)
|
|
|
|
Some things to note:
|
|
|
|
o In the alias directive and --alias option, regular expressions must
|
|
be enclosed in forward slashes (/REGEX/). Elsewhere in hledger,
|
|
these are not required.
|
|
|
|
o In queries, to match a regular expression metacharacter like $ as a
|
|
literal character, prepend a backslash. Eg to search for amounts
|
|
with the dollar sign in hledger-web, write cur:\$.
|
|
|
|
o On the command line, some metacharacters like $ have a special mean-
|
|
ing to the shell and so must be escaped at least once more. See Spe-
|
|
cial characters.
|
|
|
|
Smart dates
|
|
hledger's user interfaces accept a flexible "smart date" syntax (unlike
|
|
dates in the journal file). Smart dates allow some english words, can
|
|
be relative to today's date, and can have less-significant date parts
|
|
omitted (defaulting to 1).
|
|
|
|
Examples:
|
|
|
|
2004/10/1, 2004-01-01, exact date, several separators allowed. Year
|
|
2004.9.1 is 4+ digits, month is 1-12, day is 1-31
|
|
2004 start of year
|
|
2004/10 start of month
|
|
10/1 month and day in current year
|
|
21 day in current month
|
|
october, oct start of month in current year
|
|
yesterday, today, tomor- -1, 0, 1 days from today
|
|
row
|
|
last/this/next -1, 0, 1 periods from the current period
|
|
day/week/month/quar-
|
|
ter/year
|
|
20181201 8 digit YYYYMMDD with valid year month and day
|
|
201812 6 digit YYYYMM with valid year and month
|
|
|
|
Counterexamples - malformed digit sequences might give surprising re-
|
|
sults:
|
|
|
|
201813 6 digits with an invalid month is parsed as start of
|
|
6-digit year
|
|
20181301 8 digits with an invalid month is parsed as start of
|
|
8-digit year
|
|
20181232 8 digits with an invalid day gives an error
|
|
201801012 9+ digits beginning with a valid YYYYMMDD gives an error
|
|
|
|
Report start & end date
|
|
Most hledger reports show the full span of time represented by the
|
|
journal data, by default. So, the effective report start and end dates
|
|
will be the earliest and latest transaction or posting dates found in
|
|
the journal.
|
|
|
|
Often you will want to see a shorter time span, such as the current
|
|
month. You can specify a start and/or end date using -b/--begin,
|
|
-e/--end, -p/--period or a date: query (described below). All of these
|
|
accept the smart date syntax.
|
|
|
|
Some notes:
|
|
|
|
o As in Ledger, end dates are exclusive, so you need to write the date
|
|
after the last day you want to include.
|
|
|
|
o As noted in reporting options: among start/end dates specified with
|
|
options, the last (i.e. right-most) option takes precedence.
|
|
|
|
o The effective report start and end dates are the intersection of the
|
|
start/end dates from options and that from date: queries. That is,
|
|
date:2019-01 date:2019 -p'2000 to 2030' yields January 2019, the
|
|
smallest common time span.
|
|
|
|
Examples:
|
|
|
|
-b 2016/3/17 begin on St. Patrick's day 2016
|
|
-e 12/1 end at the start of december 1st of the current year
|
|
(11/30 will be the last date included)
|
|
-b thismonth all transactions on or after the 1st of the current month
|
|
-p thismonth all transactions in the current month
|
|
date:2016/3/17- the above written as queries instead
|
|
date:-12/1
|
|
date:thismonth-
|
|
date:thismonth
|
|
|
|
Report intervals
|
|
A report interval can be specified so that commands like register, bal-
|
|
ance and activity will divide their reports into multiple subperiods.
|
|
The basic intervals can be selected with one of -D/--daily,
|
|
-W/--weekly, -M/--monthly, -Q/--quarterly, or -Y/--yearly. More com-
|
|
plex intervals may be specified with a period expression. Report in-
|
|
tervals can not be specified with a query.
|
|
|
|
Period expressions
|
|
The -p/--period option accepts period expressions, a shorthand way of
|
|
expressing a start date, end date, and/or report interval all at once.
|
|
|
|
Here's a basic period expression specifying the first quarter of 2009.
|
|
Note, hledger always treats start dates as inclusive and end dates as
|
|
exclusive:
|
|
|
|
-p "from 2009/1/1 to 2009/4/1"
|
|
|
|
Keywords like "from" and "to" are optional, and so are the spaces, as
|
|
long as you don't run two dates together. "to" can also be written as
|
|
"-". These are equivalent to the above:
|
|
|
|
-p "2009/1/1 2009/4/1"
|
|
-p2009/1/1to2009/4/1
|
|
-p2009/1/1-2009/4/1
|
|
|
|
Dates are smart dates, so if the current year is 2009, the above can
|
|
also be written as:
|
|
|
|
-p "1/1 4/1"
|
|
-p "january-apr"
|
|
-p "this year to 4/1"
|
|
|
|
If you specify only one date, the missing start or end date will be the
|
|
earliest or latest transaction in your journal:
|
|
|
|
-p "from 2009/1/1" everything after january
|
|
1, 2009
|
|
-p "from 2009/1" the same
|
|
-p "from 2009" the same
|
|
-p "to 2009" everything before january
|
|
1, 2009
|
|
|
|
A single date with no "from" or "to" defines both the start and end
|
|
date like so:
|
|
|
|
-p "2009" the year 2009; equivalent
|
|
to "2009/1/1 to 2010/1/1"
|
|
-p "2009/1" the month of jan; equiva-
|
|
lent to "2009/1/1 to
|
|
2009/2/1"
|
|
-p "2009/1/1" just that day; equivalent
|
|
to "2009/1/1 to 2009/1/2"
|
|
|
|
The argument of -p can also begin with, or be, a report interval ex-
|
|
pression. The basic report intervals are daily, weekly, monthly, quar-
|
|
terly, or yearly, which have the same effect as the -D,-W,-M,-Q, or -Y
|
|
flags. Between report interval and start/end dates (if any), the word
|
|
in is optional. Examples:
|
|
|
|
-p "weekly from 2009/1/1 to 2009/4/1"
|
|
-p "monthly in 2008"
|
|
-p "quarterly"
|
|
|
|
Note that weekly, monthly, quarterly and yearly intervals will always
|
|
start on the first day on week, month, quarter or year accordingly, and
|
|
will end on the last day of same period, even if associated period ex-
|
|
pression specifies different explicit start and end date.
|
|
|
|
For example:
|
|
|
|
-p "weekly from 2009/1/1 starts on 2008/12/29, closest preceding Mon-
|
|
to 2009/4/1" day
|
|
|
|
|
|
-p "monthly in starts on 2018/11/01
|
|
2008/11/25"
|
|
-p "quarterly from starts on 2009/04/01, ends on 2009/06/30,
|
|
2009-05-05 to 2009-06-01" which are first and last days of Q2 2009
|
|
-p "yearly from starts on 2009/01/01, first day of 2009
|
|
2009-12-29"
|
|
|
|
The following more complex report intervals are also supported: bi-
|
|
weekly, bimonthly, every day|week|month|quarter|year, every N
|
|
days|weeks|months|quarters|years.
|
|
|
|
All of these will start on the first day of the requested period and
|
|
end on the last one, as described above.
|
|
|
|
Examples:
|
|
|
|
-p "bimonthly from 2008" periods will have boundaries on 2008/01/01,
|
|
2008/03/01, ...
|
|
-p "every 2 weeks" starts on closest preceding Monday
|
|
-p "every 5 month from periods will have boundaries on 2009/03/01,
|
|
2009/03" 2009/08/01, ...
|
|
|
|
If you want intervals that start on arbitrary day of your choosing and
|
|
span a week, month or year, you need to use any of the following:
|
|
|
|
every Nth day of week, every <weekday>, every Nth day [of month], every
|
|
Nth weekday [of month], every MM/DD [of year], every Nth MMM [of year],
|
|
every MMM Nth [of year].
|
|
|
|
Examples:
|
|
|
|
-p "every 2nd day of periods will go from Tue to Tue
|
|
week"
|
|
-p "every Tue" same
|
|
-p "every 15th day" period boundaries will be on 15th of each
|
|
month
|
|
-p "every 2nd Monday" period boundaries will be on second Monday of
|
|
each month
|
|
-p "every 11/05" yearly periods with boundaries on 5th of Nov
|
|
-p "every 5th Nov" same
|
|
-p "every Nov 5th" same
|
|
|
|
Show historical balances at end of 15th each month (N is exclusive end
|
|
date):
|
|
|
|
hledger balance -H -p "every 16th day"
|
|
|
|
Group postings from start of wednesday to end of next tuesday (N is
|
|
start date and exclusive end date):
|
|
|
|
hledger register checking -p "every 3rd day of week"
|
|
|
|
Depth limiting
|
|
With the --depth N option (short form: -N), commands like account, bal-
|
|
ance and register will show only the uppermost accounts in the account
|
|
tree, down to level N. Use this when you want a summary with less de-
|
|
tail. This flag has the same effect as a depth: query argument (so -2,
|
|
--depth=2 or depth:2 are basically equivalent).
|
|
|
|
Pivoting
|
|
Normally hledger sums amounts, and organizes them in a hierarchy, based
|
|
on account name. The --pivot FIELD option causes it to sum and orga-
|
|
nize hierarchy based on the value of some other field instead. FIELD
|
|
can be: code, description, payee, note, or the full name (case insensi-
|
|
tive) of any tag. As with account names, values containing colon:sepa-
|
|
rated:parts will be displayed hierarchically in reports.
|
|
|
|
--pivot is a general option affecting all reports; you can think of
|
|
hledger transforming the journal before any other processing, replacing
|
|
every posting's account name with the value of the specified field on
|
|
that posting, inheriting it from the transaction or using a blank value
|
|
if it's not present.
|
|
|
|
An example:
|
|
|
|
2016/02/16 Member Fee Payment
|
|
assets:bank account 2 EUR
|
|
income:member fees -2 EUR ; member: John Doe
|
|
|
|
Normal balance report showing account names:
|
|
|
|
$ hledger balance
|
|
2 EUR assets:bank account
|
|
-2 EUR income:member fees
|
|
--------------------
|
|
0
|
|
|
|
Pivoted balance report, using member: tag values instead:
|
|
|
|
$ hledger balance --pivot member
|
|
2 EUR
|
|
-2 EUR John Doe
|
|
--------------------
|
|
0
|
|
|
|
One way to show only amounts with a member: value (using a query, de-
|
|
scribed below):
|
|
|
|
$ hledger balance --pivot member tag:member=.
|
|
-2 EUR John Doe
|
|
--------------------
|
|
-2 EUR
|
|
|
|
Another way (the acct: query matches against the pivoted "account
|
|
name"):
|
|
|
|
$ hledger balance --pivot member acct:.
|
|
-2 EUR John Doe
|
|
--------------------
|
|
-2 EUR
|
|
|
|
Valuation
|
|
-B: Cost
|
|
The -B/--cost flag converts amounts to their cost (or selling price) at
|
|
transaction time, if they have a transaction price specified. This
|
|
flag is equivalent to --value=cost, described below.
|
|
|
|
-V: Market value
|
|
The -V/--market flag converts reported amounts to their market value in
|
|
a default valuation commodity, using the market prices in effect on a
|
|
default valuation date. For single period reports, the valuation date
|
|
is today (equivalent to --value=now); for multiperiod reports, it is
|
|
the last day of each subperiod (equivalent to --value=end).
|
|
|
|
The default valuation commodity is the one referenced in the latest ap-
|
|
plicable market price dated on or before the valuation date. If most
|
|
of your P declarations lead to a single home currency, this will usu-
|
|
ally be what you want. (To specify the commodity, see -X below.)
|
|
|
|
Note that in hledger, market prices are always declared explicitly with
|
|
P directives; we do not infer them from transaction prices as Ledger
|
|
does.
|
|
|
|
Here's a quick example of -V:
|
|
|
|
; one euro is worth this many dollars from nov 1
|
|
P 2016/11/01 EUR $1.10
|
|
|
|
; purchase some euros on nov 3
|
|
2016/11/3
|
|
assets:euros EUR100
|
|
assets:checking
|
|
|
|
; the euro is worth fewer dollars by dec 21
|
|
P 2016/12/21 EUR $1.03
|
|
|
|
How many euros do I have ?
|
|
|
|
$ hledger -f t.j bal -N euros
|
|
EUR100 assets:euros
|
|
|
|
What are they worth at end of nov 3 ?
|
|
|
|
$ hledger -f t.j bal -N euros -V -e 2016/11/4
|
|
$110.00 assets:euros
|
|
|
|
What are they worth after 2016/12/21 ? (no report end date specified,
|
|
defaults to today)
|
|
|
|
$ hledger -f t.j bal -N euros -V
|
|
$103.00 assets:euros
|
|
|
|
-X: Market value in specified commodity
|
|
The -X/--exchange option is like -V, except it specifies the target
|
|
commodity you would like to convert to. It is equivalent to
|
|
--value=now,COMM or --value=end,COMM.
|
|
|
|
--value: Flexible valuation
|
|
(experimental, added 201905)
|
|
|
|
-B, -V and -X are special cases of the more general --value option:
|
|
|
|
--value=TYPE[,COMM] TYPE is cost, then, end, now or YYYY-MM-DD.
|
|
COMM is an optional commodity symbol.
|
|
Shows amounts converted to:
|
|
- cost commodity using transaction prices (then optionally to COMM using market prices at period end(s))
|
|
- default valuation commodity (or COMM) using market prices at posting dates
|
|
- default valuation commodity (or COMM) using market prices at period end(s)
|
|
- default valuation commodity (or COMM) using current market prices
|
|
- default valuation commodity (or COMM) using market prices at some date
|
|
|
|
The TYPE part basically selects either "cost", or "market value" plus a
|
|
valuation date:
|
|
|
|
--value=cost
|
|
Convert amounts to cost, using the prices recorded in transac-
|
|
tions.
|
|
|
|
--value=then
|
|
Convert amounts to their value in a default valuation commodity,
|
|
using market prices on each posting's date. This is currently
|
|
supported only by the print and register commands.
|
|
|
|
--value=end
|
|
Convert amounts to their value in a default valuation commodity,
|
|
using market prices on the last day of the report period (or if
|
|
unspecified, the journal's end date); or in multiperiod reports,
|
|
market prices on the last day of each subperiod.
|
|
|
|
--value=now
|
|
Convert amounts to their value in default valuation commodity
|
|
using current market prices (as of when report is generated).
|
|
|
|
--value=YYYY-MM-DD
|
|
Convert amounts to their value in default valuation commodity
|
|
using market prices on this date.
|
|
|
|
The default valuation commodity is the commodity mentioned in the most
|
|
recent applicable market price declaration. When all your price decla-
|
|
rations lead to a single home currency, this will usually do what you
|
|
want.
|
|
|
|
To select a different valuation commodity, add the optional ,COMM part:
|
|
a comma, then the target commodity's symbol. Eg: --value=now,EUR.
|
|
hledger will do its best to convert amounts to this commodity, using:
|
|
|
|
o declared prices (from source commodity to valuation commodity)
|
|
|
|
o reverse prices (declared prices from valuation to source commodity,
|
|
inverted)
|
|
|
|
o indirect prices (prices calculated from the shortest chain of de-
|
|
clared or reverse prices from source to valuation commodity)
|
|
|
|
in that order.
|
|
|
|
Here are some examples showing the effect of --value as seen with
|
|
print:
|
|
|
|
P 2000-01-01 A 1 B
|
|
P 2000-02-01 A 2 B
|
|
P 2000-03-01 A 3 B
|
|
P 2000-04-01 A 4 B
|
|
|
|
2000-01-01
|
|
(a) 1 A @ 5 B
|
|
|
|
2000-02-01
|
|
(a) 1 A @ 6 B
|
|
|
|
2000-03-01
|
|
(a) 1 A @ 7 B
|
|
|
|
Show the cost of each posting:
|
|
|
|
$ hledger -f- print --value=cost
|
|
2000-01-01
|
|
(a) 5 B
|
|
|
|
2000-02-01
|
|
(a) 6 B
|
|
|
|
2000-03-01
|
|
(a) 7 B
|
|
|
|
Show the value as of the last day of the report period (2000-02-29):
|
|
|
|
$ hledger -f- print --value=end date:2000/01-2000/03
|
|
2000-01-01
|
|
(a) 2 B
|
|
|
|
2000-02-01
|
|
(a) 2 B
|
|
|
|
With no report period specified, that shows the value as of the last
|
|
day of the journal (2000-03-01):
|
|
|
|
$ hledger -f- print --value=end
|
|
2000-01-01
|
|
(a) 3 B
|
|
|
|
2000-02-01
|
|
(a) 3 B
|
|
|
|
2000-03-01
|
|
(a) 3 B
|
|
|
|
Show the current value (the 2000-04-01 price is still in effect today):
|
|
|
|
$ hledger -f- print --value=now
|
|
2000-01-01
|
|
(a) 4 B
|
|
|
|
2000-02-01
|
|
(a) 4 B
|
|
|
|
2000-03-01
|
|
(a) 4 B
|
|
|
|
Show the value on 2000/01/15:
|
|
|
|
$ hledger -f- print --value=2000-01-15
|
|
2000-01-01
|
|
(a) 1 B
|
|
|
|
2000-02-01
|
|
(a) 1 B
|
|
|
|
2000-03-01
|
|
(a) 1 B
|
|
|
|
You may need to explicitly set a commodity's display style, when re-
|
|
verse prices are used. Eg this output might be surprising:
|
|
|
|
P 2000-01-01 A 2B
|
|
|
|
2000-01-01
|
|
a 1B
|
|
b
|
|
|
|
$ hledger print -x -X A
|
|
2000-01-01
|
|
a 0
|
|
b 0
|
|
|
|
Explanation: because there's no amount or commodity directive specify-
|
|
ing a display style for A, 0.5A gets the default style, which shows no
|
|
decimal digits. Because the displayed amount looks like zero, the com-
|
|
modity symbol and minus sign are not displayed either. Adding a com-
|
|
modity directive sets a more useful display style for A:
|
|
|
|
P 2000-01-01 A 2B
|
|
commodity 0.00A
|
|
|
|
2000-01-01
|
|
a 1B
|
|
b
|
|
|
|
$ hledger print -X A
|
|
2000-01-01
|
|
a 0.50A
|
|
b -0.50A
|
|
|
|
Effect of --value on reports
|
|
Here is a reference for how --value currently affects each part of
|
|
hledger's reports. It's work in progress, but may be useful for trou-
|
|
bleshooting or reporting bugs. See also the definitions and notes be-
|
|
low. If you find problems, please report them, ideally with a repro-
|
|
ducible example. Related: #329, #1083.
|
|
|
|
Report type -B, -V, -X --value=then --value=end --value=DATE,
|
|
--value=cost --value=now
|
|
------------------------------------------------------------------------------------------
|
|
|
|
print
|
|
posting cost value at re- value at value at re- value at
|
|
amounts port end or posting date port or DATE/today
|
|
today journal end
|
|
balance as- unchanged unchanged unchanged unchanged unchanged
|
|
sertions /
|
|
assignments
|
|
|
|
register
|
|
starting cost value at day not supported value at day value at
|
|
balance before re- before re- DATE/today
|
|
(with -H) port or port or
|
|
journal journal
|
|
start start
|
|
posting cost value at re- value at value at re- value at
|
|
amounts (no port end or posting date port or DATE/today
|
|
report in- today journal end
|
|
terval)
|
|
summary summarised value at pe- sum of post- value at pe- value at
|
|
posting cost riod ends ings in in- riod ends DATE/today
|
|
amounts terval, val-
|
|
(with report ued at inter-
|
|
interval) val start
|
|
running to- sum/average sum/average sum/average sum/average sum/average
|
|
tal/average of displayed of displayed of displayed of displayed of displayed
|
|
values values values values values
|
|
|
|
balance (bs,
|
|
bse, cf,
|
|
is..)
|
|
balances (no sums of value at re- not supported value at re- value at
|
|
report in- costs port end or port or DATE/today of
|
|
terval) today of journal end sums of post-
|
|
sums of of sums of ings
|
|
postings postings
|
|
balances sums of value at pe- not supported value at pe- value at
|
|
(with report costs riod ends of riod ends of DATE/today of
|
|
interval) sums of sums of sums of post-
|
|
postings postings ings
|
|
starting sums of sums of not supported sums of sums of post-
|
|
balances costs of postings be- postings be- ings before
|
|
(with report postings be- fore report fore report report start
|
|
interval and fore report start start
|
|
-H) start
|
|
budget like bal- like bal- not supported like bal- like balances
|
|
amounts with ances ances ances
|
|
--budget
|
|
grand total sum of dis- sum of dis- not supported sum of dis- sum of dis-
|
|
(no report played val- played val- played val- played values
|
|
interval) ues ues ues
|
|
row to- sums/aver- sums/aver- not supported sums/aver- sums/averages
|
|
tals/aver- ages of dis- ages of dis- ages of dis- of displayed
|
|
ages (with played val- played val- played val- values
|
|
report in- ues ues ues
|
|
terval)
|
|
column to- sums of dis- sums of dis- not supported sums of dis- sums of dis-
|
|
tals played val- played val- played val- played values
|
|
ues ues ues
|
|
grand to- sum/average sum/average not supported sum/average sum/average
|
|
tal/average of column of column of column of column to-
|
|
totals totals totals tals
|
|
|
|
|
|
Additional notes
|
|
|
|
cost calculated using price(s) recorded in the transaction(s).
|
|
|
|
value market value using available market price declarations, or the
|
|
unchanged amount if no conversion rate can be found.
|
|
|
|
report start
|
|
the first day of the report period specified with -b or -p or
|
|
date:, otherwise today.
|
|
|
|
report or journal start
|
|
the first day of the report period specified with -b or -p or
|
|
date:, otherwise the earliest transaction date in the journal,
|
|
otherwise today.
|
|
|
|
report end
|
|
the last day of the report period specified with -e or -p or
|
|
date:, otherwise today.
|
|
|
|
report or journal end
|
|
the last day of the report period specified with -e or -p or
|
|
date:, otherwise the latest transaction date in the journal,
|
|
otherwise today.
|
|
|
|
report interval
|
|
a flag (-D/-W/-M/-Q/-Y) or period expression that activates the
|
|
report's multi-period mode (whether showing one or many subperi-
|
|
ods).
|
|
|
|
Combining -B, -V, -X, --value
|
|
The rightmost of these flags wins.
|
|
|
|
COMMANDS
|
|
hledger provides a number of subcommands; hledger with no arguments
|
|
shows a list.
|
|
|
|
If you install additional hledger-* packages, or if you put programs or
|
|
scripts named hledger-NAME in your PATH, these will also be listed as
|
|
subcommands.
|
|
|
|
Run a subcommand by writing its name as first argument (eg hledger in-
|
|
comestatement). You can also write one of the standard short aliases
|
|
displayed in parentheses in the command list (hledger b), or any any
|
|
unambiguous prefix of a command name (hledger inc).
|
|
|
|
Here are all the builtin commands in alphabetical order. See also
|
|
hledger for a more organised command list, and hledger CMD -h for de-
|
|
tailed command help.
|
|
|
|
accounts
|
|
accounts, a
|
|
Show account names.
|
|
|
|
This command lists account names, either declared with account direc-
|
|
tives (--declared), posted to (--used), or both (the default). With
|
|
query arguments, only matched account names and account names refer-
|
|
enced by matched postings are shown. It shows a flat list by default.
|
|
With --tree, it uses indentation to show the account hierarchy. In
|
|
flat mode you can add --drop N to omit the first few account name com-
|
|
ponents. Account names can be depth-clipped with depth:N or --depth N
|
|
or -N.
|
|
|
|
Examples:
|
|
|
|
$ hledger accounts
|
|
assets:bank:checking
|
|
assets:bank:saving
|
|
assets:cash
|
|
expenses:food
|
|
expenses:supplies
|
|
income:gifts
|
|
income:salary
|
|
liabilities:debts
|
|
|
|
activity
|
|
activity
|
|
Show an ascii barchart of posting counts per interval.
|
|
|
|
The activity command displays an ascii histogram showing transaction
|
|
counts by day, week, month or other reporting interval (by day is the
|
|
default). With query arguments, it counts only matched transactions.
|
|
|
|
Examples:
|
|
|
|
$ hledger activity --quarterly
|
|
2008-01-01 **
|
|
2008-04-01 *******
|
|
2008-07-01
|
|
2008-10-01 **
|
|
|
|
add
|
|
add
|
|
Prompt for transactions and add them to the journal.
|
|
|
|
Many hledger users edit their journals directly with a text editor, or
|
|
generate them from CSV. For more interactive data entry, there is the
|
|
add command, which prompts interactively on the console for new trans-
|
|
actions, and appends them to the journal file (if there are multiple -f
|
|
FILE options, the first file is used.) Existing transactions are not
|
|
changed. This is the only hledger command that writes to the journal
|
|
file.
|
|
|
|
To use it, just run hledger add and follow the prompts. You can add as
|
|
many transactions as you like; when you are finished, enter . or press
|
|
control-d or control-c to exit.
|
|
|
|
Features:
|
|
|
|
o add tries to provide useful defaults, using the most similar (by de-
|
|
scription) recent transaction (filtered by the query, if any) as a
|
|
template.
|
|
|
|
o You can also set the initial defaults with command line arguments.
|
|
|
|
o Readline-style edit keys can be used during data entry.
|
|
|
|
o The tab key will auto-complete whenever possible - accounts, descrip-
|
|
tions, dates (yesterday, today, tomorrow). If the input area is
|
|
empty, it will insert the default value.
|
|
|
|
o If the journal defines a default commodity, it will be added to any
|
|
bare numbers entered.
|
|
|
|
o A parenthesised transaction code may be entered following a date.
|
|
|
|
o Comments and tags may be entered following a description or amount.
|
|
|
|
o If you make a mistake, enter < at any prompt to go one step backward.
|
|
|
|
o Input prompts are displayed in a different colour when the terminal
|
|
supports it.
|
|
|
|
Example (see the tutorial for a detailed explanation):
|
|
|
|
$ hledger add
|
|
Adding transactions to journal file /src/hledger/examples/sample.journal
|
|
Any command line arguments will be used as defaults.
|
|
Use tab key to complete, readline keys to edit, enter to accept defaults.
|
|
An optional (CODE) may follow transaction dates.
|
|
An optional ; COMMENT may follow descriptions or amounts.
|
|
If you make a mistake, enter < at any prompt to go one step backward.
|
|
To end a transaction, enter . when prompted.
|
|
To quit, enter . at a date prompt or press control-d or control-c.
|
|
Date [2015/05/22]:
|
|
Description: supermarket
|
|
Account 1: expenses:food
|
|
Amount 1: $10
|
|
Account 2: assets:checking
|
|
Amount 2 [$-10.0]:
|
|
Account 3 (or . or enter to finish this transaction): .
|
|
2015/05/22 supermarket
|
|
expenses:food $10
|
|
assets:checking $-10.0
|
|
|
|
Save this transaction to the journal ? [y]:
|
|
Saved.
|
|
Starting the next transaction (. or ctrl-D/ctrl-C to quit)
|
|
Date [2015/05/22]: <CTRL-D> $
|
|
|
|
On Microsoft Windows, the add command makes sure that no part of the
|
|
file path ends with a period, as it can cause data loss on that plat-
|
|
form (cf #1056).
|
|
|
|
balance
|
|
balance, bal, b
|
|
Show accounts and their balances.
|
|
|
|
The balance command is hledger's most versatile command. Note, despite
|
|
the name, it is not always used for showing real-world account bal-
|
|
ances; the more accounting-aware balancesheet and incomestatement may
|
|
be more convenient for that.
|
|
|
|
By default, it displays all accounts, and each account's change in bal-
|
|
ance during the entire period of the journal. Balance changes are cal-
|
|
culated by adding up the postings in each account. You can limit the
|
|
postings matched, by a query, to see fewer accounts, changes over a
|
|
different time period, changes from only cleared transactions, etc.
|
|
|
|
If you include an account's complete history of postings in the report,
|
|
the balance change is equivalent to the account's current ending bal-
|
|
ance. For a real-world account, typically you won't have all transac-
|
|
tions in the journal; instead you'll have all transactions after a cer-
|
|
tain date, and an "opening balances" transaction setting the correct
|
|
starting balance on that date. Then the balance command will show
|
|
real-world account balances. In some cases the -H/--historical flag is
|
|
used to ensure this (more below).
|
|
|
|
The balance command can produce several styles of report:
|
|
|
|
Classic balance report
|
|
This is the original balance report, as found in Ledger. It usually
|
|
looks like this:
|
|
|
|
$ hledger balance
|
|
$-1 assets
|
|
$1 bank:saving
|
|
$-2 cash
|
|
$2 expenses
|
|
$1 food
|
|
$1 supplies
|
|
$-2 income
|
|
$-1 gifts
|
|
$-1 salary
|
|
$1 liabilities:debts
|
|
--------------------
|
|
0
|
|
|
|
By default, accounts are displayed hierarchically, with subaccounts in-
|
|
dented below their parent. At each level of the tree, accounts are
|
|
sorted by account code if any, then by account name. Or with
|
|
-S/--sort-amount, by their balance amount.
|
|
|
|
"Boring" accounts, which contain a single interesting subaccount and no
|
|
balance of their own, are elided into the following line for more com-
|
|
pact output. (Eg above, the "liabilities" account.) Use --no-elide to
|
|
prevent this.
|
|
|
|
Account balances are "inclusive" - they include the balances of any
|
|
subaccounts.
|
|
|
|
Accounts which have zero balance (and no non-zero subaccounts) are
|
|
omitted. Use -E/--empty to show them.
|
|
|
|
A final total is displayed by default; use -N/--no-total to suppress
|
|
it, eg:
|
|
|
|
$ hledger balance -p 2008/6 expenses --no-total
|
|
$2 expenses
|
|
$1 food
|
|
$1 supplies
|
|
|
|
Customising the classic balance report
|
|
You can customise the layout of classic balance reports with --format
|
|
FMT:
|
|
|
|
$ hledger balance --format "%20(account) %12(total)"
|
|
assets $-1
|
|
bank:saving $1
|
|
cash $-2
|
|
expenses $2
|
|
food $1
|
|
supplies $1
|
|
income $-2
|
|
gifts $-1
|
|
salary $-1
|
|
liabilities:debts $1
|
|
---------------------------------
|
|
0
|
|
|
|
The FMT format string (plus a newline) specifies the formatting applied
|
|
to each account/balance pair. It may contain any suitable text, with
|
|
data fields interpolated like so:
|
|
|
|
%[MIN][.MAX](FIELDNAME)
|
|
|
|
o MIN pads with spaces to at least this width (optional)
|
|
|
|
o MAX truncates at this width (optional)
|
|
|
|
o FIELDNAME must be enclosed in parentheses, and can be one of:
|
|
|
|
o depth_spacer - a number of spaces equal to the account's depth, or
|
|
if MIN is specified, MIN * depth spaces.
|
|
|
|
o account - the account's name
|
|
|
|
o total - the account's balance/posted total, right justified
|
|
|
|
Also, FMT can begin with an optional prefix to control how multi-com-
|
|
modity amounts are rendered:
|
|
|
|
o %_ - render on multiple lines, bottom-aligned (the default)
|
|
|
|
o %^ - render on multiple lines, top-aligned
|
|
|
|
o %, - render on one line, comma-separated
|
|
|
|
There are some quirks. Eg in one-line mode, %(depth_spacer) has no ef-
|
|
fect, instead %(account) has indentation built in. Experimentation may
|
|
be needed to get pleasing results.
|
|
|
|
Some example formats:
|
|
|
|
o %(total) - the account's total
|
|
|
|
o %-20.20(account) - the account's name, left justified, padded to 20
|
|
characters and clipped at 20 characters
|
|
|
|
o %,%-50(account) %25(total) - account name padded to 50 characters,
|
|
total padded to 20 characters, with multiple commodities rendered on
|
|
one line
|
|
|
|
o %20(total) %2(depth_spacer)%-(account) - the default format for the
|
|
single-column balance report
|
|
|
|
Colour support
|
|
The balance command shows negative amounts in red, if:
|
|
|
|
o the TERM environment variable is not set to dumb
|
|
|
|
o the output is not being redirected or piped anywhere
|
|
|
|
Flat mode
|
|
To see a flat list instead of the default hierarchical display, use
|
|
--flat. In this mode, accounts (unless depth-clipped) show their full
|
|
names and "exclusive" balance, excluding any subaccount balances. In
|
|
this mode, you can also use --drop N to omit the first few account name
|
|
components.
|
|
|
|
$ hledger balance -p 2008/6 expenses -N --flat --drop 1
|
|
$1 food
|
|
$1 supplies
|
|
|
|
Depth limited balance reports
|
|
With --depth N or depth:N or just -N, balance reports show accounts
|
|
only to the specified numeric depth. This is very useful to summarise
|
|
a complex set of accounts and get an overview.
|
|
|
|
$ hledger balance -N -1
|
|
$-1 assets
|
|
$2 expenses
|
|
$-2 income
|
|
$1 liabilities
|
|
|
|
Flat-mode balance reports, which normally show exclusive balances, show
|
|
inclusive balances at the depth limit.
|
|
|
|
Percentages
|
|
With -% or --percent, balance reports show each account's value ex-
|
|
pressed as a percentage of the column's total. This is useful to get
|
|
an overview of the relative sizes of account balances. For example to
|
|
obtain an overview of expenses:
|
|
|
|
$ hledger balance expenses -%
|
|
100.0 % expenses
|
|
50.0 % food
|
|
50.0 % supplies
|
|
--------------------
|
|
100.0 %
|
|
|
|
Note that --tree does not have an effect on -%. The percentages are
|
|
always relative to the total sum of each column, they are never rela-
|
|
tive to the parent account.
|
|
|
|
Since the percentages are relative to the columns sum, it is usually
|
|
not useful to calculate percentages if the signs of the amounts are
|
|
mixed. Although the results are technically correct, they are most
|
|
likely useless. Especially in a balance report that sums up to zero
|
|
(eg hledger balance -B) all percentage values will be zero.
|
|
|
|
This flag does not work if the report contains any mixed commodity ac-
|
|
counts. If there are mixed commodity accounts in the report be sure to
|
|
use -V or -B to coerce the report into using a single commodity.
|
|
|
|
Multicolumn balance report
|
|
Multicolumn or tabular balance reports are a very useful hledger fea-
|
|
ture, and usually the preferred style. They share many of the above
|
|
features, but they show the report as a table, with columns represent-
|
|
ing time periods. This mode is activated by providing a reporting in-
|
|
terval.
|
|
|
|
There are three types of multicolumn balance report, showing different
|
|
information:
|
|
|
|
1. By default: each column shows the sum of postings in that period, ie
|
|
the account's change of balance in that period. This is useful eg
|
|
for a monthly income statement:
|
|
|
|
$ hledger balance --quarterly income expenses -E
|
|
Balance changes in 2008:
|
|
|
|
|| 2008q1 2008q2 2008q3 2008q4
|
|
===================++=================================
|
|
expenses:food || 0 $1 0 0
|
|
expenses:supplies || 0 $1 0 0
|
|
income:gifts || 0 $-1 0 0
|
|
income:salary || $-1 0 0 0
|
|
-------------------++---------------------------------
|
|
|| $-1 $1 0 0
|
|
|
|
2. With --cumulative: each column shows the ending balance for that pe-
|
|
riod, accumulating the changes across periods, starting from 0 at
|
|
the report start date:
|
|
|
|
$ hledger balance --quarterly income expenses -E --cumulative
|
|
Ending balances (cumulative) in 2008:
|
|
|
|
|| 2008/03/31 2008/06/30 2008/09/30 2008/12/31
|
|
===================++=================================================
|
|
expenses:food || 0 $1 $1 $1
|
|
expenses:supplies || 0 $1 $1 $1
|
|
income:gifts || 0 $-1 $-1 $-1
|
|
income:salary || $-1 $-1 $-1 $-1
|
|
-------------------++-------------------------------------------------
|
|
|| $-1 0 0 0
|
|
|
|
3. With --historical/-H: each column shows the actual historical ending
|
|
balance for that period, accumulating the changes across periods,
|
|
starting from the actual balance at the report start date. This is
|
|
useful eg for a multi-period balance sheet, and when you are showing
|
|
only the data after a certain start date:
|
|
|
|
$ hledger balance ^assets ^liabilities --quarterly --historical --begin 2008/4/1
|
|
Ending balances (historical) in 2008/04/01-2008/12/31:
|
|
|
|
|| 2008/06/30 2008/09/30 2008/12/31
|
|
======================++=====================================
|
|
assets:bank:checking || $1 $1 0
|
|
assets:bank:saving || $1 $1 $1
|
|
assets:cash || $-2 $-2 $-2
|
|
liabilities:debts || 0 0 $1
|
|
----------------------++-------------------------------------
|
|
|| 0 0 0
|
|
|
|
Note that --cumulative or --historical/-H disable --row-total/-T, since
|
|
summing end balances generally does not make sense.
|
|
|
|
Multicolumn balance reports display accounts in flat mode by default;
|
|
to see the hierarchy, use --tree.
|
|
|
|
With a reporting interval (like --quarterly above), the report
|
|
start/end dates will be adjusted if necessary so that they encompass
|
|
the displayed report periods. This is so that the first and last peri-
|
|
ods will be "full" and comparable to the others.
|
|
|
|
The -E/--empty flag does two things in multicolumn balance reports:
|
|
first, the report will show all columns within the specified report pe-
|
|
riod (without -E, leading and trailing columns with all zeroes are not
|
|
shown). Second, all accounts which existed at the report start date
|
|
will be considered, not just the ones with activity during the report
|
|
period (use -E to include low-activity accounts which would otherwise
|
|
would be omitted).
|
|
|
|
The -T/--row-total flag adds an additional column showing the total for
|
|
each row.
|
|
|
|
The -A/--average flag adds a column showing the average value in each
|
|
row.
|
|
|
|
Here's an example of all three:
|
|
|
|
$ hledger balance -Q income expenses --tree -ETA
|
|
Balance changes in 2008:
|
|
|
|
|| 2008q1 2008q2 2008q3 2008q4 Total Average
|
|
============++===================================================
|
|
expenses || 0 $2 0 0 $2 $1
|
|
food || 0 $1 0 0 $1 0
|
|
supplies || 0 $1 0 0 $1 0
|
|
income || $-1 $-1 0 0 $-2 $-1
|
|
gifts || 0 $-1 0 0 $-1 0
|
|
salary || $-1 0 0 0 $-1 0
|
|
------------++---------------------------------------------------
|
|
|| $-1 $1 0 0 0 0
|
|
|
|
(Average is rounded to the dollar here since all journal amounts are)
|
|
|
|
A limitation of multicolumn balance reports: eliding of boring parent
|
|
accounts in tree mode, as in the classic balance report, is not yet
|
|
supported.
|
|
|
|
The --transpose flag can be used to exchange the rows and columns of a
|
|
multicolumn report.
|
|
|
|
Budget report
|
|
With --budget, extra columns are displayed showing budget goals for
|
|
each account and period, if any. Budget goals are defined by periodic
|
|
transactions. This is very useful for comparing planned and actual in-
|
|
come, expenses, time usage, etc. --budget is most often combined with
|
|
a report interval.
|
|
|
|
For example, you can take average monthly expenses in the common ex-
|
|
pense categories to construct a minimal monthly budget:
|
|
|
|
;; Budget
|
|
~ monthly
|
|
income $2000
|
|
expenses:food $400
|
|
expenses:bus $50
|
|
expenses:movies $30
|
|
assets:bank:checking
|
|
|
|
;; Two months worth of expenses
|
|
2017-11-01
|
|
income $1950
|
|
expenses:food $396
|
|
expenses:bus $49
|
|
expenses:movies $30
|
|
expenses:supplies $20
|
|
assets:bank:checking
|
|
|
|
2017-12-01
|
|
income $2100
|
|
expenses:food $412
|
|
expenses:bus $53
|
|
expenses:gifts $100
|
|
assets:bank:checking
|
|
|
|
You can now see a monthly budget report:
|
|
|
|
$ hledger balance -M --budget
|
|
Budget performance in 2017/11/01-2017/12/31:
|
|
|
|
|| Nov Dec
|
|
======================++====================================================
|
|
assets || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480]
|
|
assets:bank || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480]
|
|
assets:bank:checking || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480]
|
|
expenses || $495 [ 103% of $480] $565 [ 118% of $480]
|
|
expenses:bus || $49 [ 98% of $50] $53 [ 106% of $50]
|
|
expenses:food || $396 [ 99% of $400] $412 [ 103% of $400]
|
|
expenses:movies || $30 [ 100% of $30] 0 [ 0% of $30]
|
|
income || $1950 [ 98% of $2000] $2100 [ 105% of $2000]
|
|
----------------------++----------------------------------------------------
|
|
|| 0 [ 0] 0 [ 0]
|
|
|
|
This is different from a normal balance report in several ways:
|
|
|
|
o Only accounts with budget goals during the report period are shown,
|
|
by default.
|
|
|
|
o In each column, in square brackets after the actual amount, budget
|
|
goal amounts are shown, and the actual/goal percentage. (Note: bud-
|
|
get goals should be in the same commodity as the actual amount.)
|
|
|
|
o All parent accounts are always shown, even in flat mode. Eg assets,
|
|
assets:bank, and expenses above.
|
|
|
|
o Amounts always include all subaccounts, budgeted or unbudgeted, even
|
|
in flat mode.
|
|
|
|
This means that the numbers displayed will not always add up! Eg above,
|
|
the expenses actual amount includes the gifts and supplies transac-
|
|
tions, but the expenses:gifts and expenses:supplies accounts are not
|
|
shown, as they have no budget amounts declared.
|
|
|
|
This can be confusing. When you need to make things clearer, use the
|
|
-E/--empty flag, which will reveal all accounts including unbudgeted
|
|
ones, giving the full picture. Eg:
|
|
|
|
$ hledger balance -M --budget --empty
|
|
Budget performance in 2017/11/01-2017/12/31:
|
|
|
|
|| Nov Dec
|
|
======================++====================================================
|
|
assets || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480]
|
|
assets:bank || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480]
|
|
assets:bank:checking || $-2445 [ 99% of $-2480] $-2665 [ 107% of $-2480]
|
|
expenses || $495 [ 103% of $480] $565 [ 118% of $480]
|
|
expenses:bus || $49 [ 98% of $50] $53 [ 106% of $50]
|
|
expenses:food || $396 [ 99% of $400] $412 [ 103% of $400]
|
|
expenses:gifts || 0 $100
|
|
expenses:movies || $30 [ 100% of $30] 0 [ 0% of $30]
|
|
expenses:supplies || $20 0
|
|
income || $1950 [ 98% of $2000] $2100 [ 105% of $2000]
|
|
----------------------++----------------------------------------------------
|
|
|| 0 [ 0] 0 [ 0]
|
|
|
|
You can roll over unspent budgets to next period with --cumulative:
|
|
|
|
$ hledger balance -M --budget --cumulative
|
|
Budget performance in 2017/11/01-2017/12/31:
|
|
|
|
|| Nov Dec
|
|
======================++====================================================
|
|
assets || $-2445 [ 99% of $-2480] $-5110 [ 103% of $-4960]
|
|
assets:bank || $-2445 [ 99% of $-2480] $-5110 [ 103% of $-4960]
|
|
assets:bank:checking || $-2445 [ 99% of $-2480] $-5110 [ 103% of $-4960]
|
|
expenses || $495 [ 103% of $480] $1060 [ 110% of $960]
|
|
expenses:bus || $49 [ 98% of $50] $102 [ 102% of $100]
|
|
expenses:food || $396 [ 99% of $400] $808 [ 101% of $800]
|
|
expenses:movies || $30 [ 100% of $30] $30 [ 50% of $60]
|
|
income || $1950 [ 98% of $2000] $4050 [ 101% of $4000]
|
|
----------------------++----------------------------------------------------
|
|
|| 0 [ 0] 0 [ 0]
|
|
|
|
For more examples, see Budgeting and Forecasting.
|
|
|
|
Nested budgets
|
|
You can add budgets to any account in your account hierarchy. If you
|
|
have budgets on both parent account and some of its children, then bud-
|
|
get(s) of the child account(s) would be added to the budget of their
|
|
parent, much like account balances behave.
|
|
|
|
In the most simple case this means that once you add a budget to any
|
|
account, all its parents would have budget as well.
|
|
|
|
To illustrate this, consider the following budget:
|
|
|
|
~ monthly from 2019/01
|
|
expenses:personal $1,000.00
|
|
expenses:personal:electronics $100.00
|
|
liabilities
|
|
|
|
With this, monthly budget for electronics is defined to be $100 and
|
|
budget for personal expenses is an additional $1000, which implicitly
|
|
means that budget for both expenses:personal and expenses is $1100.
|
|
|
|
Transactions in expenses:personal:electronics will be counted both to-
|
|
wards its $100 budget and $1100 of expenses:personal , and transactions
|
|
in any other subaccount of expenses:personal would be counted towards
|
|
only towards the budget of expenses:personal.
|
|
|
|
For example, let's consider these transactions:
|
|
|
|
~ monthly from 2019/01
|
|
expenses:personal $1,000.00
|
|
expenses:personal:electronics $100.00
|
|
liabilities
|
|
|
|
2019/01/01 Google home hub
|
|
expenses:personal:electronics $90.00
|
|
liabilities $-90.00
|
|
|
|
2019/01/02 Phone screen protector
|
|
expenses:personal:electronics:upgrades $10.00
|
|
liabilities
|
|
|
|
2019/01/02 Weekly train ticket
|
|
expenses:personal:train tickets $153.00
|
|
liabilities
|
|
|
|
2019/01/03 Flowers
|
|
expenses:personal $30.00
|
|
liabilities
|
|
|
|
As you can see, we have transactions in expenses:personal:electron-
|
|
ics:upgrades and expenses:personal:train tickets, and since both of
|
|
these accounts are without explicitly defined budget, these transac-
|
|
tions would be counted towards budgets of expenses:personal:electronics
|
|
and expenses:personal accordingly:
|
|
|
|
$ hledger balance --budget -M
|
|
Budget performance in 2019/01:
|
|
|
|
|| Jan
|
|
===============================++===============================
|
|
expenses || $283.00 [ 26% of $1100.00]
|
|
expenses:personal || $283.00 [ 26% of $1100.00]
|
|
expenses:personal:electronics || $100.00 [ 100% of $100.00]
|
|
liabilities || $-283.00 [ 26% of $-1100.00]
|
|
-------------------------------++-------------------------------
|
|
|| 0 [ 0]
|
|
|
|
And with --empty, we can get a better picture of budget allocation and
|
|
consumption:
|
|
|
|
$ hledger balance --budget -M --empty
|
|
Budget performance in 2019/01:
|
|
|
|
|| Jan
|
|
========================================++===============================
|
|
expenses || $283.00 [ 26% of $1100.00]
|
|
expenses:personal || $283.00 [ 26% of $1100.00]
|
|
expenses:personal:electronics || $100.00 [ 100% of $100.00]
|
|
expenses:personal:electronics:upgrades || $10.00
|
|
expenses:personal:train tickets || $153.00
|
|
liabilities || $-283.00 [ 26% of $-1100.00]
|
|
----------------------------------------++-------------------------------
|
|
|| 0 [ 0]
|
|
|
|
Output format
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, (multicolumn non-bud-
|
|
get reports only) html, and (experimental) json.
|
|
|
|
balancesheet
|
|
balancesheet, bs
|
|
This command displays a simple balance sheet, showing historical ending
|
|
balances of asset and liability accounts (ignoring any report begin
|
|
date). It assumes that these accounts are under a top-level asset or
|
|
liability account (case insensitive, plural forms also allowed).
|
|
|
|
Note this report shows all account balances with normal positive sign
|
|
(like conventional financial statements, unlike balance/print/register)
|
|
(experimental).
|
|
|
|
Example:
|
|
|
|
$ hledger balancesheet
|
|
Balance Sheet
|
|
|
|
Assets:
|
|
$-1 assets
|
|
$1 bank:saving
|
|
$-2 cash
|
|
--------------------
|
|
$-1
|
|
|
|
Liabilities:
|
|
$1 liabilities:debts
|
|
--------------------
|
|
$1
|
|
|
|
Total:
|
|
--------------------
|
|
0
|
|
|
|
With a reporting interval, multiple columns will be shown, one for each
|
|
report period. As with multicolumn balance reports, you can alter the
|
|
report mode with --change/--cumulative/--historical. Normally bal-
|
|
ancesheet shows historical ending balances, which is what you need for
|
|
a balance sheet; note this means it ignores report begin dates (and
|
|
-T/--row-total, since summing end balances generally does not make
|
|
sense). Instead of absolute values percentages can be displayed with
|
|
-%.
|
|
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, html, and (experimen-
|
|
tal) json.
|
|
|
|
balancesheetequity
|
|
balancesheetequity, bse
|
|
Just like balancesheet, but also reports Equity (which it assumes is
|
|
under a top-level equity account).
|
|
|
|
Example:
|
|
|
|
$ hledger balancesheetequity
|
|
Balance Sheet With Equity
|
|
|
|
Assets:
|
|
$-2 assets
|
|
$1 bank:saving
|
|
$-3 cash
|
|
--------------------
|
|
$-2
|
|
|
|
Liabilities:
|
|
$1 liabilities:debts
|
|
--------------------
|
|
$1
|
|
|
|
Equity:
|
|
$1 equity:owner
|
|
--------------------
|
|
$1
|
|
|
|
Total:
|
|
--------------------
|
|
0
|
|
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, html, and (experimen-
|
|
tal) json.
|
|
|
|
cashflow
|
|
cashflow, cf
|
|
This command displays a simple cashflow statement, showing changes in
|
|
"cash" accounts. It assumes that these accounts are under a top-level
|
|
asset account (case insensitive, plural forms also allowed) and do not
|
|
contain receivable or A/R in their name. Note this report shows all
|
|
account balances with normal positive sign (like conventional financial
|
|
statements, unlike balance/print/register) (experimental).
|
|
|
|
Example:
|
|
|
|
$ hledger cashflow
|
|
Cashflow Statement
|
|
|
|
Cash flows:
|
|
$-1 assets
|
|
$1 bank:saving
|
|
$-2 cash
|
|
--------------------
|
|
$-1
|
|
|
|
Total:
|
|
--------------------
|
|
$-1
|
|
|
|
With a reporting interval, multiple columns will be shown, one for each
|
|
report period. Normally cashflow shows changes in assets per period,
|
|
though as with multicolumn balance reports you can alter the report
|
|
mode with --change/--cumulative/--historical. Instead of absolute val-
|
|
ues percentages can be displayed with -%.
|
|
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, html, and (experimen-
|
|
tal) json.
|
|
|
|
check-dates
|
|
check-dates
|
|
Check that transactions are sorted by increasing date. With --date2,
|
|
checks secondary dates instead. With --strict, dates must also be
|
|
unique. With a query, only matched transactions' dates are checked.
|
|
Reads the default journal file, or another specified with -f.
|
|
|
|
check-dupes
|
|
check-dupes
|
|
Reports account names having the same leaf but different prefixes. In
|
|
other words, two or more leaves that are categorized differently.
|
|
Reads the default journal file, or another specified as an argument.
|
|
|
|
An example: http://stefanorodighiero.net/software/hledger-dupes.html
|
|
|
|
close
|
|
close, equity
|
|
Prints a "closing balances" transaction and an "opening balances"
|
|
transaction that bring account balances to and from zero, respectively.
|
|
These can be added to your journal file(s), eg to bring asset/liability
|
|
balances forward into a new journal file, or to close out revenues/ex-
|
|
penses to retained earnings at the end of a period.
|
|
|
|
You can print just one of these transactions by using the --close or
|
|
--open flag. You can customise their descriptions with the --close-
|
|
desc and --open-desc options.
|
|
|
|
One amountless posting to "equity:opening/closing balances" is added to
|
|
balance the transactions, by default. You can customise this account
|
|
name with --close-acct and --open-acct; if you specify only one of
|
|
these, it will be used for both.
|
|
|
|
With --x/--explicit, the equity posting's amount will be shown. And if
|
|
it involves multiple commodities, a posting for each commodity will be
|
|
shown, as with the print command.
|
|
|
|
With --interleaved, the equity postings are shown next to the postings
|
|
they balance, which makes troubleshooting easier.
|
|
|
|
By default, transaction prices in the journal are ignored when generat-
|
|
ing the closing/opening transactions. With --show-costs, this cost in-
|
|
formation is preserved (balance -B reports will be unchanged after the
|
|
transition). Separate postings are generated for each cost in each
|
|
commodity. Note this can generate very large journal entries, if you
|
|
have many foreign currency or investment transactions.
|
|
|
|
close usage
|
|
If you split your journal files by time (eg yearly), you will typically
|
|
run this command at the end of the year, and save the closing transac-
|
|
tion as last entry of the old file, and the opening transaction as the
|
|
first entry of the new file. This makes the files self contained, so
|
|
that correct balances are reported no matter which of them are loaded.
|
|
Ie, if you load just one file, the balances are initialised correctly;
|
|
or if you load several files, the redundant closing/opening transac-
|
|
tions cancel each other out. (They will show up in print or register
|
|
reports; you can exclude them with a query like not:desc:'(open-
|
|
ing|closing) balances'.)
|
|
|
|
If you're running a business, you might also use this command to "close
|
|
the books" at the end of an accounting period, transferring income
|
|
statement account balances to retained earnings. (You may want to
|
|
change the equity account name to something like "equity:retained earn-
|
|
ings".)
|
|
|
|
By default, the closing transaction is dated yesterday, the balances
|
|
are calculated as of end of yesterday, and the opening transaction is
|
|
dated today. To close on some other date, use: hledger close -e OPEN-
|
|
INGDATE. Eg, to close/open on the 2018/2019 boundary, use -e 2019.
|
|
You can also use -p or date:PERIOD (any starting date is ignored).
|
|
|
|
Both transactions will include balance assertions for the closed/re-
|
|
opened accounts. You probably shouldn't use status or realness filters
|
|
(like -C or -R or status:) with this command, or the generated balance
|
|
assertions will depend on these flags. Likewise, if you run this com-
|
|
mand with --auto, the balance assertions will probably always require
|
|
--auto.
|
|
|
|
Examples:
|
|
|
|
Carrying asset/liability balances into a new file for 2019:
|
|
|
|
$ hledger close -f 2018.journal -e 2019 assets liabilities --open
|
|
# (copy/paste the output to the start of your 2019 journal file)
|
|
$ hledger close -f 2018.journal -e 2019 assets liabilities --close
|
|
# (copy/paste the output to the end of your 2018 journal file)
|
|
|
|
Now:
|
|
|
|
$ hledger bs -f 2019.journal # one file - balances are correct
|
|
$ hledger bs -f 2018.journal -f 2019.journal # two files - balances still correct
|
|
$ hledger bs -f 2018.journal not:desc:closing # to see year-end balances, must exclude closing txn
|
|
|
|
Transactions spanning the closing date can complicate matters, breaking
|
|
balance assertions:
|
|
|
|
2018/12/30 a purchase made in 2018, clearing the following year
|
|
expenses:food 5
|
|
assets:bank:checking -5 ; [2019/1/2]
|
|
|
|
Here's one way to resolve that:
|
|
|
|
; in 2018.journal:
|
|
2018/12/30 a purchase made in 2018, clearing the following year
|
|
expenses:food 5
|
|
liabilities:pending
|
|
|
|
; in 2019.journal:
|
|
2019/1/2 clearance of last year's pending transactions
|
|
liabilities:pending 5 = 0
|
|
assets:checking
|
|
|
|
commodities
|
|
commodities
|
|
List all commodity/currency symbols used or declared in the journal.
|
|
|
|
descriptions
|
|
descriptions Show descriptions.
|
|
|
|
This command lists all descriptions that appear in transactions.
|
|
|
|
Examples:
|
|
|
|
$ hledger descriptions
|
|
Store Name
|
|
Gas Station | Petrol
|
|
Person A
|
|
|
|
diff
|
|
diff
|
|
Compares a particular account's transactions in two input files. It
|
|
shows any transactions to this account which are in one file but not in
|
|
the other.
|
|
|
|
More precisely, for each posting affecting this account in either file,
|
|
it looks for a corresponding posting in the other file which posts the
|
|
same amount to the same account (ignoring date, description, etc.)
|
|
Since postings not transactions are compared, this also works when mul-
|
|
tiple bank transactions have been combined into a single journal entry.
|
|
|
|
This is useful eg if you have downloaded an account's transactions from
|
|
your bank (eg as CSV data). When hledger and your bank disagree about
|
|
the account balance, you can compare the bank data with your journal to
|
|
find out the cause.
|
|
|
|
Examples:
|
|
|
|
$ hledger diff -f $LEDGER_FILE -f bank.csv assets:bank:giro
|
|
These transactions are in the first file only:
|
|
|
|
2014/01/01 Opening Balances
|
|
assets:bank:giro EUR ...
|
|
...
|
|
equity:opening balances EUR -...
|
|
|
|
These transactions are in the second file only:
|
|
|
|
files
|
|
files
|
|
List all files included in the journal. With a REGEX argument, only
|
|
file names matching the regular expression (case sensitive) are shown.
|
|
|
|
help
|
|
help
|
|
Show any of the hledger manuals.
|
|
|
|
The help command displays any of the main hledger manuals, in one of
|
|
several ways. Run it with no argument to list the manuals, or provide
|
|
a full or partial manual name to select one.
|
|
|
|
hledger manuals are available in several formats. hledger help will
|
|
use the first of these display methods that it finds: info, man,
|
|
$PAGER, less, stdout (or when non-interactive, just stdout). You can
|
|
force a particular viewer with the --info, --man, --pager, --cat flags.
|
|
|
|
Examples:
|
|
|
|
$ hledger help
|
|
Please choose a manual by typing "hledger help MANUAL" (a substring is ok).
|
|
Manuals: hledger hledger-ui hledger-web journal csv timeclock timedot
|
|
|
|
$ hledger help h --man
|
|
|
|
hledger(1) hledger User Manuals hledger(1)
|
|
|
|
NAME
|
|
hledger - a command-line accounting tool
|
|
|
|
SYNOPSIS
|
|
hledger [-f FILE] COMMAND [OPTIONS] [ARGS]
|
|
hledger [-f FILE] ADDONCMD -- [OPTIONS] [ARGS]
|
|
hledger
|
|
|
|
DESCRIPTION
|
|
hledger is a cross-platform program for tracking money, time, or any
|
|
...
|
|
|
|
import
|
|
import
|
|
Read new transactions added to each FILE since last run, and add them
|
|
to the main journal file. Or with --dry-run, just print the transac-
|
|
tions that would be added. Or with --catchup, just mark all of the
|
|
FILEs' transactions as imported, without actually importing any.
|
|
|
|
The input files are specified as arguments - no need to write -f before
|
|
each one. So eg to add new transactions from all CSV files to the main
|
|
journal, it's just: hledger import *.csv
|
|
|
|
New transactions are detected in the same way as print --new: by assum-
|
|
ing transactions are always added to the input files in increasing date
|
|
order, and by saving .latest.FILE state files.
|
|
|
|
The --dry-run output is in journal format, so you can filter it, eg to
|
|
see only uncategorised transactions:
|
|
|
|
$ hledger import --dry ... | hledger -f- print unknown --ignore-assertions
|
|
|
|
Importing balance assignments
|
|
Entries added by import will have their posting amounts made explicit
|
|
(like hledger print -x). This means that any balance assignments in
|
|
imported files must be evaluated; but, imported files don't get to see
|
|
the main file's account balances. As a result, importing entries with
|
|
balance assignments (eg from an institution that provides only balances
|
|
and not posting amounts) will probably generate incorrect posting
|
|
amounts. To avoid this problem, use print instead of import:
|
|
|
|
$ hledger print IMPORTFILE [--new] >> $LEDGER_FILE
|
|
|
|
(If you think import should leave amounts implicit like print does,
|
|
please test it and send a pull request.)
|
|
|
|
incomestatement
|
|
incomestatement, is
|
|
This command displays a simple income statement, showing revenues and
|
|
expenses during a period. It assumes that these accounts are under a
|
|
top-level revenue or income or expense account (case insensitive, plu-
|
|
ral forms also allowed). Note this report shows all account balances
|
|
with normal positive sign (like conventional financial statements, un-
|
|
like balance/print/register) (experimental).
|
|
|
|
This command displays a simple income statement. It currently assumes
|
|
that you have top-level accounts named income (or revenue) and expense
|
|
(plural forms also allowed.)
|
|
|
|
$ hledger incomestatement
|
|
Income Statement
|
|
|
|
Revenues:
|
|
$-2 income
|
|
$-1 gifts
|
|
$-1 salary
|
|
--------------------
|
|
$-2
|
|
|
|
Expenses:
|
|
$2 expenses
|
|
$1 food
|
|
$1 supplies
|
|
--------------------
|
|
$2
|
|
|
|
Total:
|
|
--------------------
|
|
0
|
|
|
|
With a reporting interval, multiple columns will be shown, one for each
|
|
report period. Normally incomestatement shows revenues/expenses per
|
|
period, though as with multicolumn balance reports you can alter the
|
|
report mode with --change/--cumulative/--historical. Instead of abso-
|
|
lute values percentages can be displayed with -%.
|
|
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, html, and (experimen-
|
|
tal) json.
|
|
|
|
notes
|
|
notes Show notes.
|
|
|
|
This command lists all notes that appear in transactions.
|
|
|
|
Examples:
|
|
|
|
$ hledger notes
|
|
Petrol
|
|
Snacks
|
|
|
|
payees
|
|
payees Show payee names.
|
|
|
|
This command lists all payee names that appear in transactions.
|
|
|
|
Examples:
|
|
|
|
$ hledger payees
|
|
Store Name
|
|
Gas Station
|
|
Person A
|
|
|
|
prices
|
|
prices
|
|
Print market price directives from the journal. With --costs, also
|
|
print synthetic market prices based on transaction prices. With --in-
|
|
verted-costs, also print inverse prices based on transaction prices.
|
|
Prices (and postings providing prices) can be filtered by a query.
|
|
Price amounts are always displayed with their full precision.
|
|
|
|
print
|
|
print, txns, p
|
|
Show transaction journal entries, sorted by date.
|
|
|
|
The print command displays full journal entries (transactions) from the
|
|
journal file in date order, tidily formatted. With --date2, transac-
|
|
tions are sorted by secondary date instead.
|
|
|
|
print's output is always a valid hledger journal.
|
|
It preserves all transaction information, but it does not preserve di-
|
|
rectives or inter-transaction comments
|
|
|
|
$ hledger print
|
|
2008/01/01 income
|
|
assets:bank:checking $1
|
|
income:salary $-1
|
|
|
|
2008/06/01 gift
|
|
assets:bank:checking $1
|
|
income:gifts $-1
|
|
|
|
2008/06/02 save
|
|
assets:bank:saving $1
|
|
assets:bank:checking $-1
|
|
|
|
2008/06/03 * eat & shop
|
|
expenses:food $1
|
|
expenses:supplies $1
|
|
assets:cash $-2
|
|
|
|
2008/12/31 * pay off
|
|
liabilities:debts $1
|
|
assets:bank:checking $-1
|
|
|
|
Normally, the journal entry's explicit or implicit amount style is pre-
|
|
served. For example, when an amount is omitted in the journal, it will
|
|
not appear in the output. Similarly, when a transaction price is im-
|
|
plied but not written, it will not appear in the output. You can use
|
|
the -x/--explicit flag to make all amounts and transaction prices ex-
|
|
plicit, which can be useful for troubleshooting or for making your
|
|
journal more readable and robust against data entry errors. -x is also
|
|
implied by using any of -B,-V,-X,--value.
|
|
|
|
Note, -x/--explicit will cause postings with a multi-commodity amount
|
|
(these can arise when a multi-commodity transaction has an implicit
|
|
amount) to be split into multiple single-commodity postings, keeping
|
|
the output parseable.
|
|
|
|
With -B/--cost, amounts with transaction prices are converted to cost
|
|
using that price. This can be used for troubleshooting.
|
|
|
|
With -m/--match and a STR argument, print will show at most one trans-
|
|
action: the one one whose description is most similar to STR, and is
|
|
most recent. STR should contain at least two characters. If there is
|
|
no similar-enough match, no transaction will be shown.
|
|
|
|
With --new, for each FILE being read, hledger reads (and writes) a spe-
|
|
cial state file (.latest.FILE in the same directory), containing the
|
|
latest transaction date(s) that were seen last time FILE was read.
|
|
When this file is found, only transactions with newer dates (and new
|
|
transactions on the latest date) are printed. This is useful for ig-
|
|
noring already-seen entries in import data, such as downloaded CSV
|
|
files. Eg:
|
|
|
|
$ hledger -f bank1.csv print --new
|
|
(shows transactions added since last print --new on this file)
|
|
|
|
This assumes that transactions added to FILE always have same or in-
|
|
creasing dates, and that transactions on the same day do not get re-
|
|
ordered. See also the import command.
|
|
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, and (experimental)
|
|
json.
|
|
|
|
Here's an example of print's CSV output:
|
|
|
|
$ hledger print -Ocsv
|
|
"txnidx","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","posting-status","posting-comment"
|
|
"1","2008/01/01","","","","income","","assets:bank:checking","1","$","","1","",""
|
|
"1","2008/01/01","","","","income","","income:salary","-1","$","1","","",""
|
|
"2","2008/06/01","","","","gift","","assets:bank:checking","1","$","","1","",""
|
|
"2","2008/06/01","","","","gift","","income:gifts","-1","$","1","","",""
|
|
"3","2008/06/02","","","","save","","assets:bank:saving","1","$","","1","",""
|
|
"3","2008/06/02","","","","save","","assets:bank:checking","-1","$","1","","",""
|
|
"4","2008/06/03","","*","","eat & shop","","expenses:food","1","$","","1","",""
|
|
"4","2008/06/03","","*","","eat & shop","","expenses:supplies","1","$","","1","",""
|
|
"4","2008/06/03","","*","","eat & shop","","assets:cash","-2","$","2","","",""
|
|
"5","2008/12/31","","*","","pay off","","liabilities:debts","1","$","","1","",""
|
|
"5","2008/12/31","","*","","pay off","","assets:bank:checking","-1","$","1","","",""
|
|
|
|
o There is one CSV record per posting, with the parent transaction's
|
|
fields repeated.
|
|
|
|
o The "txnidx" (transaction index) field shows which postings belong to
|
|
the same transaction. (This number might change if transactions are
|
|
reordered within the file, files are parsed/included in a different
|
|
order, etc.)
|
|
|
|
o The amount is separated into "commodity" (the symbol) and "amount"
|
|
(numeric quantity) fields.
|
|
|
|
o The numeric amount is repeated in either the "credit" or "debit" col-
|
|
umn, for convenience. (Those names are not accurate in the account-
|
|
ing sense; it just puts negative amounts under credit and zero or
|
|
greater amounts under debit.)
|
|
|
|
print-unique
|
|
print-unique
|
|
Print transactions which do not reuse an already-seen description.
|
|
|
|
Example:
|
|
|
|
$ cat unique.journal
|
|
1/1 test
|
|
(acct:one) 1
|
|
2/2 test
|
|
(acct:two) 2
|
|
$ LEDGER_FILE=unique.journal hledger print-unique
|
|
(-f option not supported)
|
|
2015/01/01 test
|
|
(acct:one) 1
|
|
|
|
register
|
|
register, reg, r
|
|
Show postings and their running total.
|
|
|
|
The register command displays postings in date order, one per line, and
|
|
their running total. This is typically used with a query selecting a
|
|
particular account, to see that account's activity:
|
|
|
|
$ hledger register checking
|
|
2008/01/01 income assets:bank:checking $1 $1
|
|
2008/06/01 gift assets:bank:checking $1 $2
|
|
2008/06/02 save assets:bank:checking $-1 $1
|
|
2008/12/31 pay off assets:bank:checking $-1 0
|
|
|
|
With --date2, it shows and sorts by secondary date instead.
|
|
|
|
The --historical/-H flag adds the balance from any undisplayed prior
|
|
postings to the running total. This is useful when you want to see
|
|
only recent activity, with a historically accurate running balance:
|
|
|
|
$ hledger register checking -b 2008/6 --historical
|
|
2008/06/01 gift assets:bank:checking $1 $2
|
|
2008/06/02 save assets:bank:checking $-1 $1
|
|
2008/12/31 pay off assets:bank:checking $-1 0
|
|
|
|
The --depth option limits the amount of sub-account detail displayed.
|
|
|
|
The --average/-A flag shows the running average posting amount instead
|
|
of the running total (so, the final number displayed is the average for
|
|
the whole report period). This flag implies --empty (see below). It
|
|
is affected by --historical. It works best when showing just one ac-
|
|
count and one commodity.
|
|
|
|
The --related/-r flag shows the other postings in the transactions of
|
|
the postings which would normally be shown.
|
|
|
|
The --invert flag negates all amounts. For example, it can be used on
|
|
an income account where amounts are normally displayed as negative num-
|
|
bers. It's also useful to show postings on the checking account to-
|
|
gether with the related account:
|
|
|
|
$ hledger register --related --invert assets:checking
|
|
|
|
With a reporting interval, register shows summary postings, one per in-
|
|
terval, aggregating the postings to each account:
|
|
|
|
$ hledger register --monthly income
|
|
2008/01 income:salary $-1 $-1
|
|
2008/06 income:gifts $-1 $-2
|
|
|
|
Periods with no activity, and summary postings with a zero amount, are
|
|
not shown by default; use the --empty/-E flag to see them:
|
|
|
|
$ hledger register --monthly income -E
|
|
2008/01 income:salary $-1 $-1
|
|
2008/02 0 $-1
|
|
2008/03 0 $-1
|
|
2008/04 0 $-1
|
|
2008/05 0 $-1
|
|
2008/06 income:gifts $-1 $-2
|
|
2008/07 0 $-2
|
|
2008/08 0 $-2
|
|
2008/09 0 $-2
|
|
2008/10 0 $-2
|
|
2008/11 0 $-2
|
|
2008/12 0 $-2
|
|
|
|
Often, you'll want to see just one line per interval. The --depth op-
|
|
tion helps with this, causing subaccounts to be aggregated:
|
|
|
|
$ hledger register --monthly assets --depth 1h
|
|
2008/01 assets $1 $1
|
|
2008/06 assets $-1 0
|
|
2008/12 assets $-1 $-1
|
|
|
|
Note when using report intervals, if you specify start/end dates these
|
|
will be adjusted outward if necessary to contain a whole number of in-
|
|
tervals. This ensures that the first and last intervals are full
|
|
length and comparable to the others in the report.
|
|
|
|
Custom register output
|
|
register uses the full terminal width by default, except on windows.
|
|
You can override this by setting the COLUMNS environment variable (not
|
|
a bash shell variable) or by using the --width/-w option.
|
|
|
|
The description and account columns normally share the space equally
|
|
(about half of (width - 40) each). You can adjust this by adding a de-
|
|
scription width as part of --width's argument, comma-separated: --width
|
|
W,D . Here's a diagram (won't display correctly in --help):
|
|
|
|
<--------------------------------- width (W) ---------------------------------->
|
|
date (10) description (D) account (W-41-D) amount (12) balance (12)
|
|
DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaa AAAAAAAAAAAA AAAAAAAAAAAA
|
|
|
|
and some examples:
|
|
|
|
$ hledger reg # use terminal width (or 80 on windows)
|
|
$ hledger reg -w 100 # use width 100
|
|
$ COLUMNS=100 hledger reg # set with one-time environment variable
|
|
$ export COLUMNS=100; hledger reg # set till session end (or window resize)
|
|
$ hledger reg -w 100,40 # set overall width 100, description width 40
|
|
$ hledger reg -w $COLUMNS,40 # use terminal width, & description width 40
|
|
|
|
This command also supports the output destination and output format op-
|
|
tions The output formats supported are txt, csv, and (experimental)
|
|
json.
|
|
|
|
register-match
|
|
register-match
|
|
Print the one posting whose transaction description is closest to DESC,
|
|
in the style of the register command. If there are multiple equally
|
|
good matches, it shows the most recent. Query options (options, not
|
|
arguments) can be used to restrict the search space. Helps ledger-au-
|
|
tosync detect already-seen transactions when importing.
|
|
|
|
rewrite
|
|
rewrite
|
|
Print all transactions, rewriting the postings of matched transactions.
|
|
For now the only rewrite available is adding new postings, like print
|
|
--auto.
|
|
|
|
This is a start at a generic rewriter of transaction entries. It reads
|
|
the default journal and prints the transactions, like print, but adds
|
|
one or more specified postings to any transactions matching QUERY. The
|
|
posting amounts can be fixed, or a multiplier of the existing transac-
|
|
tion's first posting amount.
|
|
|
|
Examples:
|
|
|
|
$ hledger-rewrite.hs ^income --add-posting '(liabilities:tax) *.33 ; income tax' --add-posting '(reserve:gifts) $100'
|
|
$ hledger-rewrite.hs expenses:gifts --add-posting '(reserve:gifts) *-1"'
|
|
$ hledger-rewrite.hs -f rewrites.hledger
|
|
|
|
rewrites.hledger may consist of entries like:
|
|
|
|
= ^income amt:<0 date:2017
|
|
(liabilities:tax) *0.33 ; tax on income
|
|
(reserve:grocery) *0.25 ; reserve 25% for grocery
|
|
(reserve:) *0.25 ; reserve 25% for grocery
|
|
|
|
Note the single quotes to protect the dollar sign from bash, and the
|
|
two spaces between account and amount.
|
|
|
|
More:
|
|
|
|
$ hledger rewrite -- [QUERY] --add-posting "ACCT AMTEXPR" ...
|
|
$ hledger rewrite -- ^income --add-posting '(liabilities:tax) *.33'
|
|
$ hledger rewrite -- expenses:gifts --add-posting '(budget:gifts) *-1"'
|
|
$ hledger rewrite -- ^income --add-posting '(budget:foreign currency) *0.25 JPY; diversify'
|
|
|
|
Argument for --add-posting option is a usual posting of transaction
|
|
with an exception for amount specification. More precisely, you can
|
|
use '*' (star symbol) before the amount to indicate that that this is a
|
|
factor for an amount of original matched posting. If the amount in-
|
|
cludes a commodity name, the new posting amount will be in the new com-
|
|
modity; otherwise, it will be in the matched posting amount's commod-
|
|
ity.
|
|
|
|
Re-write rules in a file
|
|
During the run this tool will execute so called "Automated Transac-
|
|
tions" found in any journal it process. I.e instead of specifying this
|
|
operations in command line you can put them in a journal file.
|
|
|
|
$ rewrite-rules.journal
|
|
|
|
Make contents look like this:
|
|
|
|
= ^income
|
|
(liabilities:tax) *.33
|
|
|
|
= expenses:gifts
|
|
budget:gifts *-1
|
|
assets:budget *1
|
|
|
|
Note that '=' (equality symbol) that is used instead of date in trans-
|
|
actions you usually write. It indicates the query by which you want to
|
|
match the posting to add new ones.
|
|
|
|
$ hledger rewrite -- -f input.journal -f rewrite-rules.journal > rewritten-tidy-output.journal
|
|
|
|
This is something similar to the commands pipeline:
|
|
|
|
$ hledger rewrite -- -f input.journal '^income' --add-posting '(liabilities:tax) *.33' \
|
|
| hledger rewrite -- -f - expenses:gifts --add-posting 'budget:gifts *-1' \
|
|
--add-posting 'assets:budget *1' \
|
|
> rewritten-tidy-output.journal
|
|
|
|
It is important to understand that relative order of such entries in
|
|
journal is important. You can re-use result of previously added post-
|
|
ings.
|
|
|
|
Diff output format
|
|
To use this tool for batch modification of your journal files you may
|
|
find useful output in form of unified diff.
|
|
|
|
$ hledger rewrite -- --diff -f examples/sample.journal '^income' --add-posting '(liabilities:tax) *.33'
|
|
|
|
Output might look like:
|
|
|
|
--- /tmp/examples/sample.journal
|
|
+++ /tmp/examples/sample.journal
|
|
@@ -18,3 +18,4 @@
|
|
2008/01/01 income
|
|
- assets:bank:checking $1
|
|
+ assets:bank:checking $1
|
|
income:salary
|
|
+ (liabilities:tax) 0
|
|
@@ -22,3 +23,4 @@
|
|
2008/06/01 gift
|
|
- assets:bank:checking $1
|
|
+ assets:bank:checking $1
|
|
income:gifts
|
|
+ (liabilities:tax) 0
|
|
|
|
If you'll pass this through patch tool you'll get transactions contain-
|
|
ing the posting that matches your query be updated. Note that multiple
|
|
files might be update according to list of input files specified via
|
|
--file options and include directives inside of these files.
|
|
|
|
Be careful. Whole transaction being re-formatted in a style of output
|
|
from hledger print.
|
|
|
|
See also:
|
|
|
|
https://github.com/simonmichael/hledger/issues/99
|
|
|
|
rewrite vs. print --auto
|
|
This command predates print --auto, and currently does much the same
|
|
thing, but with these differences:
|
|
|
|
o with multiple files, rewrite lets rules in any file affect all other
|
|
files. print --auto uses standard directive scoping; rules affect
|
|
only child files.
|
|
|
|
o rewrite's query limits which transactions can be rewritten; all are
|
|
printed. print --auto's query limits which transactions are printed.
|
|
|
|
o rewrite applies rules specified on command line or in the journal.
|
|
print --auto applies rules specified in the journal.
|
|
|
|
roi
|
|
roi
|
|
Shows the time-weighted (TWR) and money-weighted (IRR) rate of return
|
|
on your investments.
|
|
|
|
This command assumes that you have account(s) that hold nothing but
|
|
your investments and whenever you record current appraisal/valuation of
|
|
these investments you offset unrealized profit and loss into account(s)
|
|
that, again, hold nothing but unrealized profit and loss.
|
|
|
|
Any transactions affecting balance of investment account(s) and not
|
|
originating from unrealized profit and loss account(s) are assumed to
|
|
be your investments or withdrawals.
|
|
|
|
At a minimum, you need to supply a query (which could be just an ac-
|
|
count name) to select your investments with --inv, and another query to
|
|
identify your profit and loss transactions with --pnl.
|
|
|
|
It will compute and display the internalized rate of return (IRR) and
|
|
time-weighted rate of return (TWR) for your investments for the time
|
|
period requested. Both rates of return are annualized before display,
|
|
regardless of the length of reporting interval.
|
|
|
|
stats
|
|
stats
|
|
Show some journal statistics.
|
|
|
|
The stats command displays summary information for the whole journal,
|
|
or a matched part of it. With a reporting interval, it shows a report
|
|
for each report period.
|
|
|
|
Example:
|
|
|
|
$ hledger stats
|
|
Main journal file : /src/hledger/examples/sample.journal
|
|
Included journal files :
|
|
Transactions span : 2008-01-01 to 2009-01-01 (366 days)
|
|
Last transaction : 2008-12-31 (2333 days ago)
|
|
Transactions : 5 (0.0 per day)
|
|
Transactions last 30 days: 0 (0.0 per day)
|
|
Transactions last 7 days : 0 (0.0 per day)
|
|
Payees/descriptions : 5
|
|
Accounts : 8 (depth 3)
|
|
Commodities : 1 ($)
|
|
Market prices : 12 ($)
|
|
|
|
This command also supports output destination and output format selec-
|
|
tion.
|
|
|
|
tags
|
|
tags
|
|
List all the tag names used in the journal. With a TAGREGEX argument,
|
|
only tag names matching the regular expression (case insensitive) are
|
|
shown. With QUERY arguments, only transactions matching the query are
|
|
considered. With --values flag, the tags' unique values are listed in-
|
|
stead.
|
|
|
|
test
|
|
test
|
|
Run built-in unit tests.
|
|
|
|
This command runs the unit tests built in to hledger and hledger-lib,
|
|
printing the results on stdout. If any test fails, the exit code will
|
|
be non-zero.
|
|
|
|
This is mainly used by hledger developers, but you can also use it to
|
|
sanity-check the installed hledger executable on your platform. All
|
|
tests are expected to pass - if you ever see a failure, please report
|
|
as a bug!
|
|
|
|
This command also accepts tasty test runner options, written after a --
|
|
(double hyphen). Eg to run only the tests in Hledger.Data.Amount, with
|
|
ANSI colour codes disabled:
|
|
|
|
$ hledger test -- -pData.Amount --color=never
|
|
|
|
For help on these, see https://github.com/feuerbach/tasty#options (--
|
|
--help currently doesn't show them).
|
|
|
|
Add-on Commands
|
|
hledger also searches for external add-on commands, and will include
|
|
these in the commands list. These are programs or scripts in your PATH
|
|
whose name starts with hledger- and ends with a recognised file exten-
|
|
sion (currently: no extension, bat,com,exe, hs,lhs,pl,py,rb,rkt,sh).
|
|
|
|
Add-ons can be invoked like any hledger command, but there are a few
|
|
things to be aware of. Eg if the hledger-web add-on is installed,
|
|
|
|
o hledger -h web shows hledger's help, while hledger web -h shows
|
|
hledger-web's help.
|
|
|
|
o Flags specific to the add-on must have a preceding -- to hide them
|
|
from hledger. So hledger web --serve --port 9000 will be rejected;
|
|
you must use hledger web -- --serve --port 9000.
|
|
|
|
o You can always run add-ons directly if preferred: hledger-web --serve
|
|
--port 9000.
|
|
|
|
Add-ons are a relatively easy way to add local features or experiment
|
|
with new ideas. They can be written in any language, but haskell
|
|
scripts have a big advantage: they can use the same hledger (and
|
|
haskell) library functions that built-in commands do, for command-line
|
|
options, journal parsing, reporting, etc.
|
|
|
|
Two important add-ons are the hledger-ui and hledger-web user inter-
|
|
faces. These are maintained and released along with hledger:
|
|
|
|
ui
|
|
hledger-ui provides an efficient terminal interface.
|
|
|
|
web
|
|
hledger-web provides a simple web interface.
|
|
|
|
Third party add-ons, maintained separately from hledger, include:
|
|
|
|
iadd
|
|
hledger-iadd is a more interactive, terminal UI replacement for the add
|
|
command.
|
|
|
|
interest
|
|
hledger-interest generates interest transactions for an account accord-
|
|
ing to various schemes.
|
|
|
|
A few more experimental or old add-ons can be found in hledger's bin/
|
|
directory. These are typically prototypes and not guaranteed to work.
|
|
|
|
ENVIRONMENT
|
|
COLUMNS The screen width used by the register command. Default: the
|
|
full terminal width.
|
|
|
|
LEDGER_FILE The journal file path when not specified with -f. Default:
|
|
~/.hledger.journal (on windows, perhaps C:/Users/USER/.hledger.jour-
|
|
nal).
|
|
|
|
A typical value is ~/DIR/YYYY.journal, where DIR is a version-con-
|
|
trolled finance directory and YYYY is the current year. Or ~/DIR/cur-
|
|
rent.journal, where current.journal is a symbolic link to YYYY.journal.
|
|
|
|
On Mac computers, you can set this and other environment variables in a
|
|
more thorough way that also affects applications started from the GUI
|
|
(say, an Emacs dock icon). Eg on MacOS Catalina I have a ~/.MacOSX/en-
|
|
vironment.plist file containing
|
|
|
|
{
|
|
"LEDGER_FILE" : "~/finance/current.journal"
|
|
}
|
|
|
|
To see the effect you may need to killall Dock, or reboot.
|
|
|
|
FILES
|
|
Reads data from one or more files in hledger journal, timeclock, time-
|
|
dot, or CSV format specified with -f, or $LEDGER_FILE, or
|
|
$HOME/.hledger.journal (on windows, perhaps
|
|
C:/Users/USER/.hledger.journal).
|
|
|
|
LIMITATIONS
|
|
The need to precede addon command options with -- when invoked from
|
|
hledger is awkward.
|
|
|
|
When input data contains non-ascii characters, a suitable system locale
|
|
must be configured (or there will be an unhelpful error). Eg on POSIX,
|
|
set LANG to something other than C.
|
|
|
|
In a Microsoft Windows CMD window, non-ascii characters and colours are
|
|
not supported.
|
|
|
|
On Windows, non-ascii characters may not display correctly when running
|
|
a hledger built in CMD in MSYS/CYGWIN, or vice-versa.
|
|
|
|
In a Cygwin/MSYS/Mintty window, the tab key is not supported in hledger
|
|
add.
|
|
|
|
Not all of Ledger's journal file syntax is supported. See file format
|
|
differences.
|
|
|
|
On large data files, hledger is slower and uses more memory than
|
|
Ledger.
|
|
|
|
TROUBLESHOOTING
|
|
Here are some issues you might encounter when you run hledger (and re-
|
|
member you can also seek help from the IRC channel, mail list or bug
|
|
tracker):
|
|
|
|
Successfully installed, but "No command 'hledger' found"
|
|
stack and cabal install binaries into a special directory, which should
|
|
be added to your PATH environment variable. Eg on unix-like systems,
|
|
that is ~/.local/bin and ~/.cabal/bin respectively.
|
|
|
|
I set a custom LEDGER_FILE, but hledger is still using the default file
|
|
LEDGER_FILE should be a real environment variable, not just a shell
|
|
variable. The command env | grep LEDGER_FILE should show it. You may
|
|
need to use export. Here's an explanation.
|
|
|
|
"Illegal byte sequence" or "Invalid or incomplete multibyte or wide
|
|
character" errors
|
|
In order to handle non-ascii letters and symbols (like ), hledger needs
|
|
an appropriate locale. This is usually configured system-wide; you can
|
|
also configure it temporarily. The locale may need to be one that sup-
|
|
ports UTF-8, if you built hledger with GHC < 7.2 (or possibly always,
|
|
I'm not sure yet).
|
|
|
|
Here's an example of setting the locale temporarily, on ubuntu
|
|
gnu/linux:
|
|
|
|
$ file my.journal
|
|
my.journal: UTF-8 Unicode text # <- the file is UTF8-encoded
|
|
$ locale -a
|
|
C
|
|
en_US.utf8 # <- a UTF8-aware locale is available
|
|
POSIX
|
|
$ LANG=en_US.utf8 hledger -f my.journal print # <- use it for this command
|
|
|
|
Here's one way to set it permanently, there are probably better ways:
|
|
|
|
$ echo "export LANG=en_US.UTF-8" >>~/.bash_profile
|
|
$ bash --login
|
|
|
|
If we preferred to use eg fr_FR.utf8, we might have to install that
|
|
first:
|
|
|
|
$ apt-get install language-pack-fr
|
|
$ locale -a
|
|
C
|
|
en_US.utf8
|
|
fr_BE.utf8
|
|
fr_CA.utf8
|
|
fr_CH.utf8
|
|
fr_FR.utf8
|
|
fr_LU.utf8
|
|
POSIX
|
|
$ LANG=fr_FR.utf8 hledger -f my.journal print
|
|
|
|
Note some platforms allow variant locale spellings, but not all (ubuntu
|
|
accepts fr_FR.UTF8, mac osx requires exactly fr_FR.UTF-8).
|
|
|
|
|
|
|
|
REPORTING BUGS
|
|
Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel
|
|
or hledger mail list)
|
|
|
|
|
|
AUTHORS
|
|
Simon Michael <simon@joyful.com> and contributors
|
|
|
|
|
|
COPYRIGHT
|
|
Copyright (C) 2007-2019 Simon Michael.
|
|
Released under GNU GPL v3 or later.
|
|
|
|
|
|
SEE ALSO
|
|
hledger(1), hledger-ui(1), hledger-web(1), hledger-api(1),
|
|
hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-
|
|
dot(5), ledger(1)
|
|
|
|
http://hledger.org
|
|
|
|
|
|
|
|
hledger 1.17.99 March 2020 hledger(1)
|