【作成中】PowershellでGrepのような操作

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 です。

よかったらシェアしてね!
  • URLをコピーしました!
目次