Como posso encontrar um endereço em um arquivo grande com grep?

1

Eu tenho um exercício para fazer em que recebi um registro de e-mail fictício em que o proprietário do e-mail foi convidado para um determinado local de férias. O log é grande, então, para acelerar as coisas, eu tenho que usar grep de uma certa maneira para encontrar o endereço onde o dono do endereço de e-mail está indo.

A forma básica de como um endereço é escrito como:

name firstName
streetName streetNumber
postalCode(zip) City

Agora sei que os códigos postais geralmente têm 5 dígitos, para que eu possa começar a procurar a linha com o código postal. Até agora, eu fiz assim:

grep -C2 ^[0-9][0-9][0-9][0-9][0-9] emails

Esse comando me fornece todas as linhas que começam com 5 dígitos em uma linha e suas duas linhas circundantes ( -C2 ). Com isso, consegui encontrar o endereço, mas ainda há muitas linhas desnecessárias que aparecem em torno dele. Eu tenho que especificar a pesquisa para obter apenas o endereço.

Por isso, tentei pesquisar uma linha que começa com 5 dígitos e termina com qualquer letra como esta:

grep -C2 ^´[0-9][0-9][0-9][0-9][0-9][A-Z]$´ emails

Mas acaba não encontrando nada. Provavelmente é porque ele procura por uma linha que contém apenas 5 caracteres e uma letra. Mas não sei como dizer grep para procurar uma linha que pesquise apenas por uma linha que inicie com 5 dígitos E termine com uma letra (ou melhor, uma palavra).

Minha próxima melhor tentativa seria pesquisar o nome e o primeiro nome procurando por uma linha que contenha apenas duas palavras. Mas eu não sei como fazer isso e não consigo encontrar nenhuma discussão em que isso seja explicado.

Espero que vocês possam me ajudar, por favor?

    
por Ken Hado 05.05.2016 / 11:58

2 respostas

2

Você pode usar grep -B2 -E '^[0-9]{5} +[a-zA-Z]+$' para tentar encontrar apenas blocos de endereços.

Algumas notas:

  • veja man grep para entender as opções
  • veja o final da manpage do grep para encontrar uma manpage que explique a sintaxe da regex em detalhes, a própria página do GNU grep também explica o regex um pouco
  • -B é "linhas antes do jogo" e pode ser mais adequado para você do que -C
  • -E é para sintaxe de regex estendida
  • o regex que eu dei corresponde a qualquer linha que tenha cinco dígitos ( {5} leva a coisa anterior cinco vezes), então pelo menos um espaço ( + leva a coisa anterior uma ou mais vezes) e somente cartas até o fim da linha.
  • tome cuidado ao citar seus argumentos para o grep. ' é muito diferente de ' ou " .

Você pode tentar encontrar linhas contendo apenas duas palavras se tentar encontrar linhas que contenham apenas um espaço:

grep -E '^[^ ]+ [^ ]+'

Se você quiser combinar algo em várias linhas, não tenho certeza se grep pode fazer isso. Você poderia tentar fazer isso com sed , que pode carregar as próximas linhas no espaço de padrão com N e então combinar com essa concatenação (dê uma olhada em man sed se isso puder ser adequado para você). (Ou perl , acho que pode corresponder a padrões de várias linhas, mas não sei como).

    
por 05.05.2016 / 13:30
0

So I tried searching for a line that starts with 5 digits and ends with any letter like this:

^[0-9][0-9][0-9][0-9][0-9][A-Z]$

Esse padrão corresponde a linhas que contêm apenas 5 dígitos e uma letra (maiúscula). Se você espera que haja mais entre eles, você precisará incluí-lo no padrão. Se você não se importa com o que vai entre eles, use .* para corresponder a qualquer caractere, vezes ilimitadas. Provavelmente, você deve incluir também letras minúsculas ou usar grep -i para ignorar maiúsculas e minúsculas.

^[0-9]\{5\}.*[A-Za-z]$

My next best try would be searching for the name and the first name by searching for a line which contains only two words. But I don't know how to do that and I can't find any discussion in which this is explained.

Você pode combinar linhas que contenham duas palavras simples, com um padrão que é executado: início, palavra, lacuna, palavra, fim:

^[[:alpha:]]\+[[:space:]]\+[[:alpha:]]\+$

No entanto, tentar combinar um nome com uma expressão regular tem muitas armadilhas. Consulte link .

    
por 05.05.2016 / 13:53

Tags