2

我不是一个经验丰富的 shell 脚本编写者,所以我希望得到一些专家的帮助!

我们在遍历 UID 的 for 循环中使用以下命令:

ldapsearch -x -H ldaps://ldap-purple.example.com -b ou=People,dc=example,dc=com uid=jdoe

此命令产生如下记录:

# extended LDIF
#
# LDAPv3
# base <ou=People,dc=example,dc=com> with scope subtree
# filter: uid=jdoe
# requesting: ALL
#

# jdoe, people, example.com
dn: uid=jdoe,ou=people,dc=example,dc=com
cn: John Doe
homeDirectory: /afs/rats.example.com/users/t/jdoe
loginShell: /bin/bash
objectClass: posixAccount
uid: jdoe
uidNumber: 9239
gidNumber: 100002

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

我想做的是能够 grep 或 awk(或其他)然后在同一行上生成 'cn'、'uid' 和 'uidNumber',即

John Doe, jdoe, 9239

但是,我不确定可以使用什么工具来创建它。

提前感谢您的帮助!

干杯,丹

4

3 回答 3

2

是的,用 awk 很容易。鉴于您说这是在循环中运行,我正在草拟一个带有基本循环的解决方案,它可能与您正在做的事情相匹配,也可能不匹配。希望您会看到如何适应您的确切需求。

while read ou dc1 dc2 uid ; do
    dapsearch -x -H ldaps://ldap-purple.example.com -b ou="$ou",dc1="$dc1",dc="$dc2" uid="$uid" \
    | gawk -F":" '
        $1=="cn" { cn = $2; sub(/^  */,"", cn); next}
        $1=="uid" { uid = $2; sub(/^  */,"", uid);next}
        $1=="uidNumber" { uidNumber = $2; sub(/^  */,"", uidNumber );next}

        # ... etc
        END {
           printf("%s,%s,%s\n", cn,uid,uidNumber)
        }           
    '
done < /path/to/ldap_lookup.lst

输出

John Doe,jdoe,9239

(使用上面的示例记录作为输入)

如果由于某种原因您想要记录中的前导空格,请取出sub()cmds。

我没有 ldapsearch 可以测试。如果您收到错误消息,gawk 可以很好地显示问题所在,如果它不是准确识别问题点的位置,那么通常在此之前。将错误消息作为评论发布,我会看看我能做什么。

IHTH

于 2012-09-08T16:14:11.600 回答
1

感谢您的回答,我会尝试所有的!

在看到您的回复之前,我将以下内容一起废弃,虽然丑陋,但可以解决问题:

ldapsearch -x -H ldaps://ldap-purple.example.com -b ou=People,dc=example,dc=com uid=$i | awk -F': ' '/uid:/ {ORS=",";print $2} /uidNumber/ {ORS="\n";print $2} /cn/ {ORS=",";split ($2,fields,"-"); print fields[1]}'
于 2012-09-09T00:29:16.540 回答
1
awk 'BEGIN { RS = "gidNumber: [0-9]+" ; FS = "\n" ; OFS=","}
{ for (i=1;i<=NF;i++) { 
       if ($i ~ "^cn: ") { cn=gensub("^cn: ","","g",$i) }
       if ($i ~ "^uidNumber: ") { uidNum=gensub("^uidNumber: ","","g",$i) }
       if ($i ~ "^uid: ") { uid=gensub("^uid: ","","g",$i) }
      }
  if ( cn > "" && uid > "" && uidNum > "" ) {
       print cn, uid, uidNum
      }
  cn="" ; uid="" ; uidNum=""
}' INPUTFILE

可能对你有用。在 ideone.com 上查看它的实际效果(我已经添加了一条测试记录)。

于 2012-09-08T18:03:47.930 回答