Procurando por URLs com subdomínios usando grep

0

Eu tenho um arquivo com conteúdo semelhante a:

mail.google.com
srv1.mail.google.com
google.com
facebook.com
yahoo.com
tt.twitter.com

Eu quero procurar por linhas com subdomínios. Eu usei este comando:

grep -e '(.\.)*.\..$' test.txt

Os detalhes do comando:

  • (.\.)* : para qualquer caractere seguido por um ou mais pontos.
  • .\..$ : anycharacter seguido de ponto e, em seguida, qualquer caractere

Exemplos dos padrões de sequência que espero encontrar:

mail.google.com
srv1.mail.google.com

mas não encontra nada. A saída que estou procurando deve ser linhas com subdomínios:

mail.google.com
srv1.mail.google.com
tt.twitter.com
    
por user9371654 18.08.2018 / 01:10

2 respostas

2

Tente o seguinte:

grep -E '(.+\.)+.+\..+$' test.txt

Saída:

mail.google.com srv1.mail.google.com tt.twitter.com

Detalhes:

  • (.+\.)+ - qualquer caractere seguido de ponto, pesquise esse agrupamento uma ou mais vezes.
  • .+\. - qualquer caractere, uma ou mais vezes seguidas por um único período.
  • .+$ - qualquer caractere uma ou mais vezes, seguido por um fim de linha.

O problema com sua expressão regular é / são:

  • (.\.)* - corresponde a qualquer caractere e, em seguida, a um período. Mas o * pode corresponder a zero ou mais vezes. Você provavelmente quer + .
  • .\. - corresponde exatamente a um caractere e, em seguida, um período. Você deseja que um + após o primeiro . ( .+ ) corresponda a um ou mais caracteres.
  • .$ - corresponde exatamente a um caractere e, em seguida, um fim de linha. Você deseja que um + após o . ( .+ ) corresponda a um ou mais caracteres.
por 21.08.2018 / 22:45
0

Se você estiver certo em simplificar os critérios para "linhas que tenham pelo menos dois períodos", você pode usar um simples grep:

grep -E '\.[^.]+\.' < file

Isso permite expressões regulares estendidas e, em seguida, procura por um período seguido por um ou mais não-períodos seguidos por um período. Você pode reduzir ainda mais, exigindo que alguns caracteres apareçam nos dois lados dos períodos:

grep -E '.\.[^.]+\..' < file

O texto acima evitaria resultados falso-positivos em entradas como:

foo.com.

ou     .com.

Com base em esta resposta de estouro de pilha de 2014, um TLD não pode ser todo numérico, mas poderia (em teoria) ser um único caractere, então você pode usar:

grep -E '\.[^.]+\.[[:alpha:]]'
    
por 25.08.2018 / 21:58