【追記 2026-09-17】3GBで負けたと思っていたら、勝っていた(ただし冷えていれば)
この記事には「3GB は ripgrep が速い」という趣旨の記述があります。それは ファイルが OS のキャッシュに載っているときの話でした。
sudo purgeの直後(=しばらくぶりにそのファイルを開くとき)に測り直すと、3GB でも uvp が 2.6倍速いです。
3GB・固定文字列「東京」 rg uvp コールド(purge 直後) 3.26秒 1.25秒(2.6倍) ウォーム(続けて2回目) 0.33秒 1.01秒 7種類の検索のうち6つで同じ傾向でした(uvp 1.6.3)。詳しくは 3GBで負けたと思っていたら、勝っていた(ただし冷えていれば) に書いています。計測は Mac(Apple M4 / メモリ32GB / 外付け USB SSD)で、Windows・Linux(非力なノートPC・VMware 上)では傾向が変わる可能性があります。本文の以下の数字は、そのまま(ウォームでの計測)です。
ブログ記事に載せた uvp のコマンドを、rg / sort / uniq / sed / head / tail / gzip と 3GB・10GB・50GB の実データで突き合わせたスクリプト(uv_cli_test4.sh)の動作ログです。コマンドの意味や使い方は uvp コマンドを付けました と CLI → UwView Pro 対応表 に書いてあるので、ここでは繰り返しません。
動作ログ(全文・無編集)
% ./uv_cli_test4.sh
# 記事の uvp コマンド × CLI(rg / sort / uniq / sed)突き合わせ 20260915-170224-uvp4
| 項目 | 値 |
|---|---|
| OS | Darwin 25.3.0 arm64 |
| 機種 | Apple M4 / 32GB |
| uvp | /usr/local/bin/uvp uvp 1.6.0 |
| ripgrep | /opt/homebrew/bin/rg (ripgrep 15.2.0) |
| sed | /usr/bin/sed (BSD sed) |
| データ | /Volumes/BIWIN/26work/UwViewData/osm |
| .uwvz | 既にあるものを再利用(無ければ最初に作る) |
| 上限 | 全シャード合計。1語目が100万件を超えうる項目は `-limit none` 付き |
| 確認項目 | search icase regex drill invert grepform context seq tally sortcnt sortval headtail sorthead outtxt outgz sedline uwvzonly extract cat exit1 regexnl exit2 limitn limitnone replace replacere |
== 3G: osm/japan-dv-ai 3032812644 バイト
.uwvz あり(251829224 バイト)→ 再利用します
$ rg -n -F '東京' osm/japan-dv-ai
$ uvp osm/japan-dv-ai '東京'
✅ 検索 東京 CLI 3.31 秒 uvp 0.79 秒 CLI/uvp=4.19 🟢 11274 件 exit=0 .uwvz 再利用
$ rg -n -i -F tokyo osm/japan-dv-ai
$ uvp osm/japan-dv-ai tokyo -i
✅ 大小無視 -i CLI 0.53 秒 uvp 0.64 秒 CLI/uvp=1/1.21 🍊 2137 件 exit=0 .uwvz 再利用
$ rg -n 'v="(bus_stop|traffic_signals)"' osm/japan-dv-ai
$ uvp osm/japan-dv-ai 'v="(bus_stop|traffic_signals)"' -E
✅ 正規表現 -E CLI 0.63 秒 uvp 0.79 秒 CLI/uvp=1/1.25 🍊 20620 件 exit=0 .uwvz 再利用
$ rg -n -F 'k="amenity"' osm/japan-dv-ai | rg -F 'v="parking"'
$ uvp osm/japan-dv-ai 'k="amenity"' 'v="parking"' -limit none
✅ 絞り込み 2語 CLI 0.46 秒 uvp 1.30 秒 CLI/uvp=1/2.83 🍊 94843 件 exit=0 .uwvz 再利用
$ rg -n -F 'k="amenity"' osm/japan-dv-ai | rg -v -F 'v="parking"'
$ uvp osm/japan-dv-ai 'k="amenity"' 'v="parking"' -v -limit none
✅ 除外 -v CLI 0.46 秒 uvp 1.33 秒 CLI/uvp=1/2.89 🍊 38373 件 exit=0 .uwvz 再利用
$ uvp osm/japan-dv-ai 'k="amenity"' -grep 'v="parking"' -limit none
✅ 絞り込み -grep 記法 CLI - 秒 uvp 1.39 秒 CLI/uvp=- 94843 件 exit=0 2語並べた形と同じ結果か
$ uvp osm/japan-dv-ai 'k="amenity"' -C 3 'k="name"' -limit none
・ ±3行の中に2語目 -C CLI - 秒 uvp 1.25 秒 CLI/uvp=- 14301 件 exit=0 CLI に同じ意味の1コマンドは無い(rg -C は文脈を出すだけ)
$ uvp osm/japan-dv-ai -seq 'k="amenity",k="name"' -limit none
・ 順序 -seq CLI - 秒 uvp 1.02 秒 CLI/uvp=- 37125 件 exit=0 CLI に相当機能なし(awk の状態機械が要る)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ai | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
$ uvp osm/japan-dv-ai 'k="amenity"' -uniq 'v="([^"]+)"' -head 20 -limit none
✅ 集計 -uniq 上位20 CLI 0.45 秒 uvp 0.76 秒 CLI/uvp=1/1.69 🍊 20 件 exit=0 値と件数を集合として比較(sort|uniq -c|sort -rn|head)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ai | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
$ uvp osm/japan-dv-ai 'k="amenity"' -uniq 'v="([^"]+)"' -sort count -head 20 -limit none
✅ 集計+件数順 -sort count CLI 0.45 秒 uvp 0.89 秒 CLI/uvp=1/1.98 🍊 20 件 exit=0 同数の並び順は問わない(集合として比較)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ai | LC_ALL=C sort | uniq -c | LC_ALL=C sort -k2 | head -20
$ uvp osm/japan-dv-ai 'k="amenity"' -uniq 'v="([^"]+)"' -sort value -head 20 -limit none
✅ 集計+値順 -sort value CLI 0.44 秒 uvp 0.87 秒 CLI/uvp=1/1.98 🍊 20 件 exit=0 値順の上位20(LC_ALL=C の並びで比較)
$ rg -n -F '東京' osm/japan-dv-ai | head -10
$ uvp osm/japan-dv-ai '東京' -head 10
✅ 先頭10件 -head CLI 0.05 秒 uvp 0.74 秒 CLI/uvp=1/14.80 🍊 10 件 exit=0 rg は10件出た時点で終了(早期終了)。全件走査する形は次の sort→head 行
$ rg -n -F '東京' osm/japan-dv-ai | tail -10
$ uvp osm/japan-dv-ai '東京' -tail 10
✅ 末尾10件 -tail CLI 0.34 秒 uvp 0.83 秒 CLI/uvp=1/2.44 🍊 10 件 exit=0 rg | tail は末尾を知るため全件走査(早期終了なし)
$ rg -N -F '東京' osm/japan-dv-ai | LC_ALL=C sort | head -10
$ uvp osm/japan-dv-ai '東京' -sort '^(.*)$' -head 10 --no-line-number
✅ 並べ替えて先頭10件 CLI 0.29 秒 uvp 0.70 秒 CLI/uvp=1/2.41 🍊 10 件 exit=0 rg | sort | head と同じか(LC_ALL=C・キーは行全体)
$ rg -n -F '東京' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/rg_out.txt
$ uvp osm/japan-dv-ai '東京' -out cli-test-results/20260915-170224-uvp4/3G/uvp_out.txt
✅ -out(テキスト) CLI 0.35 秒 uvp 0.83 秒 CLI/uvp=1/2.37 🍊 11274 件 exit=0 書き出したファイルどうしを比較
$ rg -n -F '東京' osm/japan-dv-ai | gzip -6 > cli-test-results/20260915-170224-uvp4/3G/rg_out.txt.gz
$ uvp osm/japan-dv-ai '東京' -out cli-test-results/20260915-170224-uvp4/3G/uvp_out.txt.gz
✅ -out(.gz) CLI 0.36 秒 uvp 0.84 秒 CLI/uvp=1/2.33 🍊 11274 件 exit=0 展開してから中身を比較
$ sed -n '/東京/p' osm/japan-dv-ai
$ uvp osm/japan-dv-ai '東京' --no-line-number
✅ 行だけ出す ↔ sed -n p CLI 9.61 秒 uvp 0.75 秒 CLI/uvp=12.81 🟢 11274 件 exit=0 sed の抽出と本文を比較(行番号なし)
$ uvp osm/japan-dv-ai.uwvz '東京'
✅ .uwvz だけで検索 CLI - 秒 uvp 0.74 秒 CLI/uvp=- 11274 件 exit=0 元ファイルを見ずに .uwvz から検索
$ uvp osm/japan-dv-ai.uwvz -extract -out cli-test-results/20260915-170224-uvp4/3G/extracted
✅ -extract(バイト一致) CLI - 秒 uvp 3.62 秒 CLI/uvp=- - 件 exit=0 無料機能。元ファイルと cmp
$ uvp cat osm/japan-dv-ai
✅ cat(本文をそのまま) CLI - 秒 uvp 3.65 秒 CLI/uvp=- - 件 exit=0 元ファイルと cmp
$ uvp osm/japan-dv-ai NO_SUCH_WORD_ZZ9
✅ 見つからない → exit 1 CLI - 秒 uvp 0.66 秒 CLI/uvp=- 0 件 exit=1 grep 互換(0=あり 1=なし)
$ rg -n '[0-9]{3}-[0-9]{4}"' osm/japan-dv-ai
$ uvp osm/japan-dv-ai '[0-9]{3}-[0-9]{4}"' -E
✅ 正規表現 -E(リテラルなし) CLI 2.46 秒 uvp 1.08 秒 CLI/uvp=2.28 🟢 14951 件 exit=0 必ず含む文字列が無い式=前置フィルタなし。regex の秒と比べる
$ rg -n -F 'k="building"' osm/japan-dv-ai
$ uvp osm/japan-dv-ai 'k="building"'
✅ 既定の上限(exit 2 / 全件) CLI 0.83 秒 uvp 0.59 秒 CLI/uvp=1.41 🟢 1000000 件 exit=2 上限 1000000 件で打ち切り(rg は 5747705 件)。ちょうど上限件数・行順・rg の部分集合
$ uvp osm/japan-dv-ai '東京' -limit 1000
✅ -limit 1000 CLI - 秒 uvp 0.32 秒 CLI/uvp=- 1000 件 exit=2 上限 1000 件で打ち切り(rg は 11274 件)。ちょうど上限件数・行順・rg の部分集合
$ uvp osm/japan-dv-ai 'k="building"' -limit none
✅ -limit none(全件) CLI 0.83 秒 uvp 2.80 秒 CLI/uvp=1/3.37 🍊 5747705 件 exit=0 打ち切らずに rg と全件一致するか(5747705 件)
== 10G: osm/japan-dv-ac 10255315281 バイト
.uwvz あり(1164605577 バイト)→ 再利用します
$ rg -n -F '東京' osm/japan-dv-ac
$ uvp osm/japan-dv-ac '東京'
✅ 検索 東京 CLI 11.19 秒 uvp 1.87 秒 CLI/uvp=5.98 🟢 11393 件 exit=0 .uwvz 再利用
$ rg -n -i -F tokyo osm/japan-dv-ac
$ uvp osm/japan-dv-ac tokyo -i
✅ 大小無視 -i CLI 11.13 秒 uvp 1.83 秒 CLI/uvp=6.08 🟢 1286 件 exit=0 .uwvz 再利用
$ rg -n 'v="(bus_stop|traffic_signals)"' osm/japan-dv-ac
$ uvp osm/japan-dv-ac 'v="(bus_stop|traffic_signals)"' -E
✅ 正規表現 -E CLI 11.19 秒 uvp 2.00 秒 CLI/uvp=5.59 🟢 167126 件 exit=0 .uwvz 再利用
$ rg -n -F 'k="amenity"' osm/japan-dv-ac | rg -F 'v="parking"'
$ uvp osm/japan-dv-ac 'k="amenity"' 'v="parking"' -limit none
✅ 絞り込み 2語 CLI 11.14 秒 uvp 3.75 秒 CLI/uvp=2.97 🟢 2659 件 exit=0 .uwvz 再利用
$ rg -n -F 'k="amenity"' osm/japan-dv-ac | rg -v -F 'v="parking"'
$ uvp osm/japan-dv-ac 'k="amenity"' 'v="parking"' -v -limit none
✅ 除外 -v CLI 11.03 秒 uvp 3.96 秒 CLI/uvp=2.79 🟢 168887 件 exit=0 .uwvz 再利用
$ uvp osm/japan-dv-ac 'k="amenity"' -grep 'v="parking"' -limit none
✅ 絞り込み -grep 記法 CLI - 秒 uvp 3.75 秒 CLI/uvp=- 2659 件 exit=0 2語並べた形と同じ結果か
$ uvp osm/japan-dv-ac 'k="amenity"' -C 3 'k="name"' -limit none
・ ±3行の中に2語目 -C CLI - 秒 uvp 3.90 秒 CLI/uvp=- 66778 件 exit=0 CLI に同じ意味の1コマンドは無い(rg -C は文脈を出すだけ)
$ uvp osm/japan-dv-ac -seq 'k="amenity",k="name"' -limit none
・ 順序 -seq CLI - 秒 uvp 2.97 秒 CLI/uvp=- 118625 件 exit=0 CLI に相当機能なし(awk の状態機械が要る)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ac | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
$ uvp osm/japan-dv-ac 'k="amenity"' -uniq 'v="([^"]+)"' -head 20 -limit none
✅ 集計 -uniq 上位20 CLI 11.05 秒 uvp 2.15 秒 CLI/uvp=5.14 🟢 20 件 exit=0 値と件数を集合として比較(sort|uniq -c|sort -rn|head)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ac | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
$ uvp osm/japan-dv-ac 'k="amenity"' -uniq 'v="([^"]+)"' -sort count -head 20 -limit none
✅ 集計+件数順 -sort count CLI 11.07 秒 uvp 2.00 秒 CLI/uvp=5.54 🟢 20 件 exit=0 同数の並び順は問わない(集合として比較)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-dv-ac | LC_ALL=C sort | uniq -c | LC_ALL=C sort -k2 | head -20
$ uvp osm/japan-dv-ac 'k="amenity"' -uniq 'v="([^"]+)"' -sort value -head 20 -limit none
✅ 集計+値順 -sort value CLI 11.07 秒 uvp 2.15 秒 CLI/uvp=5.15 🟢 20 件 exit=0 値順の上位20(LC_ALL=C の並びで比較)
$ rg -n -F '東京' osm/japan-dv-ac | head -10
$ uvp osm/japan-dv-ac '東京' -head 10
✅ 先頭10件 -head CLI 0.48 秒 uvp 1.50 秒 CLI/uvp=1/3.12 🍊 10 件 exit=0 rg は10件出た時点で終了(早期終了)。全件走査する形は次の sort→head 行
$ rg -n -F '東京' osm/japan-dv-ac | tail -10
$ uvp osm/japan-dv-ac '東京' -tail 10
✅ 末尾10件 -tail CLI 10.61 秒 uvp 1.95 秒 CLI/uvp=5.44 🟢 10 件 exit=0 rg | tail は末尾を知るため全件走査(早期終了なし)
$ rg -N -F '東京' osm/japan-dv-ac | LC_ALL=C sort | head -10
$ uvp osm/japan-dv-ac '東京' -sort '^(.*)$' -head 10 --no-line-number
✅ 並べ替えて先頭10件 CLI 11.98 秒 uvp 1.99 秒 CLI/uvp=6.02 🟢 10 件 exit=0 rg | sort | head と同じか(LC_ALL=C・キーは行全体)
$ rg -n -F '東京' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/rg_out.txt
$ uvp osm/japan-dv-ac '東京' -out cli-test-results/20260915-170224-uvp4/10G/uvp_out.txt
✅ -out(テキスト) CLI 10.98 秒 uvp 2.00 秒 CLI/uvp=5.49 🟢 11393 件 exit=0 書き出したファイルどうしを比較
$ rg -n -F '東京' osm/japan-dv-ac | gzip -6 > cli-test-results/20260915-170224-uvp4/10G/rg_out.txt.gz
$ uvp osm/japan-dv-ac '東京' -out cli-test-results/20260915-170224-uvp4/10G/uvp_out.txt.gz
✅ -out(.gz) CLI 11.06 秒 uvp 1.86 秒 CLI/uvp=5.95 🟢 11393 件 exit=0 展開してから中身を比較
$ sed -n '/東京/p' osm/japan-dv-ac
$ uvp osm/japan-dv-ac '東京' --no-line-number
✅ 行だけ出す ↔ sed -n p CLI 14.01 秒 uvp 1.81 秒 CLI/uvp=7.74 🟢 11393 件 exit=0 sed の抽出と本文を比較(行番号なし)
$ uvp osm/japan-dv-ac.uwvz '東京'
✅ .uwvz だけで検索 CLI - 秒 uvp 1.55 秒 CLI/uvp=- 11393 件 exit=0 元ファイルを見ずに .uwvz から検索
$ uvp osm/japan-dv-ac.uwvz -extract -out cli-test-results/20260915-170224-uvp4/10G/extracted
✅ -extract(バイト一致) CLI - 秒 uvp 12.93 秒 CLI/uvp=- - 件 exit=0 無料機能。元ファイルと cmp
$ uvp cat osm/japan-dv-ac
✅ cat(本文をそのまま) CLI - 秒 uvp 38.47 秒 CLI/uvp=- - 件 exit=0 元ファイルと cmp
$ uvp osm/japan-dv-ac NO_SUCH_WORD_ZZ9
✅ 見つからない → exit 1 CLI - 秒 uvp 1.95 秒 CLI/uvp=- 0 件 exit=1 grep 互換(0=あり 1=なし)
$ rg -n '[0-9]{3}-[0-9]{4}"' osm/japan-dv-ac
$ uvp osm/japan-dv-ac '[0-9]{3}-[0-9]{4}"' -E
✅ 正規表現 -E(リテラルなし) CLI 14.38 秒 uvp 2.43 秒 CLI/uvp=5.92 🟢 24988 件 exit=0 必ず含む文字列が無い式=前置フィルタなし。regex の秒と比べる
$ rg -n -F 'k="building"' osm/japan-dv-ac
$ uvp osm/japan-dv-ac 'k="building"'
✅ 既定の上限(exit 2 / 全件) CLI 11.13 秒 uvp 1.92 秒 CLI/uvp=5.80 🟢 861 件 exit=0 上限 ? 件に達せず全件(rg と同じ 861 件)
$ uvp osm/japan-dv-ac '東京' -limit 1000
✅ -limit 1000 CLI - 秒 uvp 0.63 秒 CLI/uvp=- 1000 件 exit=2 上限 1000 件で打ち切り(rg は 11393 件)。ちょうど上限件数・行順・rg の部分集合
$ uvp osm/japan-dv-ac 'k="building"' -limit none
✅ -limit none(全件) CLI 11.13 秒 uvp 1.47 秒 CLI/uvp=7.57 🟢 861 件 exit=0 打ち切らずに rg と全件一致するか(861 件)
== 50G: osm/japan-latest.osm 51254526392 バイト
.uwvz あり(5737517251 バイト)→ 再利用します
$ rg -n -F '東京' osm/japan-latest.osm
$ uvp osm/japan-latest.osm '東京'
✅ 検索 東京 CLI 55.66 秒 uvp 7.15 秒 CLI/uvp=7.78 🟢 94979 件 exit=0 .uwvz 再利用
$ rg -n -i -F tokyo osm/japan-latest.osm
$ uvp osm/japan-latest.osm tokyo -i
✅ 大小無視 -i CLI 56.26 秒 uvp 7.18 秒 CLI/uvp=7.84 🟢 14355 件 exit=0 .uwvz 再利用
$ rg -n 'v="(bus_stop|traffic_signals)"' osm/japan-latest.osm
$ uvp osm/japan-latest.osm 'v="(bus_stop|traffic_signals)"' -E
✅ 正規表現 -E CLI 55.70 秒 uvp 7.75 秒 CLI/uvp=7.19 🟢 602805 件 exit=0 .uwvz 再利用
$ rg -n -F 'k="amenity"' osm/japan-latest.osm | rg -F 'v="parking"'
$ uvp osm/japan-latest.osm 'k="amenity"' 'v="parking"' -limit none
✅ 絞り込み 2語 CLI 55.33 秒 uvp 21.48 秒 CLI/uvp=2.58 🟢 460467 件 exit=0 .uwvz 再利用
$ rg -n -F 'k="amenity"' osm/japan-latest.osm | rg -v -F 'v="parking"'
$ uvp osm/japan-latest.osm 'k="amenity"' 'v="parking"' -v -limit none
✅ 除外 -v CLI 55.35 秒 uvp 21.10 秒 CLI/uvp=2.62 🟢 935987 件 exit=0 .uwvz 再利用
$ uvp osm/japan-latest.osm 'k="amenity"' -grep 'v="parking"' -limit none
✅ 絞り込み -grep 記法 CLI - 秒 uvp 20.34 秒 CLI/uvp=- 460467 件 exit=0 2語並べた形と同じ結果か
$ uvp osm/japan-latest.osm 'k="amenity"' -C 3 'k="name"' -limit none
・ ±3行の中に2語目 -C CLI - 秒 uvp 19.88 秒 CLI/uvp=- 544212 件 exit=0 CLI に同じ意味の1コマンドは無い(rg -C は文脈を出すだけ)
$ uvp osm/japan-latest.osm -seq 'k="amenity",k="name"' -limit none
・ 順序 -seq CLI - 秒 uvp 13.46 秒 CLI/uvp=- 846622 件 exit=0 CLI に相当機能なし(awk の状態機械が要る)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-latest.osm | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
$ uvp osm/japan-latest.osm 'k="amenity"' -uniq 'v="([^"]+)"' -head 20 -limit none
✅ 集計 -uniq 上位20 CLI 55.40 秒 uvp 8.33 秒 CLI/uvp=6.65 🟢 20 件 exit=0 値と件数を集合として比較(sort|uniq -c|sort -rn|head)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-latest.osm | LC_ALL=C sort | uniq -c | sort -k1,1nr | head -20
$ uvp osm/japan-latest.osm 'k="amenity"' -uniq 'v="([^"]+)"' -sort count -head 20 -limit none
✅ 集計+件数順 -sort count CLI 55.25 秒 uvp 8.94 秒 CLI/uvp=6.18 🟢 20 件 exit=0 同数の並び順は問わない(集合として比較)
$ rg -N -o 'k="amenity" v="([^"]+)"' -r '$1' osm/japan-latest.osm | LC_ALL=C sort | uniq -c | LC_ALL=C sort -k2 | head -20
$ uvp osm/japan-latest.osm 'k="amenity"' -uniq 'v="([^"]+)"' -sort value -head 20 -limit none
✅ 集計+値順 -sort value CLI 55.28 秒 uvp 8.42 秒 CLI/uvp=6.57 🟢 20 件 exit=0 値順の上位20(LC_ALL=C の並びで比較)
$ rg -n -F '東京' osm/japan-latest.osm | head -10
$ uvp osm/japan-latest.osm '東京' -head 10
✅ 先頭10件 -head CLI 0.16 秒 uvp 6.74 秒 CLI/uvp=1/42.12 🍊 10 件 exit=0 rg は10件出た時点で終了(早期終了)。全件走査する形は次の sort→head 行
$ rg -n -F '東京' osm/japan-latest.osm | tail -10
$ uvp osm/japan-latest.osm '東京' -tail 10
✅ 末尾10件 -tail CLI 55.13 秒 uvp 8.10 秒 CLI/uvp=6.81 🟢 10 件 exit=0 rg | tail は末尾を知るため全件走査(早期終了なし)
$ rg -N -F '東京' osm/japan-latest.osm | LC_ALL=C sort | head -10
$ uvp osm/japan-latest.osm '東京' -sort '^(.*)$' -head 10 --no-line-number
✅ 並べ替えて先頭10件 CLI 55.26 秒 uvp 7.22 秒 CLI/uvp=7.65 🟢 10 件 exit=0 rg | sort | head と同じか(LC_ALL=C・キーは行全体)
$ rg -n -F '東京' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/rg_out.txt
$ uvp osm/japan-latest.osm '東京' -out cli-test-results/20260915-170224-uvp4/50G/uvp_out.txt
✅ -out(テキスト) CLI 55.90 秒 uvp 7.60 秒 CLI/uvp=7.36 🟢 94979 件 exit=0 書き出したファイルどうしを比較
$ rg -n -F '東京' osm/japan-latest.osm | gzip -6 > cli-test-results/20260915-170224-uvp4/50G/rg_out.txt.gz
$ uvp osm/japan-latest.osm '東京' -out cli-test-results/20260915-170224-uvp4/50G/uvp_out.txt.gz
✅ -out(.gz) CLI 55.95 秒 uvp 7.28 秒 CLI/uvp=7.69 🟢 94979 件 exit=0 展開してから中身を比較
$ sed -n '/東京/p' osm/japan-latest.osm
$ uvp osm/japan-latest.osm '東京' --no-line-number
✅ 行だけ出す ↔ sed -n p CLI 105.75 秒 uvp 12.31 秒 CLI/uvp=8.59 🟢 94979 件 exit=0 sed の抽出と本文を比較(行番号なし)
$ uvp osm/japan-latest.osm.uwvz '東京'
✅ .uwvz だけで検索 CLI - 秒 uvp 7.90 秒 CLI/uvp=- 94979 件 exit=0 元ファイルを見ずに .uwvz から検索
$ uvp osm/japan-latest.osm.uwvz -extract -out cli-test-results/20260915-170224-uvp4/50G/extracted
✅ -extract(バイト一致) CLI - 秒 uvp 61.76 秒 CLI/uvp=- - 件 exit=0 無料機能。元ファイルと cmp
$ uvp cat osm/japan-latest.osm
✅ cat(本文をそのまま) CLI - 秒 uvp 243.12 秒 CLI/uvp=- - 件 exit=0 元ファイルと cmp
$ uvp osm/japan-latest.osm NO_SUCH_WORD_ZZ9
✅ 見つからない → exit 1 CLI - 秒 uvp 7.03 秒 CLI/uvp=- 0 件 exit=1 grep 互換(0=あり 1=なし)
$ rg -n '[0-9]{3}-[0-9]{4}"' osm/japan-latest.osm
$ uvp osm/japan-latest.osm '[0-9]{3}-[0-9]{4}"' -E
✅ 正規表現 -E(リテラルなし) CLI 67.60 秒 uvp 12.88 秒 CLI/uvp=5.25 🟢 224915 件 exit=0 必ず含む文字列が無い式=前置フィルタなし。regex の秒と比べる
$ rg -n -F 'k="building"' osm/japan-latest.osm
$ uvp osm/japan-latest.osm 'k="building"'
✅ 既定の上限(exit 2 / 全件) CLI 60.35 秒 uvp 1.24 秒 CLI/uvp=48.67 🟢 1000000 件 exit=2 上限 1000000 件で打ち切り(rg は 29114490 件)。ちょうど上限件数・行順・rg の部分集合
$ uvp osm/japan-latest.osm '東京' -limit 1000
✅ -limit 1000 CLI - 秒 uvp 0.52 秒 CLI/uvp=- 1000 件 exit=2 上限 1000 件で打ち切り(rg は 94979 件)。ちょうど上限件数・行順・rg の部分集合
$ uvp osm/japan-latest.osm 'k="building"' -limit none
✅ -limit none(全件) CLI 60.35 秒 uvp 27.12 秒 CLI/uvp=2.23 🟢 29114490 件 exit=0 打ち切らずに rg と全件一致するか(29114490 件)
== 置換 3G: osm/japan-dv-ai
$ uvp osm/japan-dv-ai '東京' -replace TOKYO -out cli-test-results/20260915-170224-uvp4/3G/uvp_rep.txt
$ rg -N -F --passthru '東京' -r TOKYO osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/rg_rep.txt
✅ 置換 -replace ↔ rg --passthru CLI 7.06 秒 uvp 4.57 秒 CLI/uvp=1.54 🟢 11,361 件 exit=0 全文をバイト一致で比較(件数は置換した箇所)
$ LC_ALL=C sed 's/東京/TOKYO/g' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/sed_rep.txt
✅ 置換 -replace ↔ sed s///g CLI 14.94 秒 uvp 4.57 秒 CLI/uvp=3.27 🟢 11,361 件 exit=0 全文をバイト一致で比較
$ uvp osm/japan-dv-ai 'v="(bus_stop|traffic_signals)"' -E -replace 'v="X_$1"' -out cli-test-results/20260915-170224-uvp4/3G/uvp_repre.txt
$ rg -N --passthru 'v="(bus_stop|traffic_signals)"' -r 'v="X_$1"' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/rg_repre.txt
✅ 置換 -E $1 ↔ rg --passthru CLI 4.97 秒 uvp 4.17 秒 CLI/uvp=1.19 🟢 20,620 件 exit=0 全文をバイト一致で比較(件数は置換した箇所)
$ LC_ALL=C sed -E 's/v="(bus_stop|traffic_signals)"/v="X_\1"/g' osm/japan-dv-ai > cli-test-results/20260915-170224-uvp4/3G/sed_repre.txt
✅ 置換 -E $1 ↔ sed -E CLI 24.81 秒 uvp 4.17 秒 CLI/uvp=5.95 🟢 20,620 件 exit=0 全文をバイト一致で比較
== 置換 10G: osm/japan-dv-ac
$ uvp osm/japan-dv-ac '東京' -replace TOKYO -out cli-test-results/20260915-170224-uvp4/10G/uvp_rep.txt
$ rg -N -F --passthru '東京' -r TOKYO osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/rg_rep.txt
✅ 置換 -replace ↔ rg --passthru CLI 26.89 秒 uvp 13.47 秒 CLI/uvp=2.00 🟢 11,445 件 exit=0 全文をバイト一致で比較(件数は置換した箇所)
$ LC_ALL=C sed 's/東京/TOKYO/g' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/sed_rep.txt
✅ 置換 -replace ↔ sed s///g CLI 26.51 秒 uvp 13.47 秒 CLI/uvp=1.97 🟢 11,445 件 exit=0 全文をバイト一致で比較
$ uvp osm/japan-dv-ac 'v="(bus_stop|traffic_signals)"' -E -replace 'v="X_$1"' -out cli-test-results/20260915-170224-uvp4/10G/uvp_repre.txt
$ rg -N --passthru 'v="(bus_stop|traffic_signals)"' -r 'v="X_$1"' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/rg_repre.txt
✅ 置換 -E $1 ↔ rg --passthru CLI 26.80 秒 uvp 14.08 秒 CLI/uvp=1.90 🟢 167,126 件 exit=0 全文をバイト一致で比較(件数は置換した箇所)
$ LC_ALL=C sed -E 's/v="(bus_stop|traffic_signals)"/v="X_\1"/g' osm/japan-dv-ac > cli-test-results/20260915-170224-uvp4/10G/sed_repre.txt
✅ 置換 -E $1 ↔ sed -E CLI 78.36 秒 uvp 14.08 秒 CLI/uvp=5.57 🟢 167,126 件 exit=0 全文をバイト一致で比較
== 置換 50G: osm/japan-latest.osm
$ uvp osm/japan-latest.osm '東京' -replace TOKYO -out cli-test-results/20260915-170224-uvp4/50G/uvp_rep.txt
$ rg -N -F --passthru '東京' -r TOKYO osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/rg_rep.txt
✅ 置換 -replace ↔ rg --passthru CLI 146.65 秒 uvp 69.75 秒 CLI/uvp=2.10 🟢 95,328 件 exit=0 全文をバイト一致で比較(件数は置換した箇所)
$ LC_ALL=C sed 's/東京/TOKYO/g' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/sed_rep.txt
✅ 置換 -replace ↔ sed s///g CLI 187.74 秒 uvp 69.75 秒 CLI/uvp=2.69 🟢 95,328 件 exit=0 全文をバイト一致で比較
$ uvp osm/japan-latest.osm 'v="(bus_stop|traffic_signals)"' -E -replace 'v="X_$1"' -out cli-test-results/20260915-170224-uvp4/50G/uvp_repre.txt
$ rg -N --passthru 'v="(bus_stop|traffic_signals)"' -r 'v="X_$1"' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/rg_repre.txt
✅ 置換 -E $1 ↔ rg --passthru CLI 132.74 秒 uvp 69.95 秒 CLI/uvp=1.90 🟢 602,805 件 exit=0 全文をバイト一致で比較(件数は置換した箇所)
$ LC_ALL=C sed -E 's/v="(bus_stop|traffic_signals)"/v="X_\1"/g' osm/japan-latest.osm > cli-test-results/20260915-170224-uvp4/50G/sed_repre.txt
✅ 置換 -E $1 ↔ sed -E CLI 405.52 秒 uvp 69.95 秒 CLI/uvp=5.80 🟢 602,805 件 exit=0 全文をバイト一致で比較
================================================================
一致: 81 件 不一致: 0 件 参考: 6 件
結果: /Volumes/BIWIN/26work/UwViewData/cli-test-results/20260915-170224-uvp4/summary.md
y4u@MacBook-Air UwViewData % uvp --help
Usage:
uvp <file> <term> [stages…] [options] investigate (flag syntax)
uvp <file> '<term> | sort … | uniq …' investigate (quoted pipe syntax, same meaning)
uvp convert <file> [-out x.uwvz] build the .uwvz
uvp cat <file> [-out …] print the text
uvp <file.uwvz> -extract [txt|gz|zip] restore the original (free)
uvp <file> <term> -replace <text> print the whole text with matches replaced (sed 's/A/B/g'; Edit license)
uvp -open [<file>] launch the app (and open the file if given)
Stages (run in the order written):
<term> / -grep <term> search. Later searches look only within ±N of the previous stage (drill-down)
-i ignore case -E regex -w whole word -v exclude (2nd stage on) -C N context lines
-uniq <key> tally (key = first capture group of a regex)
-sort <key> sort (lines by key / after -uniq by count or value)
-seq a,b,c flows where a→b→c appear in that order
-head N / -tail N first / last N
Options:
-out <file> output file (.gz / .zip are compressed; anything else is text)
-limit N max hits kept per search (default: the app setting, initially 1,000,000;
0 or none = unlimited. Memory grows with the hit count, so write large results with -out)
-replace <text> print the whole text with every match of the term (-i -E -w allowed) replaced.
The file itself is not changed. The text is literal; with -E, $1 etc. insert groups ($$ = $)
--force overwrite an existing output file
--no-line-number omit line numbers
--csv / --json format for tally results
-open at the start: run in the app / at the end: run, then also open in the app
Exit codes: 0=found 1=not found 2=error
比率が出た項目の合計(アイキャッチのグラフ)
ログの中で CLI/uvp= に数値が出た項目(CLI 側にも同じ仕事のコマンドがあり、両方の秒が取れたもの)だけを集めて、サイズごとに合計しました。置換の 4 行は同じ uvp の実行を rg と sed の両方に当てているので、uvp の秒は 1 回分だけ数えています。
全 21 項目(検索・集計・出力 17 + 置換 4。CLI は rg と sed)
| サイズ | CLI 合計 | uvp 合計 | CLI/uvp |
|---|---|---|---|
| 3GB | 73.63 秒 | 25.27 秒 | 2.9 |
| 10GB | 343.19 秒 | 64.19 秒 | 5.3 |
| 50GB | 1,833.33 秒 | 320.54 秒 | 5.7 |
sed の項目を除いた 18 項目(CLI は rg のみ)
| サイズ | rg 合計 | uvp 合計 | rg/uvp |
|---|---|---|---|
| 3GB | 24.27 秒 | 24.52 秒 | 1.0 |
| 10GB | 224.31 秒 | 62.38 秒 | 3.6 |
| 50GB | 1,134.32 秒 | 308.23 秒 | 3.7 |
アイキャッチの上段が全 21 項目、下段が rg のみの 18 項目です。uvp はいずれも既存の .uwvz を再利用した数字で、初回の .uwvz 作成(3GB 1.1 秒・10GB 11.8 秒・50GB 59.6 秒)は含んでいません。
rg / uvp の比率が出ない項目
ログで CLI/uvp=- になっている項目です。各サイズに 8 項目ずつあります。
| 項目 | 理由(ログの備考のとおり) |
|---|---|
絞り込み -grep 記法 |
2 語を並べた形と同じ結果になるかの確認。CLI 側は 2 語の行で計測済み |
±3 行の中に 2 語目 -C |
CLI に同じ意味の 1 コマンドが無い(rg -C は文脈を出すだけ) |
順序 -seq |
CLI に相当機能なし(awk の状態機械が要る) |
.uwvz だけで検索 |
元ファイルを見ずに .uwvz から検索。CLI に相当なし |
-extract |
元ファイルとの cmp のみ。gzip -dc とは形式が違うため時間は比べていない |
cat |
元ファイルとの cmp のみ |
| 見つからない → exit 1 | 終了コードの確認 |
-limit 1000 |
uvp 固有の上限指定 |
一致 81 件・不一致 0 件・参考 6 件の内訳は、ログ末尾の集計行のとおりです。

