Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 搜索模式x(并打印该行),在后续行中用模式y grep行,直到下一个空行_Bash_Awk_Sed_Grep - Fatal编程技术网

Bash 搜索模式x(并打印该行),在后续行中用模式y grep行,直到下一个空行

Bash 搜索模式x(并打印该行),在后续行中用模式y grep行,直到下一个空行,bash,awk,sed,grep,Bash,Awk,Sed,Grep,示例文本: 因此,并非所有条目都有mailEquivalentAddress,可以有多个mailEquivalentAddress 我想获取所有包含一个或多个MailequivalentAddress的条目。 要解释以dn:开头的所有行以及所有后续行的标题:grep,但仅当存在一个或多个mailEquivalentAddress时,请在下一个空行处停止 所以我想得到的结果是: dn: uid=test,ou=domain.eu,o=org uid: test mailEquivalentAddr

示例文本:

因此,并非所有条目都有mailEquivalentAddress,可以有多个mailEquivalentAddress

我想获取所有包含一个或多个MailequivalentAddress的条目。 要解释以dn:开头的所有行以及所有后续行的标题:grep,但仅当存在一个或多个mailEquivalentAddress时,请在下一个空行处停止

所以我想得到的结果是:

dn: uid=test,ou=domain.eu,o=org
uid: test
mailEquivalentAddress: john@domain.eu
mailEquivalentAddress: johndoe@domain.eu
使用不同数量的邮件地址。

我会使用awk:

awk '$1 ~ /^dn:/{for(i=1;i<=NF;i++){if($i ~ /^mailEquivalentAddress:/){print; break}}}' RS='' file
RS=是记录分隔符的特殊值。它告诉awk通过一个空行将文件分割成记录,并将字段分隔符设置为换行符

$1~/^dn:/检查段落的第一行是否以dn开头:

程序本身是一个通过所有字段的循环,用于检查字段是否以单词mailEquivalentAddress:开头。如果找到此类字段,awk将打印段落

我会使用awk来实现这一点:

awk '$1 ~ /^dn:/{for(i=1;i<=NF;i++){if($i ~ /^mailEquivalentAddress:/){print; break}}}' RS='' file
RS=是记录分隔符的特殊值。它告诉awk通过一个空行将文件分割成记录,并将字段分隔符设置为换行符

$1~/^dn:/检查段落的第一行是否以dn开头:

程序本身是一个通过所有字段的循环,用于检查字段是否以单词mailEquivalentAddress:开头。如果找到此类字段,awk将打印段落

文件中的示例文本

剧本

输出

注:

