当 grep 多个项目时,如何将一个项目的输出限制为第一个实例?

当 grep 多个项目时,如何将一个项目的输出限制为第一个实例?

我有一个多部分 grep,用于从路由器配置文件中提取行。grep 会提取文件中只出现一次的各种字段,例如 IP 地址、日志记录状态、snmp 社区等。为此,我有一个简单的 grep,如下所示:

grep -e "ip address" -e "logging status" -e "snmp community" $file

但是,我还需要它提取文件中多次出现的字段的第一个实例,在本例中为“ospf area”字段。使用单个 grep,我可以通过以下方式完成此操作:

grep -m 1 "ospf area" $file

我怎样才能在单个 grep 中执行这两个功能?我正在循环处理数百个非常长的文件,我想让它尽可能高效。我也没有只依赖 grep,所以我很想看看其他想法。

答案1

也许awk这是一个更好的工具。我们可以记住我们打印过哪些,并且不需要再次打印它们,如下所示:

awk '/ip address/ {print} /logging status/ {print} /snmp community/ {print} /ospf area/ {if(!ospf[$0]++) {print}}' "$file"

它将打印出与您的第一个示例相匹配的每一行grep(如果您只需要第一个示例,则每行将单独打印,否则您可以将它们合并在一起|)。对于匹配的行,ospf area我们构建一个包含所有已见过的行的数组,并且仅在我们之前未见过此行时才打印它。

这将打印出每一ospf area行。如果你只想要第一ospf area行而不需要其他行,你可以将数组设置改为设置 int/flag:

awk '/ip address|logging status|snmp community/ {print} /ospf area/ {if(!ospf++) {print}}' "$file"

如果您不想处理其他行的任何不同,我们可以使用以下事实来简化:awk默认操作是打印匹配的行:

awk '/ospf area/ {if(!ospf++) {print}} /ip address|logging status|snmp community/' "$file"

相关内容