使用 Awk 匹配 LDAP DN 中的子字符串

使用 Awk 匹配 LDAP DN 中的子字符串

我正在寻找解析 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

相关内容