Procura do awk - Classes de caracteres combinadas na mesma cadeia

3

Boa Noite

Eu estou tentando utilizar várias classes de caracteres ao mesmo tempo sem sucesso. Dada uma coluna que contém o URI do tráfego HTTP, quero que o REGEX identifique as linhas em que o campo URI contém uma cadeia de texto de 6 a 10 caracteres que contém números AND letras minúsculas ... pelo menos um de cada, mas NÃO letras maiúsculas.

Esta pesquisa NÃO será limitada a um caractere específico ou parte da string ...

Testar cadeias:

aasd4567
9f7g6s5df
0hjksdf73
123456789
12345/1234a
Wordswords
W0rdsW4rds
aasd4/567af
9f7g6s5dfasdf
0hjks/asdf
12345/1234asd
Wordswords12
W0rdsW4rds12312312

Eu esperava poder utilizar um pequeno booleano com colchetes, ou seja:

awk --re-interval '$1 ~ /([0-9]+&[a-z]+){6,10}/'

Mas isso não funciona. E obviamente, combiná-los não funcionará porque

awk --re-interval '$1 ~ /[a-z0-9]{6,10}/'

ainda retorna strings sem números e sem letras minúsculas.

Eu até tentei encontrar maneiras de combinar [[: lower:]] e [[: digit:]], mas enfrentei o mesmo problema do primeiro exemplo acima.

Tenho certeza de que é uma solução super fácil, o que estou perdendo? Eu não sou contra o uso do gawk / grep / sed / etc, qualquer que seja a ferramenta mais eficiente para esta tarefa.

Obrigado

    
por user112802 14.05.2016 / 05:47

1 resposta

4

Se eu entendi sua pergunta corretamente, você pode usar match primeiro, depois RSTART e RLENGTH para extrair a string correspondente e examiná-la para a presença de um dígito E um caractere, assim:

awk  --re-interval '{match($1, /[[:lower:][:digit:]]{6,10}/); 
  x=substr($1, RSTART, RLENGTH)}; x ~ /[[:lower:]]/ && x ~ /[[:digit:]]/' test_strings

Considerando suas strings de teste, isso gera:

aasd4567
9f7g6s5df
0hjksdf73
9f7g6s5dfasdf
12345/1234asd
Wordswords12
W0rdsW4rds12312312
    
por 14.05.2016 / 06:05