亀の甲羅2

今日もまた朝とく起きて励まなん窓に明るきありあけの月

【powershell】テキストのGrep (Select-String )

sakuraエディタのGrepは手放せないものの一つであるが、もう少しシビアな環境(出先のサーバとか、サードパーティアプリケーションのインストールがポリシーで許可されていない環境など)でGrepするにはどうすれば良いかを探ってみた。

目次

本文

1. GrepならSelect-String(SLS)でしょ

# 単なるGrep例
Select-String -Pattern "Invoke-Web" -Encoding default -Path "*.ps1"

# ※カレントフォルダのみ。サブフォルダをリカーシブに検索はしてくれない。

2. サブフォルダも検索対象とする場合、Get-ChileItemを使用

# 記法1
$a = Get-ChildItem -Recurse -Path "D:\Git" -Filter *.ps1

$a | Select-String -Pattern "Invoke-Web" -Encoding default

# ※もちろん1行で書いてもOK

もう一つの書き方。

# 記法2
Select-String -Pattern "Invoke-Web" -Encoding default -Path (Get-ChildItem -Recurse D:\Git -Filter "*.ps1")

<結果例>

Git\a_powershell\get-issue-FromRedmine.ps1:18:    $a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json'
Git\a_powershell\get-projects-FromRedmine.ps1:6:$a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json'
Git\a_powershell\get-queries-FromRedmine.ps1:14:    $a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json'
Git\a_powershell\get-users-FromRedmine.ps1:17:    $a = Invoke-WebRequest $url -Headers $headers -Method GET -ContentType 'application/json'

3. 対象となるファイルのフルパスのみを取得

残念なことにSelect-String はオブジェクト返却ではない数少ないコマンドレット。
自分で出力結果を加工する旧来のLinuxコマンドのようなことをしなくてはいけない。

# サンプル
$b = Get-ChildItem -Recurse -Path "D:\Git" -Filter *.ps1 | SLS -Pattern "Invoke-Web" -Encoding default

$b | %{JOIN-PATH ($_.ToString().Split(":")[0] + ":") $_.ToString().Split(":")[1]}

どうやら、結果を":"でsplitにかけると[0]にドライブレター、[1]にそれ以降のパスが格納されるようなのでJOIN-PATHで結合(恐らく、「D:\xxx\xxx.ps1」が「:」でsplitされてしまっているのだろう)。

<結果例>

D:\Git\a_powershell\get-issue-FromRedmine.ps1
D:\Git\a_powershell\get-projects-FromRedmine.ps1
D:\Git\a_powershell\get-queries-FromRedmine.ps1
D:\Git\a_powershell\get-users-FromRedmine.ps1

あとは、この情報を煮るなり焼くなりご自由に。


バージョン情報

> $PSVersionTable

Name                           Value                                                                                                          
----                           -----                                                                                                          
PSVersion                      5.1.19041.1023