我正在尝试为包含某些特定属性的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并将它们复制到最终文件。
请你帮我吗?
由于
此致
答案 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解析器。