PowerShell では Select-String コマンドが grep に相当します。
目次
基本的な使い方
ファイル内を検索するには以下のように使います。
Select-String -Pattern "検索文字列" -Path "ファイル名.txt"
省略形は sls "検索文字列" "ファイル名.txt" です。
よく使うオプション
大文字小文字を区別しない場合は -CaseSensitive:$false を追加します。
Select-String -Pattern "error" -Path "*.log" -CaseSensitive:$false
一致しない行を表示(grep -v 相当)は -NotMatch を使います。
Select-String -Pattern "error" -Path "*.log" -NotMatch
前後の行も表示(grep -C 相当)は -Context を使います。
Select-String -Pattern "error" -Path "*.log" -Context 2,2
再帰的にディレクトリ検索(grep -r 相当)はこのようにします。
Get-ChildItem -Recurse -Filter "*.log" | Select-String -Pattern "error"
パイプラインとの組み合わせ
コマンド出力を grep するには以下のようにします。
Get-Process | Select-String "chrome"
ファイル内容をパイプで渡す場合はこうです。
Get-Content "app.log" | Select-String "ERROR"
結果からファイル名だけ取り出す場合はこうです。
Get-ChildItem -Recurse *.txt | Select-String "TODO" | Select-Object -Unique Path
オブジェクトを絞り込む
PowerShell のオブジェクトを絞り込むには Where-Object を使います。基本的な構文は次のとおりです。
Get-Service | Where-Object { $_.プロパティ -演算子 "値" }
# 省略形
Get-Service | Where { $_.Name -like "*print*" }
# さらに省略
Get-Service | ? { $_.Name -like "*print*" }
Get-Service での実例
# 名前で絞り込む
Get-Service | Where-Object { $_.Name -like "*print*" }
# 実行中のサービスだけ
Get-Service | Where-Object { $_.Status -eq "Running" }
# 停止中のサービスだけ
Get-Service | Where-Object { $_.Status -eq "Stopped" }
# 名前が W で始まる実行中サービス
Get-Service | Where-Object { $_.Name -like "W*" -and $_.Status -eq "Running" }
比較演算子一覧
| 演算子 | 意味 | grep との対応 |
|---|---|---|
| -eq | 等しい | ^value$ |
| -ne | 等しくない | grep -v 相当 |
| -like | ワイルドカード一致 | grep 相当 |
| -notlike | ワイルドカード不一致 | grep -v 相当 |
| -match | 正規表現一致 | grep -E 相当 |
| -notmatch | 正規表現不一致 | grep -Ev 相当 |
| -gt | より大きい | — |
| -lt | より小さい | — |
必要なプロパティだけ表示する(Select-Object)
Where-Object で絞り込んだ後、Select-Object で列を絞れます。
# 名前とステータスだけ表示
Get-Service |
Where-Object { $_.Status -eq "Running" } |
Select-Object Name, Status
# 上位10件だけ
Get-Service |
Where-Object { $_.Status -eq "Running" } |
Select-Object -First 10 Name, Status
grep との使い分けまとめ
# grep 的な文字列検索(テキスト)
Get-Service | Select-String "print"
# オブジェクトのプロパティで絞り込む(PowerShell らしい方法)
Get-Service | Where-Object { $_.Name -match "print" }
Select-String はテキストとして検索、Where-Object はオブジェクトのプロパティで絞り込むという使い分けが基本です。PowerShell らしい使い方は Where-Object です。