RegEx para sequências de caracteres correspondentes na segunda e quinta colunas usando grep

1

Eu tenho um arquivo (test.txt) que contém uma string como:

name1,6.5.8.12,specs1,version1,['66.55.89.12']
name2,19.13.13.159,specs2,version2,['13.13.173.59'; '14.19.232.42']
name3,141.101.196.40,specs3,version3,['11.01.196.0']

1) Eu quero capturar todas as seqüências na segunda e quinta colunas que são formatadas como quatro números separados por pontos, e cada número pode ter até 3 dígitos.

2) Há uma cadeia na segunda coluna, mas seqüências ilimitadas na quinta coluna, mas elas são separadas por ponto e vírgula.

Eu tentei usar esse comando para tentar capturar todas as strings da quinta coluna (eu ainda preciso descobrir como capturar a 2ª e a 5ª coluna), mas esse comando não funcionou em primeiro lugar. Produziu arquivo vazio:

cat test.txt | cut -d ',' -f5 | grep -P -o '\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}' > result.txt

Como capturar a string de formato especial na segunda e quinta colunas usando grep . Onde as cadeias são quatro números (de 1 a 3 dígitos) separados por pontos. Há apenas uma string na 2ª coluna, mas uma string ilimitada na 5ª, mas separada por ponto e vírgula?

EDITAR: A saída esperada:

6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0

Por favor, note também que eu quero os resultados classificados e exclusivos sort -u . Eu não tenho seqüências repetidas no exemplo, mas eu quero evitar a repetição se for encontrado no meu arquivo real.

    
por user9371654 20.10.2018 / 14:12

4 respostas

1

Existem outros campos que podem conter seu padrão (a amostra não possui nenhum)? Se não, tente

grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" file | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12

Se você quiser classificá-lo numericamente, use a opção sort -g .

Para sua própria solução dada na pergunta, tente -f2,5 para os campos cut .

    
por 20.10.2018 / 15:45
1

Sua evitação de awk precisa de algum raciocínio na pergunta, mas de qualquer forma, aqui vai:

$ cut -d, -f2,5 file | egrep -wo '([0-9]{1,3}[.]){3}[0-9]{1,3}'
6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0

Se você quiser a classificação sort + uniq'ed, você pode adicionar um | sort -u no final do pipeline; -)

    
por 20.10.2018 / 16:36
0

Aqui está uma solução passo a passo usando cut+tr+sort

Primeiro, obtenha os campos obrigatórios

$ cut -d, -f2,5 ip.txt
6.5.8.12,['66.55.89.12']
19.13.13.159,['13.13.173.59'; '14.19.232.42']
141.101.196.40,['11.01.196.0']

Em seguida, exclua todos os caracteres indesejados

$ cut -d, -f2,5 ip.txt | tr -d "]'[ "
6.5.8.12,66.55.89.12
19.13.13.159,13.13.173.59;14.19.232.42
141.101.196.40,11.01.196.0

Em seguida, traduza , e ; para nova linha para que cada valor esteja em sua própria linha e, em seguida, classifique-o de maneira exclusiva

$ cut -d, -f2,5 ip.txt | tr -d "]'[ " | tr ',;' '\n' | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12
    
por 20.10.2018 / 14:58
0

Corrigido meu exemplo, mas não é elegante.

Basicamente, o awk separa os campos, nós usamos sed para nos livrarmos dos caracteres indesejados e então ordenamos a saída. Desculpe, não grep nesta resposta.

cat test.txt |awk -F'[,;]' '{print $2"\n" $5}'  | sed 's/\(\[\|\]\)//g' |sed "s/'//g" |sort -r
    
por 20.10.2018 / 14:24