
Eu tenho um arquivo com a seguinte entrada. Os números separados por pontos representam endereços. Qualquer número no endereço pode ter um ou mais dígitos da seguinte forma:
[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]
Quero extrair cada endereço sem ponto e vírgula e colchetes (os endereços são separados por ponto e vírgula ;
) e inserir cada endereço em uma linha em um novo arquivo para produzir esta saída:
112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88
Como primeiro passo, tentei o grep para extrair os endereços da seguinte forma:
grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt
Mas não imprime nada.
Responder1
Regex estendido( -E
ou egrep
) não sabe \d
. Use -P
conforme sugerido por @Alexander ou use -E
com [0-9]
ou [[:digit:]]
em vez disso.
Adicione -o
para selecionar apenas as correspondências em vez de linhas inteiras correspondentes. Isso também dividirá as partidas individuais em novas linhas.
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt
ou
grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt
usandoRegex Perl( -P
ou pgrep
):
grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt
Se você mudar +
para *
você também pode usarRegex Básico:
grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt
Responder2
Substitua -E
por -P
e adicione -o
:
grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
Responder3
Usando awk
:
awk 'NF' RS='[][;]' infile
Ou com tr
se você não se importa com a primeira linha vazia:
tr -s '];[' '\n' <infile
Responder4
grep
é um exagero para esta tarefa. tr
é suficiente:
$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u
A sort -u
parte remove endereços duplicados.