2010/03/22

Select-String その他。

Select-Stringコマンドレッドは、
-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].line
CN=2,ou=Tokyo,dc=ad-domain,dc=company,dc=local

PS .\sample> $(Select-String -Pattern "=[02468]" .\userlist.txt)[0].linenumber
2
Foreach-Object コマンドはエイリアスで Foreach または % として割り当てられている。
ちなみに、パイプで渡された各オブジェクトは $_  としてわたされる。
同じくプロパティを見てみる。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_.line }
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
 2行目の整形前を出力する。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_ }

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
 文字列オブジェクトには -split で区切ることができるので分解。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $_ -split "," }
E:\sample\userlist.txt:2:CN=2
ou=Tokyo
dc=ad-domain
: (略
 分解した文字列は配列に格納されているため、1番目のものだけ取り出す。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $($_ -split",")[0] }
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
 同様の手順で"="で区切り、2番目の要素を取り出し、目的のアカウントの部分を取得する・・と。
PS .\sample> Select-String -Pattern "=[02468]" .\userlist.txt | % { $($_ -split",")[0] } | % { $($_ -split "=")[1] }
2
4
6
8
 ----------------------------------------------------------
・・・すいません、詳しく説明しようとしたら、逆にわかりにくくなったですね
ここらへんに絵での説明に限界を感じる(笑)
とりあえずForeach-Objectの使い方とGet-Memberを覚えておこうってことで。

スポンサーリンク

スポンサーリンク