PowerShellでgrep検索する方法

grepとは

  • Unix系のコマンドのひとつ
  • テキストファイルを走査して、指定した正規表現(文字列の集合パターンを定義する形式言語)に一致する場所を探すことができる
  • ディレクトリ配下のすべてのテキストファイルを走査したり、一致した文字列パターンがファイルの何行目にあるのかを探したりもできる

PowerShellでgrepするなら【Select-String】コマンドレットを使う

# 再帰的に(深い階層も含めて)grepするなら
Get-ChildItem -File -Recurse | Select-String "調べたい文字列"

grep検索をSelect-Stringなしでざっくり実装してみる(シンプル版)

  • Q. なぜSelect-Stringがあるのにこんなことを…?
  • A. Select-Stringの存在を知らなかったから

というわけで、Select-Stringなしでgrepっぽいもの自作して使ってました。機能最低限、オプションなんかも無し。申し訳程度に一致行番号を表示しています。

  • コードの説明
    • ディレクトリ配下を再帰的に検索
    • 引数に指定した文字列パターンがあれば、そのファイルの情報を返す(ファイル名と一致した行番号)
  • どんなとき使ってたの?
    • このブログのコードいじるときに、狙った処理の書かれたファイルがどれなのかを調べるために使ってました(SANGO使用. WordPress無知民)
function grep([string]$str) {
  <#
    .SYNOPSIS
    配下ディレクトリに対してざっくりとしたgrep検索をします
    .DESCRIPTION
    再帰的に配下ディレクトリのファイルの中身を正規表現で検索し、ヒットしたファイルのパスと行数を表示します
    結果はオブジェクトとして返却しているので、各種プロパティを参照することもできる
    .PARAMETER str
    grep検索する正規表現
  #>
  Get-ChildItem -Recurse -File | ? {
    (Get-Content $_.FullName) -match $str

  } | % {
    $__ = $_
    $__ | Add-Member -NotePropertyName "hit_lines" -NotePropertyValue (New-Object System.Collections.ArrayList)
    $line = 0
    (Get-Content $__.FullName) | % {
      $line++
      if ((New-Object regex($str)).IsMatch($_)) {
        $__.hit_lines.Add($line)
      }
    }
    $__ | Format-Table -Property "FullName", "hit_lines"
  }
}

grep検索をオプション等含めPowerShellでしっかりと実装してみる(予定)

(そのうちやります)