Muni Bus

パソコンの操作方法や設定方法を忘れないようにメモしています。ブログを一回引っ越ししているので、所々表示がかなり乱れています・・・

【PowerShell】テキストファイルから文字列を検索する

Select-Stringコマンドレットを使う。Select-StringコマンドレットはUNIXのコマンドの一つであるgrepと同じような機能を提供するが、戻り値がMatchInfoオブジェクトのため、grepコマンドのデフォルトの状態とは異なり、マッチした行だけが表示されるわけではないことに注意。マッチした行だけを表示したい場合は、戻り値(MatchInfoオブジェクト)のLineプロパティを参照する。

PS > $lns = "高柳知葉", "大橋彩香", "石見舞菜香", "香坂さき", "和多田美咲"
PS > $lns | Out-File -Encoding default temp.txt
PS > Select-String "香" .\temp.txt -Encoding default
temp.txt:2:大橋彩香
temp.txt:3:石見舞菜香
temp.txt:4:香坂さき
PS > (Select-String "香" .\temp.txt -Encoding default).GetType().FullName
System.Object[]
PS > (Select-String "香" .\temp.txt -Encoding default)[0].GetType().FullName
Microsoft.PowerShell.Commands.MatchInfo
PS > (Select-String -Encoding default "香" .\temp.txt).Line
大橋彩香
石見舞菜香
香坂さき
PS > (Select-String -Encoding default "香$" .\temp.txt).Line
大橋彩香
石見舞菜香
PS > (Select-String -Encoding default "[舞|美]" .\temp.txt).Line
石見舞菜香
和多田美咲
PS > Select-String -Encoding default "[舞|美]" .\temp.txt | % {$_.Line}
石見舞菜香
和多田美咲

UNIXgrepコマンドは、デフォルトでは英文字の大文字と小文字は区別して検索するが、Select-Stringコマンドレットは、デフォルトでは大文字と小文字を区別しないので注意。区別する場合は-CaseSensitiveオプションを付ける。これはいわゆる2バイト文字も同じである。

PS > $s = "ABC", "abc", "123"
PS > ($s | Select-String "AB").Line
ABC
abc
PS > ($s | Select-String "AB" -CaseSensitive).Line
ABC
PS > $s = "ABC", "abc", "ABC", "abc"
PS > ($s | Select-String "AB").Line
ABC
abc
PS > ($s | Select-String "AB" -CaseSensitive).Line
ABC

とあるLinuxgrepを動作させた結果は以下のとおり。

$ cat << EOD > temp.txt
> ABC
> abc
> 123
> ABC
> abc
> EOD
$ cat temp.txt
ABC
abc
123
ABC
abc
$ grep "AB" temp.txt
ABC
$ grep -i "AB" temp.txt
ABC
abc
$ grep "AB" temp.txt
ABC
$ grep -i "AB" temp.txt
ABC
abc