我有一个多部分 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"