迭代linux文件ldif

迭代linux文件ldif,linux,unix,ldif,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

我试图为包含特定属性的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并将它们复制到最终文件

你能帮我一下吗

谢谢


考虑到一些非常快速和肮脏的东西,我会选择awk来代替:

#!/usr/bin/env bash awk -F ': ' ' BEGIN { print "uid|cn" } $1 == "uid" { uid = $2 } $1 == "cn" { cn = $2 } /SUKsoft: Windows/ { print uid "|" cn } ' "$@" #!/usr/bin/env bash awk-F':'' 开始{打印“uid | cn”} $1==“uid”{uid=$2} $1==“cn”{cn=$2} /SUKsoft:Windows/{print uid“|”cn} ' "$@" 但上面的内容很粗糙,并且对输入ldif文件中的行结构进行了假设:字段以可用顺序出现(SUKsoft之前的uid和cn条目,等等)

我想这是一个进一步的锻炼

编辑:这样的强化。跟踪一点状态,在条目开始(“dn”)处清除uid和cn变量,仅当同时看到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 } } ' "$@" #!/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解析器。

感谢您的回答,正如您所说,顺序并不总是相同的,因此解决方案无效:(除了处理文件外,我们如何对文件进行排序?第一个解决方案是“有效的”因为它会根据您提供的示例输入生成您期望的输出。如果一般输入更加多样化,您需要给出示例。如果您的输入可能是任意的LDIF,您应该这样说:简单的基于regexp的方法将是不够的。也就是说,我已经编辑了答案,以跟踪稍微更多的状态。