我认为mailEquivalentAddress:可以被视为一把钥匙。 从您提供的输入可以明显看出,每条记录之间都有一个空行,因此我保留了记录分隔符RS=。 By/^dn:.*\nuid:..*\n邮件等效地址:[[:alnum:][]+/我们查看记录 检查开始时的dnat和uid键是否强制存在于记录中。 对于以mailequivalentAddress:开头的行,如果是,我们可以确保它是一个键。然后,我们通过[[:alnum:][]+确保它是非空的,如果是,我们打印记录。 文件中的示例文本

剧本

输出

注:

我认为mailEquivalentAddress:可以被视为一把钥匙。 从您提供的输入可以明显看出,每条记录之间都有一个空行,因此我保留了记录分隔符RS=。 By/^dn:.*\nuid:..*\n邮件等效地址:[[:alnum:][]+/我们查看记录 检查开始时的dnat和uid键是否强制存在于记录中。 对于以mailequivalentAddress:开头的行,如果是,我们可以确保它是一个键。然后,我们通过[[:alnum:][]+确保它是非空的,如果是,我们打印记录。
这可能适用于GNU sed:

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

如果一行开始dn:获取更多行,直到空行或文件结束。测试这些行是否存在mailEquivalentAddress:并在找到时打印它们。

这可能适用于GNU-sed:

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

如果一行开始dn:获取更多行,直到空行或文件结束。测试这些行是否存在mailEquivalentAddress:如果发现,请打印它们。

实际上,您或多或少都在做我的答案所建议的事情,但不太准确,因为您只检查该词是否在段落中的某个位置,而不检查它是否是一个键,并且根本没有解释。你为什么发布这样的答案?@hek2mgl:我想我已经纠正了准确性问题。你测试过了吗?@hek2mgl这样做了,例如,它不会为uid:mailEquivalentAddress:或只包含mailEquivalentAddress的记录提供正匹配:some@stuff. 想不出任何其他测试用例though@hek2mgl:谢谢你的编辑。此外,我已将/\nMaileEquivalentAddress://更改为/\nMaileEquivalentAddress:[[:alnum:][]+/以防止在存在空密钥的情况下出现误报。但是,检查邮件地址的正确性超出了这个问题的范围。实际上,你或多或少都在做我的回答所暗示的事情,但不太准确,因为你只检查这个词是否在段落中的某个地方,而不检查它是否是一个键,并且没有任何解释。你为什么发布这样的答案?@hek2mgl:我想我已经纠正了准确性问题。你测试过了吗?@hek2mgl这样做了,例如,它不会为uid:mailEquivalentAddress:或只包含mailEquivalentAddress的记录提供正匹配:some@stuff. 想不出任何其他测试用例though@hek2mgl:谢谢你的编辑。此外,我已将/\nMaileEquivalentAddress://更改为/\nMaileEquivalentAddress:[[:alnum:][]+/以防止在存在空密钥的情况下出现误报。但是,检查邮件地址的正确性超出了此问题的范围..如果未设置mailEquivalentAddress,如果在其他地方发生同样的情况,即不作为密钥,并且对于仅包含mailEquivalentAddress的记录,此脚本将打印记录,没有其他钥匙。我看不出问题中的要求是邮递员必须
不能是空的。你…吗?请注意,将配置值设置为空字符串可能是有意的。此外,您在哪里看到除了mailEquivalentAddress之外还必须有其他键的要求?因此,并非所有条目都有mailEquivalentAddress,很明显,键不应该为空吗?op可能会澄清这一点。对于所有以dn开头的行,grep都明确指出它应该以dn开头。我只是做了一个编辑来处理这个问题。如果时间允许,你可以复习一下。请仔细阅读我的答案。我已经添加了dn:限制。然而,输入数据看起来似乎是有保证的。数据不是人为的,这些是ldap记录,它也在做同样的事情。这就是所谓的论点。选中此复选框如果未设置mailEquivalentAddress,如果在其他地方发生同样的情况,此脚本将打印记录,即不作为键,也可打印仅包含mailEquivalentAddress的记录,即不包含任何其他键。我不认为问题中要求mailEquivalentAddress不能为空。你…吗?请注意,将配置值设置为空字符串可能是有意的。此外,您在哪里看到除了mailEquivalentAddress之外还必须有其他键的要求?因此,并非所有条目都有mailEquivalentAddress,很明显,键不应该为空吗?op可能会澄清这一点。对于所有以dn开头的行,grep都明确指出它应该以dn开头。我只是做了一个编辑来处理这个问题。如果时间允许,你可以复习一下。请仔细阅读我的答案。我已经添加了dn:限制。然而,输入数据看起来似乎是有保证的。数据不是人为的,这些是ldap记录,它也在做同样的事情。这就是所谓的论点。检查这个示例代码在哪里?示例代码在哪里?这确实可以完成工作!!回答得好!只有一件事,它应该是/\nMail EquivalentAddress:/p,以确保它是一个键。这确实可以完成任务!!回答得好!只有一件事,它应该是/\n邮件等效地址:/p以确保它是一个密钥
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
sed -n '/^dn:/{:a;$!{N;/\n$/!ba};/mailEquivalentAddress:/p}' file