Extrai endereços IP em cada linha do arquivo no shell

-1

Eu tenho este arquivo de entrada no Ubuntu:

146.14.142.96.17747 197.102.40.184.13748:
146.14.142.96.17747 197.102.40.184.13749: 
146.14.142.96.17747 197.102.40.184.13750:
146.114.142.96.17747 197.102.40.184.13751:
46.14.142.96.17747 197.102.40.184.13752:

e eu gostaria de ter a saída assim usando scripts de shell:

separe dois IPs sem número de portas Quero dizer excluir portas

146.14.142.96 197.102.40.184
146.14.142.96 197.102.40.184 
146.14.142.96 197.102.40.184
146.114.142.96 197.102.40.184
46.14.142.96 197.102.40.184
    
por Arash 25.04.2013 / 18:49

2 respostas

3

Para linhas formatadas exatamente como mostrado na pergunta, isso será feito:

sed -E 's/\.[0-9]+[ :]/ /g' input-file

Como funciona:

  • A opção -E ativa Expressões regulares estendidas .

  • s/SEARCH/REPLACE/g globalmente ( /g ) substitui ( s/ ) SEARCH com REPLACE .

  • \.[0-9]+[ :] corresponde a um ponto após qualquer número positivo de dígitos após um espaço ou dois pontos.

No entanto, isso será interrompido se a formatação variar um pouco. Essa abordagem pode resultar em robustez:

sed -E 's/(([0-9]+\.){3}[0-9]+)[^ ]+//g' input-file

Como funciona:

  • ([0-9]+\.){3}[0-9]+ corresponde a um IP (grupos de três dígitos seguidos de pontos mais um grupo de dígitos adicional).

  • Os parênteses circundantes declaram a correspondência anterior como a primeira sub-correspondência ( ).

  • [^ ]+ corresponde a qualquer caractere não espacial que segue o IP.

por 25.04.2013 / 19:13
0

Faça uma pesquisa e substitua usando regex

(\d+\.\d+\.\d+\.\d+)\.\d+(:?)

e substitua o texto


Várias ferramentas suportam pesquisa e substituição regex, embora o dialeto possa ser um pouco diferente. O acima funciona com o Notepad ++.

Ou no vim você pode fazer

:s/\(\d\+\.\d\+\.\d\+\.\d\+\)\.\d\+\(:\?\)//g
    
por 25.04.2013 / 18:55

Tags