Copie as linhas de texto simples do arquivo e anexe-as ao mesmo arquivo com o prefixo de linha média ou remova o prefixo de linha média

1

Criando um script feio que compila vários arquivos hosts em uma grande lista.

A maioria das listas terá duas entradas para um URL, uma com www. e outra sem essa:

127.0.0.1 facebook.com
127.0.0.1 www.facebook.com

No entanto, algumas das minhas listas não funcionam assim e eu quero que elas sejam dobradas. Eu tenho muitos URLs dispersos assim:

127.0.0.1 twitter.com
127.0.0.1 www.facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.reddit.com

O que eu gostaria de fazer é verificar o arquivo em busca de URLs listados para verificar todas as linhas sem que www. tenha uma linha correspondente a www. e que todas as linhas com www. tenham uma correspondência semelhante sem o código%. Então, quero anexar todas as linhas ausentes à lista para que minha lista seja assim:

127.0.0.1 twitter.com
127.0.0.1 www.twitter.com
127.0.0.1 facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 www.facebook.com
127.0.0.1 www.subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.tumblr.com
127.0.0.1 reddit.com
127.0.0.1 www.reddit.com

Ele não precisa estar em ordem, posso apenas anexar todas as linhas ausentes no final do arquivo, porque eu corro www. como uma etapa final.

    
por deskjockey 21.01.2016 / 22:06

2 respostas

1

Você pode simplesmente ignorar a verificação e adicionar a linha de par de qualquer maneira, depois canalizar a saída para sort -u :

sed '/ www./{                  # if line matches  www.
h                              # copy it over the hold buffer
s// /                          # remove the www. part
G                              # append the original line to the modified one
}
//!{                           # if line doesn't match  www.
h                              # copy it over the hold buffer
s/ / www./                     # add the www. part
G                              # append the original line to the modified one
}
' infile | sort -u

Isso pressupõe que as duas colunas (IP e URL) são delimitadas por um espaço. Ajuste o regex, se necessário.

Ou, com zsh , você pode ler as linhas em uma matriz, remover a www. parte onde está presente e armazenar o resultado em uma matriz de elementos exclusivos, em seguida, imprimir cada elemento duas vezes, uma vez como está e uma vez com o www. parte adicionada:

mylist=(${(f)"$(<infile)"})
for i (${(u)mylist[@]/ www./ }) printf '%s\n' ${i} ${i/ / www.}
    
por 21.01.2016 / 23:59
0

Você pode usar o seguinte script awk :

script.awk:

{
    gsub("www.", "", $2)
    address[$2]
}
END{
    for (item in address){
        print("127.0.0.1", item)
        print("127.0.0.1", "www." item)
    }
}

Invoque-o com

awk -f script.awk input

Remove www. de todas as entradas e preenche uma matriz (sem valor). Se o valor já estiver lá, ele simplesmente sobrescreverá, para que você não precise se preocupar com duplicatas. No final, imprimimos o conteúdo do array, uma vez como é, e uma vez com o prefixo www. .

    
por 21.01.2016 / 22:28