【问题标题】:stdout to variable. with mktmp, sed, grep, etc. line by line标准输出到变量。用 mktmp、sed、grep 等逐行
【发布时间】:2010-12-01 03:48:00
【问题描述】:

我使用 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/

【问题讨论】:

    标签: bash ldap sed grep


    【解决方案1】:

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

    您可以在ldapsearch 命令中使用keys 作为${keys[@]} 而不是$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】:

      感谢您的所有帮助。 :)

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

      script.sh:第 29 行:[: ==: 应为一元运算符 uid: uid=name.surname,ou=Users,dc=smb,dc=chname.surname 主目录: 桑巴SID:8426 sambaHomeDrive: G: 描述:p9o sn: 马修斯 给定名称:名称 邮件:myemail@example.com

      所以 uid 不正确并且 sambaHomeDrive 没有解析。无法修复它。 :/

      但非常感谢您的帮助!

      【讨论】:

      • 对不起,我的错。我更新了答案。将变量括在 "" 中总是一个好主意。
      • 没用。但真的非常感谢您的帮助:) uid 是 uid=name.nname,ou=Users,dc=aksa,dc=chname.nname。邮件是 mymail@example.com。 homeDirectory 是。
      • 我在上面的行中使用了您的代码 1:1。无法访问代码 atm。对不起。但我用 dz 代码的编辑版本解决了我的问题。谢谢
      【解决方案3】:

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

      而读线;做 eval $(echo "$line" | sed 's/^\([^:]\+\):[ ]\+\(.*\)/\1='"'"'\2'"'/ ") 完毕 echo "uid 是 $uid,主目录是 $homeDirectory。"

      如果您确实需要保留重复的键,修改它以支持它不会太难。当然,正如已经指出的那样,“eval”可能很危险,但如果上述假设成立(“:”右侧没有单引号),这种用法是安全的。

      【讨论】:

        【解决方案4】:

        如果你有 bash,这比这简单得多,你可能会这样做。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-28
          • 2014-12-17
          • 2016-01-31
          • 2018-03-27
          • 1970-01-01
          • 2011-02-17
          相关资源
          最近更新 更多