搜索模式X(并打印该行),在随后的线上GREP线,patten y脱下下一条空线



示例文本:


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

注意:

  1. 我认为mailEquivalentAddress:可以被视为钥匙。
  2. 从您给出的输入中,很明显您在每个记录之间都有一个空白,因此我保留了记录分隔符RS=""
  3. /^dn:.*nuid:.*nmailEquivalentAddress: [[:alnum:]]+/我们查看记录
    • 检查DN(开始时)和UID键是否在记录中存在。
    • 对于以mailequivalentAddress:开头的行,如果是,我们可以确定它是钥匙。然后,我们确保[[:alnum:]]+是非空的,如果是,我们打印了记录。

这可能对您有用(gnu sed):

sed -n '/^dn:/{:a;$!{N;/n$/!ba};/mailEquivalentAddress:/p}' file

如果一条线开始dn:获取更多行,直到空行或文件末尾为止。测试这些行的存在mailEquivalentAddress:,如果发现了,则打印它们。

最新更新