Exibe uma linha correspondente e a linha precedente mais próxima que corresponde a outro padrão

2

Eu tenho este requisito onde show mac address table de um switch listará 1000 entradas.

file1:

switch_1#show mac address table
AA:AA:AA:AA:AA:AA port 47
BB:BB:BB:BB:BB:BB port 48
.
.
.
DD:DD:DD:DD:DD:DD port 50
file2:

switch_2#show mac address table
AA:AA:AA:AA:AA:AA port 47
BB:BB:BB:BB:BB:BB port 48
.
.
.
DD:DD:DD:DD:DD:DD port 45

Eu preciso encontrar uma maneira de exibir a linha contendo DD:DD:DD:DD:DD:DD e, quando isso ocorrer, ele deve procurar algumas linhas acima e imprimir o nome do host que contém a linha

Assim, a saída deve se parecer com:

switch_1#show mac address table
DD:DD:DD:DD:DD:DD port 50
switch_2#show mac address table
DD:DD:DD:DD:DD:DD port 45

file1 , file2 são armazenados no mesmo diretório (são apenas exemplos, existem mais de 100 arquivos / switches e o MAC precisa ser filtrado junto com os nomes dos switches)

    
por Maran Ganesh 08.08.2018 / 23:54

1 resposta

3

solução awk

Se obtivermos uma linha com um hash, armazene-a na variável a.

Se obtivermos uma linha com um endereço MAC correspondente, imprima a variável a, juntamente com a linha atual.

$ awk '/#/{a=$0}/^DD:DD:DD:DD:DD:DD/{print a"\n"$0}' file1 file2
switch_1#show mac address table
DD:DD:DD:DD:DD:DD port 50
switch_2#show mac address table
DD:DD:DD:DD:DD:DD port 45
$

solução sed

Se obtivermos uma linha com um hash, coloque-a no espaço de espera ( h ).

Se obtivermos uma linha com um endereço MAC correspondente, acrescente ao espaço padrão ( H ), copie o espaço para espaço padrão ( g ), imprima o espaço padrão ( p )

$ sed -n '/#/h;/^DD:DD:DD:DD:DD:DD/{H;g;p}' file1 file2
switch_1#show mac address table
DD:DD:DD:DD:DD:DD port 50
switch_2#show mac address table
DD:DD:DD:DD:DD:DD port 45
$
    
por 09.08.2018 / 00:01