1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【fx】JSONログをTUIで探索する入門

1
Last updated at Posted at 2026-04-15

こんな人におすすめ

  • JSONログをターミナルでサクサク確認したい
  • jqの構文を覚えるのが面倒(fxはJavaScriptで書け、カスタム関数も作れる)
  • Claude Codeのセッションログをターミナル上で視覚的に解析したい
  • 自作ツールのJSONLログをターミナル上で視覚的に可視化したい

そんな人にはfxがおすすめです。

結論:fxでできること

fxには2つの使い方がある。

  1. 視覚的な探索: JSONをターミナル上で視覚的に探索・検索
  2. JavaScript変換: 式でデータを変換・フィルタ(jqの代替)

JSONL(行区切りJSON)のログ解析にも対応。

# ターミナル上で視覚的に探索
curl https://api.github.com/users/octocat | fx

# ログをターミナル上で視覚的に解析
cat app.jsonl | fx -s

fxとは

ターミナルで動作するJSON/YAML/TOMLビューア&プロセッサ。ターミナル上でインタラクティブに操作できるのが最大の特徴。Go製で高速、jqと違い独自DSLではなくJavaScriptで処理できる。

インストール

egetでGitHub Releaseから直接取得。egetについてはGitHub Releaseを5秒でインストールする方法【Eget】を参照。

eget antonmedv/fx

ターミナル上での基本操作

起動方法

# ファイルを開く
fx data.json

# パイプで受け取る
curl https://api.example.com/users | fx

# JSONLをターミナル上で視覚的に確認
cat logs.jsonl | fx -s

主要キーバインド

キー 動作
j/k 上下移動
J/K 次/前の兄弟要素にジャンプ
h/l 折りたたみ/展開
e/E 全展開/全折りたたみ
/ 正規表現検索
n/N 次/前の検索結果
y オブジェクトごとコピー
@ ファジー検索でジャンプ
. パス入力(dig)

実践Tips:yキーの活用

y キーでコピーすると、選択中のノードがJSON形式でクリップボードにコピーされる。構造を保ったままコピーできる形式なのがポイント。

{
  "id": 1,
  "name": "alice",
  "profile": {
    "email": "alice@example.com",
    "age": 25
  }
}

profile オブジェクトで y を押すとこうなる。

{
  "email": "alice@example.com",
  "age": 25
}

JSONオブジェクトの構造を保ったままコピーできる。

実践Tips:J/Kで兄弟要素を移動

J/K キーで次/前の兄弟要素にジャンプできる。j/k だと1行ずつ移動するが、J/K なら配列の各要素間を一発で移動できる。

以下のJSONをfxで開いている場合:

[
  {
    "id": 1,
    "user": { ... },
    "items": [ ... ],
    "payment": { ... },
    "shipping": { ... }
  },
  {
    "id": 2,
    "user": { ... },
    "items": [ ... ],
    "payment": { ... },
    "shipping": { ... }
  },
  ...
]

最初の要素にカーソルがある状態で J を押すと次の要素へ、K で前の要素へジャンプ。リスト内のオブジェクトを順番に確認できる。

実践Tips:@キーでパスにジャンプ

@ キーを押すとファジー検索が起動し、JSONパスを入力して直接ジャンプできる。大きなJSONで特定のフィールドを探すときに便利。

# @を押して入力
users.0.email  → users配列の最初の要素のemailにジャンプ

JavaScript式で変換

fxの特徴は、jqの独自DSLではなくJavaScriptで処理できる点。

# ドット記法でアクセス
echo '{"user":{"name":"alice"}}' | fx '.user.name'
# → "alice"

# アロー関数
echo '[1,2,3,4,5]' | fx 'x => x.filter(n => n > 2)'
# → [3, 4, 5]

# map/filter
echo '{"users":[{"name":"alice","age":25},{"name":"bob","age":30}]}' \
  | fx '.users' 'x => x.filter(u => u.age >= 30).map(u => u.name)'
# → ["bob"]

実践:JSONLログをターミナル上で視覚的に解析

ログファイルなどで使われるJSONL形式は -s(slurp)オプションで配列として読み込み、ターミナル上で視覚的に探索できる。

# JSONLをターミナル上で視覚的に確認
cat logs.jsonl | fx -s

fxで式を評価すると結果は標準出力されるため、ターミナル上で視覚的に操作したい場合は | fx でパイプする。

実践:Claude Codeのセッション解析

Claude Codeは会話履歴を ~/.claude/projects/ にJSONL形式で保存している。fxでターミナル上で視覚的に解析できる。

会話のみ抽出してターミナル上で視覚的に確認

.fxrc.js にカスタム関数を定義しておくと、最新セッションの会話をワンコマンドで確認できる。

# 最新セッションの会話を抽出
fx -s claude_chat < "$(ls -t ~/.claude/projects/*/*.jsonl | head -1)" | fx

.fxrc.jsでカスタム関数

~/.fxrc.js にカスタム関数を定義できる。

// ~/.fxrc.js

// Claude Codeセッションから会話のみ抽出
function claude_chat(x) {
  return x
    .filter(m => ["user", "assistant"].includes(m.type))
    .map(m => {
      let c = m.message?.content;
      let text = typeof c === "string" ? c
        : Array.isArray(c)
          ? c.filter(b => !["thinking", "tool_use", "tool_result"].includes(b.type))
             .map(b => b.text).join(" ")
          : "";
      return { role: m.type, ts: m.timestamp?.slice(11, 19), text: text.trim() };
    })
    .filter(m => m.text)
    .map((m, i) => ({
      "#": i + 1,
      role: m.role[0].toUpperCase(),
      ts: m.ts,
      content: m.text.split("\n")
    }));
}

# Claude Codeの最新セッションを解析
fx -s claude_chat < "$(ls -t ~/.claude/projects/*/*.jsonl | head -1)" | fx

まとめ

やりたいこと コマンド
ターミナル上で視覚的に探索 fx data.json または cat | fx
JavaScript式で変換 fx '.field' または fx 'x => ...'
JSONL読み込み fx -s
変換後にターミナル上で視覚的に確認 fx -s 'expr' | fx
オブジェクトごとコピー y キー
兄弟要素に移動 J/K キー
パスにジャンプ @ キー
正規表現検索 / キー

JSONログをターミナルで解析するなら、ターミナル上で視覚的に確認できるfxが便利。jqと違ってJavaScript構文なので学習コストも低い。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?