読者です 読者をやめる 読者になる 読者になる

Windows で busybox を使う

Windowsgrep/cut/uniq などを手軽に使いたかったので、busybox 使ったメモ。

インストーラではなく実行ファイルのみなので、レジストリも汚さない。


入手先
https://frippery.org/busybox/

busybox.exe」のダウンロードリンクがある。

ダウンロード後、念のため VirusTotal でチェック。

VirusTotal でチェック時に、ハッシュ値も確認する。

自分が入手時は以下のもの。
The latest executable is 419,840 bytes in size. Its sha256sum is:

44493dc69c1f435fe07e47b8fab5602391941cb798eb40d369c7cd47fb82cfba


なお、WindowsPowerShell 4.0以降(Windows 8.1 / 2012 R2以降)なら、次のようにハッシュ値を計算できる。

PS > Get-FileHash .\busybox.exe -Algorithm SHA256


◆使用例

PowerShellまたはコマンドプロンプトにて、以下のようにする。

PS> busybox ls -a
DOS> busybox ls -a


これだと grep を多段にする時なんかに面倒なので、busybox を省略できるようにしたい。

busybox のコマンドのハードリンクを任意のフォルダに作成する。

例えば、E:\test-busybox にコマンド群を展開する場合。

PS> .\busybox --install E:\test-busybox

上記のフォルダ内では、busybox を省略してコマンドを実行できる。

PS E:\test-busybox> ls -a


PowerShellの場合、パイプでgrepやcutを使う場合、下記のようにするとエラーになる。

PS E:\test-busybox> cat access_log | grep -i error
grep : 用語 'grep' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:18
+ cat access_log | grep -i error
+                  ~~~~
    + CategoryInfo          : ObjectNotFound: (grep:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Suggestion [3,General]: コマンド grep は見つかりませんでしたが、現在の場所に存在します。Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。このコマンドを信頼する場合は、".\grep" と入力してください。詳細については、"get-help about_Command_Precedence" と入力してヘルプを参照してください。

メッセージの通り、PowerShellの場合、パイプ以降では .\ を指定する必要がある。

PS E:\test-busybox> cat access_log | .\grep -i error
PS E:\test-busybox> cat access_log | .\grep -i error | .\cut -f 1-5

一方、DOSプロントの場合は、.\ を指定する必要はない。

DOS E:\test-busybox> cat access_log | grep -i error


また、busybox-w32 では、コマンドラインワイルドカードを使用できない。

公式ドキュメントに記載されている。
https://github.com/rmyorston/busybox-w32/blob/master/README.md

Wildcard expansion is disabled by default, though it can be turned on at
compile time. This only affects command line arguments to the binary:
the BusyBox shell has full support for wildcards.