Windows 11 PowerShellで grep 相当の検索と diff を行う

Views: 0

Windows 11 で作業していると、Linux で普段使っていた grepdiff に相当する操作を PowerShell ではどう書けばよいか、毎回少し迷う。
特に、ソースコード一式の中から文字列を探したいときや、修正前後のファイル差分を手早く確認したいときは、すぐに思い出せる形で手元に残しておくと便利である。

この記事では、忘備録として次の 2 つをまとめておく。

  • 特定ディレクトリ以下の全ファイルから文字列を検索する方法

  • 2つのファイルの内容差分を確認する方法

Note
PowerShell では、Linux のコマンド名そのものではなく、Get-ChildItemSelect-StringCompare-Object のような「動詞-名詞」形式のコマンドレットを使う。そのため最初は少し長く見えるが、慣れると意図が明確で分かりやすい。

1. grep 相当: ファイル内の文字列を検索する

PowerShell で grep に相当するのは Select-String である。
短縮形の sls も使えるが、忘備録としてはまず正式なコマンド名を覚えておく方が分かりやすい。

現在のディレクトリ以下を再帰的に検索する

現在いるディレクトリの下にあるすべてのファイルを対象に、指定した文字列を探すには次のように書く。

Get-ChildItem -Recurse -File | Select-String -Pattern "探したい文字列"

たとえば、JavaScript ファイル群の中から renderAsciiDoc という文字列を含む箇所を探したいときは、まずこの形を思い出せばよい。

Note
Get-ChildItem -Recurse -File は「配下のファイルをすべて列挙する」、Select-String -Pattern …​ は「その内容から文字列を探す」という役割分担になっている。

特定のディレクトリ配下を検索する

検索対象を明示したい場合は -Path を付ける。

Get-ChildItem -Path "C:\work\project" -Recurse -File | Select-String -Pattern "探したい文字列"

作業フォルダが深い場所にある場合や、カレントディレクトリに依存したくない場合はこちらの方が安全である。

拡張子を限定して検索する

すべてのファイルを対象にするとノイズが多い場合がある。
そのようなときは、たとえば .js ファイルだけに絞ると見やすい。

Get-ChildItem -Path "C:\work\project" -Recurse -File -Filter *.js | Select-String -Pattern "renderAsciiDoc"

HTML や CSS、Python など、対象拡張子を切り替えれば用途は広い。

大文字小文字を区別して検索する

識別子の表記ゆれまで厳密に確認したい場合は -CaseSensitive を付ける。

Get-ChildItem -Recurse -File | Select-String -Pattern "NodeId" -CaseSensitive
Note
PowerShell の文字列検索は正規表現も使える。そのため、単純な文字列検索だけでなく、ある程度複雑なパターン検索にも対応できる。

短く書く場合

短縮エイリアスを使うと、Linux のコマンド感覚に少し近づく。

gci -Recurse -File | sls "探したい文字列"

ただし、久しぶりに見たときに分かりやすいのは正式名の方である。
忘備録や共有資料には、まず正式名を書いておく方が無難だと思う。

2. diff 相当: 2つのファイルの差分を確認する

PowerShell で 2 つのテキストファイルの内容を比較したいときは、Compare-Object を使う。
ファイルをそのまま比較するのではなく、Get-Content で行単位に読み込んで比較する形になる。

基本形

Compare-Object (Get-Content .\file1.txt) (Get-Content .\file2.txt)

これで、2つのファイルのうち、どの行が片方にだけ存在するかを確認できる。

見やすく整形する

出力を少し見やすくしたい場合は、表形式に流す。

Compare-Object (Get-Content .\file1.txt) (Get-Content .\file2.txt) |
Format-Table -AutoSize

表示記号の意味

Compare-Object の結果には、差分の方向を示す記号が付く。

  • : 左側のファイルにだけ存在する行

  • : 右側のファイルにだけ存在する行

つまり、左を修正前、右を修正後として比較すれば、「どの行が消えたか」「どの行が増えたか」をざっくり追える。

Note
Compare-Object は「差分表示専用ツール」というより、「2つのオブジェクト集合の違いを見る」ための PowerShell 的な比較コマンドである。そのため、Linux の diff のような連続した差分表示とは少し感覚が異なる。

具体例

Compare-Object (Get-Content .\before.txt) (Get-Content .\after.txt)

ファイル修正の前後で内容確認をしたいだけなら、まずはこれで十分なことが多い。

3. Git が入っているなら git diff --no-index も便利

PowerShell 標準の Compare-Object は便利だが、Linux の diff や Git の差分表示に慣れていると、少し物足りなく感じることもある。
その場合は、Git がインストールされていれば git diff --no-index が使える。

git diff --no-index .\file1.txt .\file2.txt

これは Git 管理下にない普通の 2 ファイルでも比較でき、追加行・削除行がまとまって表示されるため、とても見やすい。

実際には、ちょっとした確認なら Compare-Object、しっかり差分を読みたいときは git diff --no-index という使い分けでもよいと思う。

Note
--no-index を付けることで、Git 管理外のファイル同士でも比較できる。PowerShell 標準機能ではないが、Git を入れている環境ではかなり実用的である。

4. 最低限覚えておくと便利な3つ

結局のところ、日常的によく使うのは次の 3 つである。

配下の全ファイルから文字列を探す

Get-ChildItem -Recurse -File | Select-String -Pattern "文字列"

2つのファイルを PowerShell 標準で比較する

Compare-Object (Get-Content .\file1.txt) (Get-Content .\file2.txt)

Git 形式で差分を見る

git diff --no-index .\file1.txt .\file2.txt

5. まとめ

Windows 11 の PowerShell でも、Linux で普段使う grepdiff に相当する操作は十分に行える。

grep 相当としては Select-String、再帰的なファイル列挙には Get-ChildItem -Recurse -File、ファイル差分の比較には Compare-Object を使う。
さらに Git が入っていれば、git diff --no-index によって、より見慣れた差分表示も利用できる。

PowerShell は最初こそ少し冗長に見えるが、意味をそのまま表したコマンド名が多いので、使い方を一度整理しておけば意外と忘れにくい。
少なくとも、文字列検索とファイル比較のこの 2 つを押さえておけば、Windows 上の開発作業はかなり楽になる。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です