如果我使用命令
ldapsearch -h [HOST] -x -LLL uid=[UID] sn
它会返回
dn: [DN]
sn: [SURNAME]
sn;x-role-2: [SURNAME]
表示具有多个值sn
的条目。我有两个问题:
如何ldapsearch
仅返回属性的值,即
[SURNAME]
[SURNAME]
如何ldapsearch
只返回第一个匹配属性 的值,即
[SURNAME]
我知道我可以使用grep
和sed
进行一些字符串操作来复制所有这些(我已经拥有),但我想知道是否有更高效的内置方式实现这两个目标。
非常感谢任何帮助!
编辑:以下是我目前用于完成上述操作的代码:
ldapsearch -h [HOST] -x -LLL uid=[UID] sn | sed 's/[^:]*: //;2q;d'
sed 's/[^:]*: //;2q;d'
首先删除属性名称,然后选择第一个匹配属性的值(位于第二行,因为dn
占据了第一行。)
答案 0 :(得分:2)
虽然来自@Francois的答案可以(部分)起作用,但我还是鼓励您查看LDAP协议规范section 4.1.7,其中
属性值集是无序的。实施必须 不依赖于可重复的排序。
换句话说,无法保证哪个值将成为第一个值。如果你不关心你正在采取什么价值,这可能没问题。您还需要考虑是否关心带有标记选项的属性(您的示例显示了这一点)。如果没有标记选项,您的应用程序是否应该使用该值而不是属性值?
如果您的属性值具有特殊字符,则@Francois提供的答案将不起作用(在这种情况下显示的值将是BASE64编码的,并且属性类型后面会有两个冒号 - 另请参阅RFC 2849 )。
您可能需要考虑编写一个小脚本(在Perl上的Python中)来执行您需要的操作而不依赖于可能很难正确使用的shell魔法。
答案 1 :(得分:1)
有些内置确实可以提供帮助:
cut可以根据分隔符(在你的情况下:)拆分每列的输出 head -1将返回输出的第一行。
例如:
ldapsearch -h [HOST] -x -LLL uid=[UID] sn | cut -d ":" -f 2-
应该只显示属性值
ldapsearch -h [HOST] -x -LLL uid=[UID] sn | head -1
应该只返回输出的第一行
您也可以将它们组合在一起:
ldapsearch -h [HOST] -x -LLL uid=[UID] sn | head -1 | cut -d ":" -f 2-