-Pattern にそって文字列やファイルからテキストを抜き出すことができる。
正規表現も利用できるので、今回は "=[02468]"
つまり、イコールのあとに偶数・奇数がくるものをパターンとしてオブジェクトを作り出した。
とりあえず、小難しいことは置いといて、Select-Stringはgrepやfindstrの代わりになり、
正規表現も使用可能だということを覚えとく。
PowerShellを扱う場合、その出力されたオブジェクトはなにかを把握しておくことも重要。
オブジェクトがなんなのかを調べるには、Get-Member(エイリアスはgm)を使うといい。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | gm
TypeName: Microsoft.PowerShell.Commands.MatchInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
RelativePath Method string RelativePath(string directory)
ToString Method string ToString(), string ToString(string directory)
Context Property Microsoft.PowerShell.Commands.MatchInfoContext Conte...
Filename Property System.String Filename {get;}
IgnoreCase Property System.Boolean IgnoreCase {get;set;}
Line Property System.String Line {get;set;}
LineNumber Property System.Int32 LineNumber {get;set;}
Matches Property System.Text.RegularExpressions.Match[] Matches {get;...
Path Property System.String Path {get;set;}
Pattern Property System.String Pattern {get;set;}
今回はSelect-Stringコマンドレッドを使ったことで
Microsoft.PowerShell.Commands.MatchInfo オブジェクトができたわけだ。要素を指定してオブジェクトプロパティを見てみよう。
PS .\sample> $(Select-String -Pattern "=[02468]" .\userlist.txt)[0].lineForeach-Object コマンドはエイリアスで Foreach または % として割り当てられている。
CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local
PS .\sample> $(Select-String -Pattern "=[02468]" .\userlist.txt)[0].linenumber
2
ちなみに、パイプで渡された各オブジェクトは $_ としてわたされる。
同じくプロパティを見てみる。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_.line }2行目の整形前を出力する。
CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=4,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=6,ou=Tokyo,dc=ad-domain,dc=company,dc=local
CN=8,ou=Tokyo,dc=ad-domain,dc=company,dc=local
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_.linenumber }
2
4
6
8
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_ }文字列オブジェクトには -split で区切ることができるので分解。
userlist.txt:2:CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local
userlist.txt:4:CN=4,ou=Tokyo,dc=ad-domain,dc=company,dc=local
userlist.txt:6:CN=6,ou=Tokyo,dc=ad-domain,dc=company,dc=local
userlist.txt:8:CN=8,ou=Tokyo,dc=ad-domain,dc=company,dc=local
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_ -split "," }分解した文字列は配列に格納されているため、1番目のものだけ取り出す。
E:\sample\userlist.txt:2:CN=2
ou=Tokyo
dc=ad-domain
: (略
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $($_ -split",")[0] }同様の手順で"="で区切り、2番目の要素を取り出し、目的のアカウントの部分を取得する・・と。
E:\sample\userlist.txt:2:CN=2
E:\sample\userlist.txt:4:CN=4
E:\sample\userlist.txt:6:CN=6
E:\sample\userlist.txt:8:CN=8
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $($_ -split",")[0] } | % { $($_ -split "=")[1] }----------------------------------------------------------
2
4
6
8
・・・すいません、詳しく説明しようとしたら、逆にわかりにくくなったですね
ここらへんに絵での説明に限界を感じる(笑)
とりあえずForeach-Objectの使い方とGet-Memberを覚えておこうってことで。
スポンサーリンク