※この記事は「2021年5月11日」に更新しました。
PowerShell(パワーシェル)講座です。
前回は、引数と受け取る方法を紹介しました。
今回は、grep(グレップ)についてです。
PowerShell でもテキストの grep はできますという記事です。
環境は、Windows 10(64bit)、PowerShell 6.1.2 です。
grep について
grep(グレップ)は、UNIX系(Linux など)で使えるコマンドです。
指定した文字列を検索するときに使うものです。
高機能エディタ(サクラエディタなど)を利用している方は、一度は使ったことがあるのではないでしょうか?
global regular expression print の略と言われています。
Select-String【PowerShellコマンドレット】
PowerShell で grep のような使い方をするコマンドレットは、Select-String です。
コマンドレットの形式は以下の通りです。
Select-String ファイルパス オプション
オプションには、以下のようなものがあります。
- -Path
- ファイルのパスを指定できます。フルパスではなく、ファイル名のみ指定した場合は、カレントディレクトリから検索される。
- -Pattern
- 検索するテキストを文字列または正規表現で指定する。
- -NotMatch
- 指定したパターンに一致しないファイルを検索する。
- -CaseSensitive
- 大文字と小文字を区別する。省略すると区別しない。
カレントディレクトリ内のファイルを検索する
カレントディレクトリ内のファイルを検索する場合、以下のように書きます。
Select-String -path *.txt "検索する文字列"
フルパスでなく、ファイル名のみ指定した場合はカレントディレクトリを検索します。
例としてやってみます。
Select-String -path *.txt "iPhone 11" -Encoding oem
私が書いているブログネタのテキストから iPhone 11 について書いている部分を検索しました。
ちなみに、ワイルドカード(*)も使えるので、今回の場合、カレントディレクトリのテキストファイル全て対象になります。
エンコードを指定しているのは、文字化けしたからです(私が Shift-JIS でテキストを保存しているため)。
OutputEncoding は、UTF-8 になっていました。
oem を指定すると、上手く表示されました。
サブディレクトリ内のファイルも検索する
先程紹介した方法だとサブディレクトリ内までは検索対象になりません。
しかし、サブディレクトリ内も検索してほしい場合がほとんどだと思います。
そんなときは以下のようにやってみましょう。
Get-ChildItem *.txt -Recurse | Select-String "iPhone 11" -Encoding oem
パイプも使っています。
-Recurse を指定すると再帰的に処理してくれます。
これで、サブディレクトリ内も検索します。
最後に
いかがでしょうか。
grep は、プログラマーだと結構使う機会もあるかと思います(PowerShell でやるかは別として)。
シンプルにわりと高速で探してくれるので、使ったことがないという方は一度使ってみて下さい。