Eu tenho um arquivo (test.txt) que contém 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) Quero capturar todas as strings nas 2ª e 5ª 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 string na 2ª coluna, mas strings ilimitadas na quinta coluna, mas são separadas por ponto e vírgula.
Tentei usar este comando para tentar capturar todas as strings da quinta coluna (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 2ª e na quinta coluna usng grep
. Onde as strings são quatro números (de 1 a 3 dígitos) separados por pontos. Existe apenas uma string na 2ª coluna, mas strings ilimitadas na 5ª, mas separadas por ponto e vírgula?
EDIT: 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
Observe também que quero os resultados classificados e exclusivos sort -u
. Não tenho strings repetidas no exemplo, mas quero evitar repetições se encontradas no meu arquivo real.
Existem outros campos que podem conter seu padrão (o exemplo não tem nenhum)? Se não, tente
Se você quiser ordenar numericamente, use
sort
a-g
opção de .Para sua própria solução fornecida na pergunta, tente
-f2,5
oscut
campos.Sua evasão
awk
precisa de algum raciocínio na pergunta, mas de qualquer maneira, aqui vai:Se você quiser a saída sort+uniq'ed, você pode adicionar um
| sort -u
no final do pipeline ;-)Corrigido meu exemplo, mas não é elegante.
Basicamente, o awk separa os campos, usamos sed para nos livrar de caracteres indesejados e depois ordenamos a saída. Desculpe, não há grep nesta resposta.
Aqui está uma solução passo a passo usando
cut+tr+sort
Primeiro, obtenha os campos obrigatórios
Em seguida, exclua todos os caracteres indesejados
Em seguida, traduza
,
e;
para nova linha para que cada valor esteja em sua própria linha e classifique-o exclusivamente