Ao usar vários itens, como limitar a saída de um item para a primeira instância?

0

Eu tenho um grep em várias partes que está extraindo linhas dos arquivos de configuração do roteador. O grep pega uma variedade de campos que ocorrem apenas uma vez no arquivo, como endereço IP, status de log, comunidade snmp, etc. Para isso, eu tenho um grep simples, como o seguinte:

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

No entanto, também preciso puxar a primeira instância de um campo que ocorre várias vezes no arquivo, nesse caso, o campo "área ospf". Com um único grep, eu posso fazer isso via:

grep -m 1 "ospf area" $file

Como posso executar as duas funções em um único grep? Estou circulando centenas de arquivos muito longos e gostaria de manter isso o mais eficiente possível. Eu também não sou casado com grep para isso, então eu estaria interessado em ver outras idéias.

    
por nod 26.10.2017 / 02:18

1 resposta

3

Talvez awk seja uma ferramenta melhor para isso. Podemos lembrar quais foram os que imprimimos e não imprimi-los novamente com algo como:

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

, que imprimirá todas as linhas que corresponderem aos seus primeiros exemplos de grep (e cada uma é feita separadamente, caso você deseje apenas a primeira, caso contrário, você poderá combiná-las com | ). Para linhas que combinam ospf area , construímos uma matriz de todas as linhas que já vimos e apenas a imprimimos se não vimos esta linha antes.

Isso imprimirá cada linha ospf area exclusiva conforme escrita. Se você quiser apenas a primeira linha ospf area e nenhuma outra, basta alterar a configuração da matriz para definir um int / flag:

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

e se você não quiser lidar com nada diferente sobre as outras linhas, podemos simplificar usando o fato de que a ação padrão de awk é imprimir a linha correspondente:

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