迭代linux文件ldif

时间:2015-07-09 15:34:16

标签: linux unix ldif

我正在尝试为包含某些特定属性的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属性ad然后再次重新处理组件最终文件只获得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行ultil我有一个SUKsoft:Windows并将它们复制到最终文件。

请你帮我吗?

由于

此致

1 个答案:

答案 0 :(得分:0)

对于非常快速和肮脏的事情,我会选择awk

#!/usr/bin/env bash

awk -F ': ' '
    BEGIN               { print "uid|cn" }
    $1 == "uid"         { uid = $2 }
    $1 == "cn"          { cn  = $2 }
    /SUKsoft: Windows/  { print uid "|" cn }
' "$@"

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

我认为,强化是一种进一步的锻炼。

编辑:一个这样的强化。跟踪一些状态,在入口开始时清除uid和cn变量(“dn”),只有在看到uid和cn时才打印SUKsoft:Windows条目。

#!/usr/bin/env bash

awk -F ': ' '
    BEGIN               { print "uid|cn" }
    $1 == "dn"          { uid = cn = "" }
    $1 == "uid"         { uid = $2 }
    $1 == "cn"          { cn  = $2 }
    /SUKsoft: Windows/  { if (uid != "" && cn != "") { print uid "|" cn } }
' "$@"

请注意,如果希望这样的原始方法能够处理任意LDIF,那么应该放弃这些方法并使用LDIF解析器。