Powershellでgrep的な操作をする ~ Select-String

スクリプト

Powershellを使って、UNIXのgrepコマンドのようなことをしたい場合のメモ。
UNIXを使用している場合は、GUIはそもそも頭にないのでgrepコマンドを使用していると思いますが、Windowsを使用していると、何故かGUIに頼りがちで秀丸エディタやサクラエディタでgrep検索するケースが多いのではないでしょうか?
人によっては、「Windowsでgrepをコマンド実行できるの?」なんて人もいるかもしれません。

今回はPowershellでUNIXのgrepコマンド的な操作が可能なSelect-Stringコマンドレットについてのトピックです。

Powershellでgrep – Select-Stringコマンドレットについて

Select-Stringコマンドレットは、ファイル内のテキストや文字列の中で、特定の文字列を検索することが出来るコマンドレットです。例えば、aaa.txtというテキストファイルの中で”ssworks”という文字列を含む行を検索したい場合には以下のようにします。

PS C:\>Select-String .\aaa.txt -Pattern ssworks

aaa.txt:3:ssworks are
aaa.txt:5:aaaaaaa SSWORKS

この結果から、aaa.txtの3行目と5行目に”ssworks”が含まれていることが分かります。

Select-Stringの公式リファレンスについてはこちらになりますので、詳しく知りたいかたは公式リファレンスもご参照ください。

Powershellでgrep – Select-Stringで指定可能なマッチングパターン

Select-Stringコマンドレットでは、検索する文字列を指定する際に、様々なパターンを指定可能です。良く利用するパターンについては以下になるかと。

  • 単純パターン(文字列での一致)
  • 正規表現パターン(正規表現を利用したパターン一致)
  • 複数パターン指定(文字列でも正規表現でも可で、or検索になる)
  • 不一致指定(文字列でも正規表現でも可、複数指定も可能(その場合、orのnotなのでnot andになる)
  • 大文字・小文字区別(文字列でも正規表現でも可)

それぞれ、以下のように指定します。

No.パターン指定方法
1単純パターン-Patternパラメータに、検索したい文字列をそのまま指定する
例)Select-String aaa.txt -Pattern ssworks
2正規表現パターン-Patternパラメータに、検索したい正規表現パターンをそのまま指定する
例)Select-String aaa.txt -Pattern ^ssworks
※正規表現について知りたい方は、こちらを参照してみてください。
※正規表現を知ると、やりたいことの幅が広がりますよ
3複数パターン指定-Patternパラメータに、検索したいパターンをカンマ(,)区切りで指定する
例)Select-String aaa.txt -Pattern ^start, end$, ssworks
4不一致指定-NotMatchパラメータを指定する
例)Select-String aaa.txt -Pattern ssworks -NotMatch
5大文字・小文字区別-CaseSensitiveパラメータを指定する
例)Select-String aaa.txt -Pattern ssworks -CaseSensitive

Powershellでgrep – Select-Stringは他のコマンドレットとの組み合わせで、複数ファイル・フォルダを対象にすることも可能

検索対象のファイルが1つのみの場合、検索したいファイルが100ファイルあれば、100回コマンドを実行しなければならなくなります。それは大変面倒ですが、他のコマンドレットとSelect-Stringコマンドレットを組み合わせることで、検索対象のファイル・フォルダを複数指定可能です。
要は、ファイルを返すコマンドレットの結果をSelect-Stringにパイプラインで渡してあげれば良いわけです。例えば、こんな感じです。

PS C:\>Get-ChildItem -Path C:\work\*.txt | Select-String -Pattern ssworks

aaa.txt:3:ssworks are
aaa.txt:5:aaaaaaa SSWORKS
bbb.txt:3:ssworks are
bbb.txt:5:aaaaaaa SSWORKS
PS C:\>Get-ChildItem -Path C:\work\*.txt -Recurse | Select-String -Pattern ssworks

sub\ccc.txt:3:ssworks are
sub\ccc.txt:5:aaaaaaa SSWORKS
aaa.txt:3:ssworks are
aaa.txt:5:aaaaaaa SSWORKS
bbb.txt:3:ssworks are
bbb.txt:5:aaaaaaa SSWORKS

Powershellでgrep – Select-Stringはマッチした行の前後の行も出力可能

-Contextパラメータを指定することで、検索にマッチした行の前後の行も出力することが可能です。

PS C:\> Select-String .\bbb.txt -Pattern ssworks -Context 1,1

  bbb.txt:2:aaaaa
> bbb.txt:3:ssworks are
  bbb.txt:4:
> bbb.txt:5:aaaaaaa SSWORKS
  bbb.txt:6:

この場合、検索にマッチした行には”>”が付加されています。-Contextパラメータに指定する値は、「前後n行」をカンマ区切りで指定します。上記の例だと-Context 1, 1となるので、”検索にマッチした行の前後1行を表示する”という意味になります。

Powershellでgrep – Select-Stringの出力結果はファイル出力やグリッド表示が可能

Select-Stringコマンドレットの実行結果は標準出力に表示されますが、パイプラインで実行結果を他のコマンドレットに渡すことで、

  • ファイル出力
  • グリッド表示

させることが可能です。

ファイル出力

PS C:> Select-String .\bbb.txt -Pattern ssworks | Set-Content .\result.txt
PS C:> Get-Content .\result.txt
C:\bbb.txt:3:ssworks are
C:\bbb.txt:5:aaaaaaa SSWORKS

グリッド表示

PS C:> Select-String .\bbb.txt -Pattern ssworks | Out-GridView
PS C:>

Powershellでgrep – 最後に Select-Stringは使える

今回は、PowershellでUNIXのgrepコマンド的な処理が行えるSelect-Stringコマンドレットのご紹介でした。例えば、「同じようなgrep検索を毎日やってるな~」なんてことがあったら、Select-Stringを使ってスクリプトファイルを作成して毎日実行する。といった活用で、仕事の効率化が出来るかもしれませんね。

Windwosでは、Powershellだけでなく、findstrというWindowsコマンドもあります。機能的にはほぼ同等ですので、利用できる環境やケースによって使い分けることも可能です。
findstrについては、機会があればご紹介したいと思っています。

コメント

タイトルとURLをコピーしました