Eu tenho dois arquivos: master.tbl
esites.lst
O arquivo master.tbl
é uma lista de sites, com suas configurações de portas, nomes de portas, endereços IP, etc. Existem linhas contendo descrições de sites, comentários, etc., mas são irrelevantes. As linhas contendo as configurações do local estão dispostas desta 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 letras minúsculas, um travessã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 que preciso pesquisar no master.tbl
arquivo.
Preciso comentar (inserir a #
no início da linha) e extrair o nome do servidor e o nome da porta (em um arquivo chamado stoplist.lst
) de cada linha que atenda a TODOS os seguintes critérios:
- contém qualquer nome de site listado em
sites.lst
- contém "-ADM "
- tem um número de porta maior que '2' (exemplo
hawaii23-P3
:)
No exemplo acima, o master.tbl
arquivo 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 (supondo que HAWAII23
esteja em sites.lst
):
server01 hawaii23-P3
master.lst
tem quase 300.000 linhas, então fazer isso manualmente seria...ruim.
Responder1
Aqui está uma awk
solução:
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 do array z
. Em seguida, ele processa master.tbl
a extração do valor após -P
o 3º campo como p
e, se as condições forem atendidas (o 2º campo está dentro z
e p
é maior que 2), ele imprime o 1º e o 3º campos stoplist.lst
e comenta a linha.
Observe que ele não edita o arquivo no local, mas você sempre pode redirecionar para outro arquivo e substituir o original se tudo estiver OK (embora com um arquivo recente gnu awk
você tenha a opção -i inplace
).