gpt4 book ai didi

bash - 使用 bash 解析 ldapsearch 的输出

转载 作者:行者123 更新时间:2023-12-04 07:15:58 24 4
gpt4 key购买 nike

我最近编写了一个 bash 脚本,它必须解析 ldapsearch 结果的输出。该脚本有效,但我想有一种更有效的方法来实现这一点。
该脚本执行 ldapsearch 命令,该命令输出多行格式的多条记录。每条记录由一个空行分隔。我最终做的是以下内容:

  • 在每行末尾添加一个分隔符
  • 将字符串 'DELIM' 添加到空行
  • 修剪所有新行
  • 将“DELIM”替换为新行

  • 这有效地将 ldapsearch 的多行输出转换为多行分隔值。然后我使用 cut 两次来解析行(一次拆分分隔符,然后再次吐出 ldap 结果的输出)
    这是代码:
    while IFS= read -r line ; do
    dn=$(echo "$line" | cut -d '#' -f 1 | cut -d " " -f 2)
    uid=$(echo "$line" | cut -d '#' -f 2 | cut -d " " -f 2)
    uidNumber=$(echo "$line" | cut -d '#' -f 3 | cut -d " " -f 2)
    gidNumber=$(echo "$line" | cut -d '#' -f 4 | cut -d " " -f 2)

    # Code emitted since it's not relevant

    done < <(ldapsearch -x -H "$ldap_server" -D 'cn=Directory Manager' -w $ds_password -b "$searchbase" -LLL uid uidNumber gidNumber | sed 's/$/#/g' | sed 's/^#$/DELIM/g' | tr -d '\n' | sed 's/DELIM/\n/g')
    ldapsearch 命令的输出如下
    dn: uid=userone,ou=People,dc=team,dc=company,dc=local
    uid: userone
    uidNumber: 5000
    gidNumber: 5000

    dn: uid=usertwo,ou=People,dc=team,dc=company,dc=local
    uid: usertwo
    uidNumber: 5001
    gidNumber: 5001
    有没有更有效的方法来实现这一点?特别是不广泛使用管道的一种?

    最佳答案

    假设:

  • ldapsearch 数据不包含空格
  • 将数据重新格式化为单行(通过 OP 的当前代码或通过 jotne 的答案)包括替换 #带空格的分隔符 ( )

  • 使用空格(而不是 # )作为分隔符,我们重新格式化了以下 ldapsearch数据(8x 空格分隔的字段):
    dn: uid=userone,ou=People,dc=team,dc=company,dc=local uid: userone uidNumber: 5000 gidNumber: 5000
    dn: uid=usertwo,ou=People,dc=team,dc=company,dc=local uid: usertwo uidNumber: 5001 gidNumber: 5001
    while read可以修改操作以在每次通过 $(echo|cut|cut) 时消除(当前)12x 子进程调用(4x while)循环,例如:
    while read -r _ dn _ uid _ uidNumber _ gidNumber
    do
    echo "############"
    echo ".$dn."
    echo ".$uid."
    echo ".$uidNumber."
    echo ".$gidNumber."
    done < <(ldapsearch ... | other_code_to_reformat_ldapsearch_data_as_single_lines_but_with_space_delimiter)
    备注:
  • _是我们不关心的字段的虚拟占位符
  • 句点 ( . ) 添加到 echo作为视觉分隔符的语句

  • 这会产生:
    ############
    .uid=userone,ou=People,dc=team,dc=company,dc=local.
    .userone.
    .5000.
    .5000.
    ############
    .uid=usertwo,ou=People,dc=team,dc=company,dc=local.
    .usertwo.
    .5001.
    .5001.

    另一个 awk重新格式化 ldapsearch 的想法结果只输出我们感兴趣的字段:
    awk '{for (i=2;i<=NF;i=i+2) {printf (i==2 ? "" : " ") $i}; print ""}' RS= ORS='\n'
    在哪里:
  • 我们重复使用 jotne 的 RS/ORS设置
  • (i=2;i<=NF,i=i+2) - 只打印偶数字段

  • 这会产生:
    uid=userone,ou=People,dc=team,dc=company,dc=local userone 5000 5000
    uid=usertwo,ou=People,dc=team,dc=company,dc=local usertwo 5001 5001
    通过此更改(4x 空格分隔字段而不是 8x 空格分隔字段),建议的 while read变成:
    while read -r dn uid uidNumber gidNumber
    do
    ....
    done < <(ldapsearch ... | awk '{for (i=2;i<=NF;i=i+2) {printf (i==2 ? "" : " ") $i}; print ""}' RS= ORS='\n')

    关于bash - 使用 bash 解析 ldapsearch 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68763528/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com