Powershellを使って、UNIXのgrepコマンドのようなことをしたい場合のメモ。
UNIXを使用している場合は、GUIはそもそも頭にないのでgrepコマンドを使用していると思いますが、Windowsを使用していると、何故かGUIに頼りがちで秀丸エディタやサクラエディタでgrep検索するケースが多いのではないでしょうか?
人によっては、「Windowsでgrepをコマンド実行できるの?」なんて人もいるかもしれません。
今回はPowershellでUNIXのgrepコマンド的な操作が可能なSelect-Stringコマンドレットについてのトピックです。
- Powershellでgrep – Select-Stringコマンドレットについて
- Powershellでgrep – Select-Stringで指定可能なマッチングパターン
- Powershellでgrep – Select-Stringは他のコマンドレットとの組み合わせで、複数ファイル・フォルダを対象にすることも可能
- Powershellでgrep – Select-Stringはマッチした行の前後の行も出力可能
- Powershellでgrep – Select-Stringの出力結果はファイル出力やグリッド表示が可能
- Powershellで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については、機会があればご紹介したいと思っています。
コメント