Parsing output

A

anon1m0us

Hi; I have a command to obtain all the groups a user is part of. The
command is:
dsquery user domainroot -samid <user name> | 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.
 
D

Drew Olson

anon1m0us said:
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
 
M

Martin Portman

anon1m0us said:
Hi; I have a command to obtain all the groups a user is part of. The
command is:
dsquery user domainroot -samid <user name> | 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.


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
 
H

Harry Kakueki

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
 
H

Harry Kakueki

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
 
D

Drew Olson

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

I have a question after studying my own solution for the ruby-wise :)
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
 
H

Harry Kakueki

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

I have a question after studying my own solution for the ruby-wise :)
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
I think it is because of the parentheses. Try removing them and take a look.

Harry
 
S

Sebastian Hungerecker

Drew said:
I have a question after studying my own solution for the ruby-wise :)
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=
=20
with the matched strings. If you do however, it will return an array of=20
arrays, each array containing one string per matched group.
Example:
"la=3Dlu,lipp=3Dlapp,slipp=3Dslapp".scan(/\w+=3D\w+/) =3D> ["la=3Dlu", "lipp=3Dlapp", "slipp=3Dslapp"]
"la=3Dlu,lipp=3Dlapp,slipp=3Dslapp".scan(/(\w+)=3D(\w+)/)
=3D> [["la", "lu"], ["lipp", "lapp"], ["slipp", "slapp"]]


HTH,
Sebastian Hungerecker
=2D-=20
NP: Dornenreich - Zu Tr=C3=A4umen wecke sich, wer kann
Ist so, weil ist so
Bleibt so, weil war so
 
D

Drew Olson

Sebastian said:
Drew said:
I have a question after studying my own solution for the ruby-wise :)
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 Hungerecker

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
 
R

Robert Klemme

anon1m0us said:
Hi; I have a command to obtain all the groups a user is part of. The
command is:
dsquery user domainroot -samid <user name> | 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.


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.

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... :)

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,816
Latest member
nipsseyhussle

Latest Threads

Top