我正在寻找解析 LDAP 查询的输出。我想要检索正在打印的 DN 中的特定 OU 值
dn: ObjectName=Value,ou=12,ou=Users,dc=example,dc=com
我正在检索 3 个属性值,但我只想将 ou=[\d]{1,2} 作为我要打印的 DN 的一部分进行打印。下面是我的代码示例,它给出了完整的 DN:
<LDAP SEARCH QUERY> | awk -F': ' '/dn: /{dn=$2}/^Attribute1: /{Attribute1=$2}/^Attribute2: /{print dn","Attribute1","$2}'
我不确定如何解析示例中的 ou=12 。我尝试了几种不同的但没有成功。我想使用 Awk 来执行此操作,因为这将被移植到多个系统,而 perl/python 并不是在所有情况下都可以选择。我想这就像使用 grep -o 但使用 awk 代替。
这是所需的输出:
12,Attribute1,Attribute2
答案1
如果您仅使用基本 awk,您可以将找到的dn
变量值拆分为由字符串分隔的部分",ou="
(假设ou=
不是第一个),然后查找一个数字(或者如果您知道该字段始终是该字段,则采用拆分的第二项) :
n = split(dn,x,",ou=")
for(i=1;i<=n;i++)if(x[i]+0==x[i])v = x[i]
# or just do: v = x[2]
对于示例输入,您将x
在索引 1、2 和 3 处获得数组,值:
ObjectName=Value
12
Users,dc=example,dc=com
0
我们通过添加到字符串来测试数字。 awk 将字符串转换为数字(如果不是数字则为 0)。如果结果与原始字符串相同,我们就得到一个简单的数字。
或者,如果您有 gnu awk,您可以使用gensub
匹配模式并捕获()
数字部分,dn
用它替换整个值:
v = gensub(".*,ou=([0-9]{1,2}),.*","\\1",1,dn)
答案2
这就是我最终所做的:
awk -F': ' '/^dn: /{split($2, ou, "," seps)}/^Attribute1/{Attribute1=$2}/^Attribute2/{print ou[2]","$2","Attribute1}'
“ou=”仍然存在,但我可以轻松修改我的脚本以适应。
ou=12,Attribute1,Attribute2