使用 bea(Beancount.io 的命令行工具)从头到尾完成一个月的账目结算。你将打开账本、记录购买、导入银行导出文件、核对到 3206.81 美元 的对账单余额,并阅读当月的损益表和资产负债表。
这个月是 2026 年 8 月,账本从支票账户中的 1,250 美元开始。这里不需要你编写任何 Python 代码或查询语句。
如果还没安装 bea,请先安装:Beancount CLI 快速入门 涵盖了 Homebrew 和 uv 的安装方式。本地记账不需要 Beancount.io 账户。
在一个空目录中工作。开始之前,先把两个输入文件下载到其中:
- first-month.csv — 你在第 3 周导入的银行导出文件。
- rules.toml — 该导出文件使用的分类规则。
每条命令都用 --file august/main.bean 指定账本,因此你可以从该目录运行它们,而无需切换目录。
第 1 周 — 设置账目
创建账本,然后打开模板中本月缺少的那一个账户。
bea --no-input init august --currency USD --date 2026-08-01 \
--opening-balance "Assets:Checking 1250"
bea --file august/main.bean add open --date 2026-08-01 --account Expenses:Transport:Fuel -c USDinit 会写入 august/main.bean,其中包含十四个账户,包括 Expenses:Uncategorized。导入操作会将无法分类的行暂存到那里。
第 2 周 — 记录日常购买
随时记录购买。日期默认为今天,因此追溯过去的历史需要显式传递 --date。
bea --file august/main.bean add transaction "Coffee" --date 2026-08-03 \
--posting "Expenses:Dining 4.50" --posting "Assets:Checking"
bea --file august/main.bean add transaction "Weekly groceries" --date 2026-08-05 \
--posting "Expenses:Groceries 62.30" --posting "Assets:Checking"
bea --file august/main.bean add transaction --date 2026-08-07 --payee "Employer" \
--narration "August salary" --posting "Assets:Checking 2100" --posting "Income:Salary"每次添加都会在文件被替换之前对照整个账本进行检查。第二个条目留空,这样 Beancount 就会自动填入平衡金额。
第 3 周 — 导入银行导出文件
八月剩余时间的导出文件包含三行内容:
Date,Payee,Amount
2026-08-10,Whole Foods,-28.40
2026-08-12,Shell,-35.00
2026-08-20,Mystery Shop,-9.99规则文件将收款人与账户进行匹配。规则按文件顺序执行,第一个匹配的规则生效。
[[rule]]
match = "whole foods|trader joe|corner market"
account = "Expenses:Groceries"
[[rule]]
match = "shell|chevron|exxon"
account = "Expenses:Transport:Fuel"
[[rule]]
match = "salary|payroll|employer"
account = "Income:Salary"使用 --csv 映射导出文件的列,预览结果,然后使用 --apply 重复执行以写入账本。
bea --file august/main.bean import first-month.csv \
--csv date=Date,amount=Amount,payee=Payee --account Assets:Checking --rules rules.toml
bea --file august/main.bean import first-month.csv --apply预览会逐行打印每条记录及其匹配的规则,以及它将写入的确切差异。在 --apply 之前,不会写入任何内容。
第二条命令不需要任何标志:列映射、账户和规则都会为该文件记住。每条写入的条目都带有 import-id 行,因此再次导入相同的导出文件时会跳过账本中已有的内容。
两行记录匹配到了规则。第三行 Mystery Shop 没有匹配到任何规则,因此它会以 ! 标志记入 Expenses:Uncategorized —— 这是你后续的审核队列。
关于借方和贷方列格式、其他货币以及 Python 导入器,请参阅 使用 CLI 导入银行导出文件。
第 4 周 — 与对账单核对
八月的对账单显示支票账户余额为 3206.81 美元。你的账本显示 3209.81 美元。差额是导出文件遗漏的一笔 3.00 美元的银行费用。
记录这笔费用,然后断言对账单余额。Beancount 会在当天开始时检查断言,因此 9 月 1 日的断言涵盖了所有八月的交易。
bea --file august/main.bean add transaction "Bank fee" --date 2026-08-31 \
--posting "Expenses:Fees 3.00" --posting "Assets:Checking"
bea --file august/main.bean add balance --date 2026-09-01 --account Assets:Checking \
--amount "3206.81 USD"
bea --file august/main.bean list transaction --flag '!' --details队列中有一条交易,即 Mystery Shop 行。--details 会打印其文件和行号。
在编辑器中打开那一行。将其 Expenses:Uncategorized 条目改为它应属于的账户 —— 这里是 Expenses:Dining —— 并将其标志从 ! 改为 * 以标记为已审核。保留 import-id 行,以便重复导入时仍会跳过该行。
然后确认账本加载成功且队列为空:
bea --file august/main.bean check
bea --file august/main.bean list transaction --flag '!' --details干净的账本退出代码为 0。断言语失败或未知账户会以非零退出代码列出。队列现在打印 No transactions found.。
阅读当月报表
bea --file august/main.bean report income-statement --time 2026-08
bea --file august/main.bean report balance-sheet
bea --file august/main.bean report income-statement --time month损益表将 2,100.00 美元的工资与 143.19 美元的开销相抵,得出 1,956.81 美元的净利润。账户余额以 Beancount 符号打印,因此收入行是负数。资产负债表显示支票账户余额为 3,206.81 美元,与你核对的对账单一致。
--time 2026-08 固定了本教程的月份。--time month 始终表示当前月份,这将是你账目更新到当前时会使用的选项。
从这里继续
- 使用 CLI 导入银行导出文件 了解重复审核、其他列布局和重复导入。
- 使用 bea 自动化记账 了解 JSON 信封、退出代码和无人值守运行。
- Beancount CLI 参考 了解所有命令和选项。