0

我试图为包含某些特定属性的 ldif 文件检索一些用户。

输入文件将如下所示:

# entry-id: 2
dn: uid=xxx,ou=xx,cn=xx,o=xx,c=xx,o=xx
uid: xxx
cn: Paul
SUKsoft: Windows
SUKsoft: Linux
...
# entry-id: 3
dn: uid=yyy,ou=yy,cn=yy,o=yy,c=yy,o=yy
uid: yy
cn: Jones
SUKsoft: Windows
...

# entry-id: 3
dn: uid=zzz,ou=zz,cn=zz,o=zz,c=zz,o=zz
uid: zz
cn: John
SUKsoft: Linux
...
# entry-id: 4
dn: uid=www,ou=ww,cn=ww,o=ww,c=ww,o=ww
uid: ww
cn: John2

...
# entry-id: 5
dn: uid=mmm,ou=mm,cn=mm,o=mm,c=mm,o=mm
uid: mm
cn: John3
SUKsoft: Linux
...

结果文件应过滤具有 SUKsoft: Windows 属性的用户:

uid|cn
xx|Paul
yy|Jones

我对 linux shell bash 没有太多经验,我正在尝试首先读取迭代文件以获得 suksoft 和 uid 属性广告,然后再次对其进行重新处理以组合最终文件,使用下面的 SUKsoft 获取 uid:

cat 1.txt | while read line
do
   egrep -w  '^uid|SUKsoft' $line > output.txt
done

现在输出看起来像:

uid: xxx
SUKsoft: Windows
SUKsoft: Linux
uid: yy
SUKsoft: Windows
uid: zz
SUKsoft: Linux
uid: ww
uid: mm
SUKsoft: Linux

现在我想处理文件获取 uid 行,直到我有一个 SUKsoft: Windows 并将它们复制到最终文件中。

你能帮我吗?

谢谢

问候

4

1 回答 1

0

对于一些非常快速和肮脏的东西,我会选择awk

#!/usr/bin/env bash

awk -F':''
    开始{打印“uid|cn”}
    $1 == "uid" { uid = $2 }
    $1 == "cn" { cn = $2 }
    /SUKsoft: Windows/ { 打印 uid "|" cn }
' "$@"

但以上内容是粗略的,并且对输入 ldif 文件中的行结构做出了假设:以可用顺序出现的字段(SUKsoft 之前的 uid 和 cn 条目等)。

我猜,硬化留下了进一步的练习。

编辑:一种这样的硬化。跟踪一点状态,在条目开始时清除 uid 和 cn 变量(“dn”),仅在看到 uid 和 cn 时打印 SUKsoft: Windows 条目。

#!/usr/bin/env bash

awk -F':''
    开始{打印“uid|cn”}
    $1 == "dn" { uid = cn = "" }
    $1 == "uid" { uid = $2 }
    $1 == "cn" { cn = $2 }
    /SUKsoft: Windows/ { if (uid != "" && cn != "") { print uid "|" cn } }
' "$@"

请注意,如果预计像这样的粗略方法可以处理任意 LDIF,则应该简单地放弃这些方法并使用 LDIF 解析器。

于 2015-07-09T21:15:25.563 回答