Especifique o String Lenth no Awk Pattern Search

1

Não tenho certeza do que estou fazendo de errado. Dado um test.log de:

123.123.123.123 321.321.321.321 GET /test1234/asdfasdfpioasdfjkhweris,9
123.123.123.123 321.321.321.321 GET /4321test/asdfasdfpioasdfjkhweris,9
123.123.123.123 321.321.321.321 GET /test123456/asdfasdfpioasdfjkhweris,9

Estou tentando isolar os dois primeiros especificando o número de caracteres entre / e /.

Isso funciona

cat test* | awk '{if($4 ~ /^\/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\//) print $0}'

Mas isso não acontece

cat test* | awk '{if($4 ~ /^\/[a-zA-Z0-9]{8,}\//) print $0}'

O que estou perdendo?

Eu também tentei:

cat test* | awk '$4 ~ /^\/[a-zA-Z0-9]{8}\// {print $0}'

que também não funcionou.

ATUALIZAÇÃO: Eu também tentei os mesmos comandos usando o gawk, que também está disponível para eu usar, e eles ainda não funcionaram.

    
por user112802 29.05.2015 / 05:12

2 respostas

2
cat test* | gawk --re-interval '$4 ~ /^\/[a-zA-Z0-9]{8}\// {print $0}'
# OR
cat test* | gawk --re-interval '{if( $4 ~ "^/[a-zA-Z0-9]{8}/") {print $0}}'

Do manpage do GNU awk:

  • - reintervalo -           Habilite o uso de expressões de intervalo em regulares           correspondência de expressão

Re também garantindo que pelo menos um dígito numérico seja incluído:

gawk --re-interval '$4 ~ "^/[a-zA-Z0-9]{8}/" &&
                    $4 ~ "^/[^/]{0,7}[0-9]" {print $0}'
    
por 29.05.2015 / 06:06
0

por que não tentar ...?

awk -F/ 'length($2) == 8 ' 
  • -F/ use / como separador
  • length($2) compute length
  • ação awk padrão, imprima
por 29.05.2015 / 12:21

Tags