rfコマンドの紹介(2025年版)
rfコマンドとは?
rfコマンドはテキストやJSON、YAMLといった形式のファイルをフィルタリングするCLIツールです。
特徴として、フィルタリングルールをRubyで記述することができます。また、独自の拡張を行いタイプ数を減らす工夫を行っています。
Rubyの実行エンジンとしてmrubyを利用しています。そのため、rubyコマンドをインストールする必要がなく、ワンバイナリーで実行することができます。
モチベーション
CLIのテキストフィルタツールとして有名なのはgrepやsed、awkがあります。また、jsonのフィルタツールではjq、YAMLではyqなどが有名だと思います。
それらのツールを使いこなすためには、それぞれの使い方や記法を覚える必要があります[1]。これらをRubyのコードでかけたから便利だなっと思ったのが始まりです。早速、rubyコマンドの-eオプションなどを使いワンライナーで書き始めたのですが、思ったよりタイプ数が多くなることに気が付きました。そこで、タイプ数を減らしつつRubyでフィルタリングができるツールを作ろうと思ったのがrfコマンドを作ったきっかけでした。
実例
実際にrfコマンドの実行例を紹介します。
まずはシンプルに、grepコマンドと同等の処理を行ってみます。ここでは、以下のような testfile という名前のファイルがあるとします。
1 foo
2 bar
3 baz
barを含む行のみ表示してみます。
$ rf /bar/ testfile
2 bar
/bar/ はRubyにおける正規表現のリテラルです。rfコマンドでは引数に指定されたRubyのコードを実行し最後に評価されたオブジェクトを自動で整形し表示します。
ちなみに、rfコマンドにはgrepサブコマンドがあり、grepコマンドと同等の動きをさせることもできます。これを使うと以下のように書くこともできます。
$ rf grep bar testfile
2 bar
次にJSONファイルのフィルタ例を見てみます。ここではAWSのIPアドレス範囲が含まれているJSONファイル(ip-ranges.json)を使って説明します。
このファイルからap-northeast-1リージョンのIPアドレス範囲を抽出してみます。ファイルのスキーマについては詳しく説明しませんが、prefixesに含まれる配列でregsionがap-northeast-1なip_prefixを抜き出します。
$ rf json -r 'prefixes.select{|p| p.region == "ap-northeast-1"}.map(&:ip_prefix).join("\n")' ip-ranges.json
15.221.34.0/24
52.144.229.64/26
13.248.70.0/24
-- snip --
CRubyと違い明示的にJSON.parseをしなくてもrfコマンドのjsonサブコマンドを指定すると自動でパースします。
ここで紹介した使い方にも便利な使い方があるので、今後も紹介していきます。
インストール方法
Releaseページからダウンロードできます。
各プラットフォームとアーキテクチャ向けにバイナリファイルを提供しています。
それぞれの対応状況は以下のテーブルを参照してください。
| amd64 | arm64 | |
|---|---|---|
| Linux | ✅ | ✅ |
| MacOS | - | ✅ |
| Windows | ✅ | - |
別の方法として各パッケージマネージャを使ってインストールすることもできます。
mise
mise plugin install rf https://github.com/buty4649/asdf-rf/
mise install rf@latest
mise use -g rf@latest
asdf
asdf plugin install rf https://github.com/buty4649/asdf-rf/
asdf install rf latest
asdf global rf latest
rtx
rtx plugin install rf https://github.com/buty4649/asdf-rf/
rtx install rf@latest
rtx global rf@latest
Homebrew
brew tap buty4649/tap
brew install buty4649/tap/rf
GitHub CLI and k1LoW/gh-setup
# if not installed k1LoW/gh-setup
gh extension install k1LoW/gh-setup
gh setup --repo buty4649/rf --bin-dir ~/.local/bin
-
grepはそこまで難しくないですが ↩︎
Discussion