示例文本:
dn: uid=test,ou=domain.eu,o=org
uid: test
mailEquivalentAddress: john@domain.eu
mailEquivalentAddress: johndoe@domain.eu
dn: uid=test2,ou=domain.eu,o=org
uid: test2
dn: uid=test3,ou=domain.eu,o=org
uid: test3
因此,并非所有条目都有mail equivalentaddress,而是一个以上的mail equivalentaddress。
我想获得所有具有一个或多个mail equivalentaddresses的条目。要解释标题:以DN开头的所有行GREP:以及所有后续行,但是只有在有一个或多个Mail EquivalentAddress时,请在下一个空线路停止。
所以我要获得的输出是:
dn: uid=test,ou=domain.eu,o=org
uid: test
mailEquivalentAddress: john@domain.eu
mailEquivalentAddress: johndoe@domain.eu
具有可变量的mail equivalentDresses。
我将使用 awk
为此:
awk '$1 ~ /^dn:/{for(i=1;i<=NF;i++){if($i ~ /^mailEquivalentAddress:/){print; break}}}' RS='' file
RS=''
是记录分隔符的特殊值。它告诉awk将文件分为空白行(段落),并将"字段定界符"设置为newline。$1 ~ /^dn:/
检查段落中的第一行是否以dn:
开头程序本身是一个环槽所有字段,该字段检查字段是否以
mailEquivalentAddress:
单词开头。如果找到这样的字段awk
将打印该段落。
示例文本在 file
dn: uid=test,ou=domain.eu,o=org
uid: test
mailEquivalentAddress: john@domain.eu
mailEquivalentAddress: johndoe@domain.eu
dn: uid=test2,ou=domain.eu,o=org
uid: test2
dn: uid=test3,ou=domain.eu,o=org
uid: test3
dn: uid=test4,ou=domain.eu,o=org
uid: test4
mailEquivalentAddress: jason@bourne.eu
mailEquivalentAddress: matt@damon.eu
脚本
awk 'BEGIN{RS="";ORS="nn"}/^dn:.*nuid:.*nmailEquivalentAddress: [[:alnum:]]+/' file
输出
dn: uid=test,ou=domain.eu,o=org
uid: test
mailEquivalentAddress: john@domain.eu
mailEquivalentAddress: johndoe@domain.eu
dn: uid=test4,ou=domain.eu,o=org
uid: test4
mailEquivalentAddress: jason@bourne.eu
mailEquivalentAddress: matt@damon.eu
注意:
- 我认为
mailEquivalentAddress:
可以被视为钥匙。 - 从您给出的输入中,很明显您在每个记录之间都有一个空白,因此我保留了记录分隔符
RS=""
。 -
/^dn:.*nuid:.*nmailEquivalentAddress: [[:alnum:]]+/
我们查看记录- 检查DN(开始时)和UID键是否在记录中存在。
- 对于以
mailequivalentAddress:
开头的行,如果是,我们可以确定它是钥匙。然后,我们确保[[:alnum:]]+
是非空的,如果是,我们打印了记录。
这可能对您有用(gnu sed):
sed -n '/^dn:/{:a;$!{N;/n$/!ba};/mailEquivalentAddress:/p}' file
如果一条线开始dn:
获取更多行,直到空行或文件末尾为止。测试这些行的存在mailEquivalentAddress:
,如果发现了,则打印它们。