Parsing output

Hi; I have a command to obtain all the groups a user is part of. The
command is:
dsquery user domainroot -samid | dsget user -memberof -
expand

The output is:
“CN=Domain Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com”
“CN=DA-C3-AB-AB1-SERVER-DATA-CHANGE,OU=ACL_Groups,OU=Groups,OU=ABC,DC=
testdc,DC=testroot,DC=test,DC=com”

I need to obtain the group name From after CN= until the first comma.
I tried scan and match. I can’t get it right.

anon1m0us wrote:

I need to obtain the group name From after CN= until the first comma.
I tried scan and match. I can’t get it right.

I’m not sure I understand you correctly, but is this what you’re looking
for:

irb(main):008:0> mystring = “CN=test,blasdhlfkasjdlfjkCN=test1,balkjdf”
=> “CN=test,blasdhlfkasjdlfjkCN=test1,balkjdf”
irb(main):009:0> mystring.scan(/CN=([^,]*),/)
=> [[“test”], [“test1”]]

-Drew

anon1m0us wrote:

I need to obtain the group name From after CN= until the first comma.
I tried scan and match. I can’t get it right.

irb(main):001:0> output = “CN=Domain
Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com”

irb(main):006:0> output.split(’,’)
=> [“CN=Domain Users”, “CN=Users”, “DC=testdc”, “DC=testroot”,
“DC=test”, “DC=com”]

irb(main):008:0> output.split(’,’).grep(/CN=/)
=> [“CN=Domain Users”, “CN=Users”]

irb(main):009:0> output.split(’,’).grep(/CN=/).collect{|a| a=~/CN=(.*)/;
$1}
=> [“Domain Users”, “Users”]

You can do what you want with the final array.

The final collect part of the last line is a bit cryptic. Others may
follow
with more elegant ways of doing this.

Martin

On 5/17/07, anon1m0us [email protected] wrote:

I need to obtain the group name From after CN= until the first comma.
I tried scan and match. I can’t get it right.

If you want it at the beginning, this would be better than my first
suggestion.

str = “CN=Domain Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com”
str =~ /^CN=(.*?),/
p $1

Harry

A Look into Japanese Ruby List in English
http://www.kakueki.com/

On 5/17/07, anon1m0us [email protected] wrote:

I need to obtain the group name From after CN= until the first comma.
I tried scan and match. I can’t get it right.

Is this what you are looking for?

str = “CN=Domain Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com”
str =~ /CN=(.*?),/
p $1

Harry

A Look into Japanese Ruby List in English
http://www.kakueki.com/

Drew O. wrote:

irb(main):009:0> mystring.scan(/CN=([^,]*),/)
=> [[“test”], [“test1”]]

I have a question after studying my own solution for the ruby-wise :slight_smile:
Why does this scan return an array of arrays rather than a simple array
of matches? I suppose the OP should really do this if he wants the
matches:

mystring.scan(/CN=([^,]*),/).flatten

Why is this flatten necessary? I’m assuming I did something dopey in my
code.

-Drew

On 5/17/07, Drew O. [email protected] wrote:

Why is this flatten necessary? I’m assuming I did something dopey in my
code.

-Drew


Posted via http://www.ruby-forum.com/.

I think it is because of the parentheses. Try removing them and take a
look.

Harry

A Look into Japanese Ruby List in English
http://www.kakueki.com/

Drew O. wrote:

I have a question after studying my own solution for the ruby-wise :slight_smile:
Why does this scan return an array of arrays rather than a simple array
of matches?

If you don’t use groups within your regexp, scan will just return an
array
with the matched strings. If you do however, it will return an array of
arrays, each array containing one string per matched group.
Example:

“la=lu,lipp=lapp,slipp=slapp”.scan(/\w+=\w+/)
=> [“la=lu”, “lipp=lapp”, “slipp=slapp”]

“la=lu,lipp=lapp,slipp=slapp”.scan(/(\w+)=(\w+)/)
=> [[“la”, “lu”], [“lipp”, “lapp”], [“slipp”, “slapp”]]

HTH,
Sebastian H.

Sebastian H. wrote:

Drew O. wrote:

I have a question after studying my own solution for the ruby-wise :slight_smile:
Why does this scan return an array of arrays rather than a simple array
of matches?

If you don’t use groups within your regexp, scan will just return an
array
with the matched strings. If you do however, it will return an array of
arrays, each array containing one string per matched group.
Example:

“la=lu,lipp=lapp,slipp=slapp”.scan(/\w+=\w+/)
=> [“la=lu”, “lipp=lapp”, “slipp=slapp”]

“la=lu,lipp=lapp,slipp=slapp”.scan(/(\w+)=(\w+)/)
=> [[“la”, “lu”], [“lipp”, “lapp”], [“slipp”, “slapp”]]

HTH,
Sebastian H.

Thanks, that makes perfect sense. Incidentally, I did only want the
results of the grouping returned, however now I understand the rational
behind the array of arrays. Very helpful as always.

-Drew

On 16.05.2007 17:19, Martin P. wrote:

“DC=test”, “DC=com”]
The final collect part of the last line is a bit cryptic. Others may
follow with more elegant ways of doing this.

A variation:

irb(main):018:0* output = “CN=Domain
Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com”
=> “CN=Domain Users,CN=Users,DC=testdc,DC=testroot,DC=test,DC=com”
irb(main):019:0> output.split(/,/).map {|s| s[/^CN=(.)$/, 1]}
=> [“Domain Users”, “Users”, nil, nil, nil, nil]
irb(main):020:0> output.split(/,/).map {|s| s[/^CN=(.
)$/, 1]}.compact
=> [“Domain Users”, “Users”]
irb(main):021:0> output.split(/,/).map! {|s| s[/^CN=(.*)$/, 1]}.compact!
=> [“Domain Users”, “Users”]

Or, probably a bit more efficient

irb(main):023:0> output.split(/,/).inject([]) {|ar,s| x=s[/^CN=(.*)$/,
1] and ar << x;ar}
=> [“Domain Users”, “Users”]

Or, with enumerator

irb(main):032:0> output.to_enum(:scan, /(?:\A|,)CN=([^,]*)/).map {|m|
m[0]}
=> [“Domain Users”, “Users”]

A more generic approach would first extract all the information from the
record and then select the piece wanted:

irb(main):037:0> data = output.to_enum(:scan,
/(?:\A|,)([^=]+)=([^,])/).
irb(main):038:0
inject(Hash.new {|h,k| h[k]=[]}) {|ha,m| ha[m[0]] <<
m[1];ha}
=> {“CN”=>[“Domain Users”, “Users”], “DC”=>[“testdc”, “testroot”,
“test”, “com”]}
irb(main):039:0> data[“CN”]
=> [“Domain Users”, “Users”]

Ok, I have too much time today… :slight_smile:

Kind regards

robert