stdout变量。用mktmp,sed,grep等逐行

时间:2009-09-24 16:15:27

标签: bash ldap sed grep

我使用ldapsearch从我的LDAP服务器中获取一些用户。该命令回复如下:

uid: name.surname
homeDirectory: /home/name
sambaSID: S-1-4-32-224545876-87201423761-4821562975-6853
sambaHomeDrive: G:
description: poI
description: pPI
sn: naut
givenName: givenName: peter
mail: mymail@example.com

现在我想将“:”之后的每个字符串分配给一个变量(两个描述可能是一个数组?通过sambaSID我只需要最后一个块(在这种情况下为6853 [可能更长或更短])。

任何帮助都会非常感激。在这里,我尝试使用mktmp,sed,grep和许多丑陋的if语句。我没有其他想法...... http://dpaste.com/97693/

4 个答案:

答案 0 :(得分:1)

如果你有bash,它就比你简单得多了。


#!/bin/bash
while read line ; do
        n="${line%%:*}"
        v="${line#*: }"
        eval $n=\"$v\"
done
sambaSID=${sambaSID/*-/}

$ ldapsearch | this_script.sh

此时满足所有要求,并且您具有以每个ldiff属性命名的局部变量。这不是一个好主意。

答案 1 :(得分:0)

我的贡献考虑多个键(如描述)并附加相应的值(以换行符分隔)。

您可以在keys命令中使用${keys[@]}作为ldapsearch,而不是$OUTPUT

我宁愿使用关联数组,但是直到bash 4.0才会引入它们。所以我使用数组来获取键和值,并需要一个函数来检查键是否存在。

...

keys=(uid homeDirectory sambaSID sambaHomeDrive description sn givenName mail)
declare -a values
i=0

...

index () {
    for ((x=0; x < ${#keys[@]}; x++)); do
        if [ "$1" == "${keys[$x]}" ]; then
            echo $x; return
        fi
    done
    echo -1
}

exec 5<> $LDIF
while read <&5 LINE
do
    key="${LINE%%:*}"
    value="${LINE#$key: }"
    x=`index $key`
    [ "$x" == -1 ] && x=$((i++)) || v="${values[$x]}"
    [ "$key" == "sambaSID" ] && value="${value##*-}"
    values[$x]="${v:+$v
}$value"
done

for ((x=0; x < ${#keys[@]}; x++)); do
    echo "${keys[$x]}: ${values[$x]}"
done

echo "Mail is ${values[`index 'mail'`]}."

答案 2 :(得分:0)

感谢您的帮助。 :)

来自andre-r的解决方案最适合。但有一个问题。这是脚本的输出:

script.sh:第29行:[:==:一元运算符预期 uid:uid = name.surname,ou = Users,dc = smb,dc = chname.surname homeDirectory的: sambaSID:8426 sambaHomeDrive:G: 描述:p9o sn:martheus givenName:name mail:myemail@example.com

所以uid不对,sambaHomeDrive没有解决。无法修复它。 :/

但是非常感谢你的帮助!

答案 3 :(得分:0)

如果您不关心重复键,并假设第一个“:”左侧的所有内容都是字母数字,右侧没有任何内容包含单引号,则以下内容将执行:

while read line; do
  eval $(echo "$line" | sed 's/^\([^:]\+\):[ ]\+\(.*\)/\1='"'"'\2'"'/")
done

echo "uid is $uid, home directory is $homeDirectory."

如果你真的需要保留重复的密钥,那么修改它来支持它就不会太难。当然,“eval”可能是危险的,因为它已经被指出,但如果上述假设成立(“:”右边没有单引号),这种用法是安全的。