Use um arquivo de lista para extrair uma segunda lista de um arquivo mestre (e comentar algumas linhas)… COMO?

3

Eu tenho dois arquivos: master.tbl e sites.lst

O arquivo master.tbl é uma lista de sites, com suas configurações de porta, nomes de portas, endereços IP, etc. Há linhas que contêm descrições de sites, comentários, etc., mas são irrelevantes. As linhas que contêm as configurações do site são organizadas dessa forma e são delimitadas por espaços.:

{server} {SITE NAME} {port name} {configuration flags}

Os nomes das portas consistem no nome do site em minúsculas, um traço, um "P" e o número da porta.

Exemplo:

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

sites.lst é uma lista de sites para os quais preciso pesquisar o arquivo master.tbl .

Eu preciso comentar (insira um # no início da linha) e extraia o nome do servidor e o nome da porta (em um arquivo denominado stoplist.lst ) de cada linha que atenda a TODOS os critérios a seguir:

  1. contém qualquer nome de site listado em sites.lst
  2. contém "-ADM"
  3. tem um número de porta maior que '2' (exemplo: hawaii23-P3 )

No exemplo acima, o arquivo master.tbl ficaria assim:

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

... e stoplist.lst conteria (assumindo que HAWAII23 está em sites.lst ):

server01 hawaii23-P3

master.lst é quase 300.000 linhas, portanto, fazer isso manualmente seria ... ruim.

    
por Chris Boone 19.05.2016 / 23:48

1 resposta

2

Aqui está uma solução awk :

awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl

Isso lê sites.lst primeiro e define $0"-ADM" (que é o nome do site + a string -ADM ) como um índice da matriz z . Em seguida, ele processa master.tbl extraindo o valor após -P no 3º campo como p e, se as condições forem atendidas (o 2º campo é em z e p maior que 2) imprime os 1º e 3º campos para stoplist.lst e comenta a linha para fora.
Note que ele não edita o arquivo no local, mas você sempre pode redirecionar para outro arquivo e sobrescrever o original se tudo estiver OK (embora com um% recentegnu awk você tenha a opção -i inplace ).

    
por 20.05.2016 / 03:15