Grep expressão regular para mostrar apenas números de série (comprimento definido contendo Alpha & Digit) no arquivo CSV

1

Eu tenho muitos arquivos CSV (enormes e caóticos) com um monte de números de série (Cisco).

Meu objetivo é extraí-los (BTW: E chamar a API da Cisco mais tarde para obter feedback de cobertura de serviço / suporte)

Agora estou procurando uma maneira correta de lidar com esse arquivo CSV.

Estou interessado se houver outros E também por que meu primeiro "preferido" não funciona - está usando uma classe nomeada que contém uma combinação de [: alpha:] AND [: digit:].

To decipher the serial number, here's how it is composed.

Cisco S/N format is: LLLYYWWXXXX.

LLL = Location code (i.e. FOC = FoxConn China)

YY = Year code (08 = 2004...09=2005...etc...)

WW = Week code (weeks 01 to 52)

XXXX = Base-34 Alpha Numeric Unique identifier (Includes 0 to 9 & entire alphabet except I & O).

Fonte: link

# Doesn't Work

grep -E -o -w "[[:alnum:]]{11}" Inventory.csv | head
Description
UNIVERSALK9
techsupport
FCW203.....
UNIVERSALK9
techsupport
FCW203.....
UNIVERSALK9
techsupport
FDO201.....
[..]

# Does work

grep -o -w -P '([A-Z]){3}[0-9]{4}[[:alnum:]]{4}' Inventory.csv
FCW1234A1EF
FCW1234A1NG
FDO1234A1KB
FDO1234A103
FOC1234A137
FCW1234A10A
FOC1234A1GH
FOC1234A1GU
[..]
    
por SchmuFoo 05.09.2018 / 16:54

1 resposta

0

Seu grep inicial era muito "solto", como expressões regulares. Você pediu por [[:alnum:]]{11} , o que significa 11 "alfanuméricos", o que permite que esses termos não-serial-número da Cisco:

  • techsupport
  • Descrição
  • UNIVERSALK9

Seu segundo grep é "mais apertado", o que significa que é um pouco mais restritivo no que ele irá corresponder. Ainda não é um ótimo ajuste para um número de série da Cisco, porém, de duas maneiras:

  • [0-9]{4} permitirá 4 dígitos, de zero a nove; isso permitirá dados "semanais" inválidos, como 0899 ou 0900 .
  • [[:alnum:]]{4} permitirá quatro alfanuméricos, o que permitirá o I e O proibidos.

Seu segundo grep irá capturar qualquer e todos os números de série da Cisco, já que permite mais que os requisitos, mas também será enganado para permitir números de série inválidos.

Eu poderia abordar um arquivo confuso com o awk, porque ele permite uma correspondência poderosa de padrões e manipulação de strings. O script awk abaixo faz duas coisas, em alto nível:

  1. percorre todas as linhas de entrada, procurando por algo que possa ser um número de série da Cisco
  2. nessas linhas de entrada, procure todas as correspondências possíveis; contanto que haja uma correspondência, extraia esse número de série e execute um teste adicional (verificando se o valor de "semana" é válido). Você pode realizar testes de "ano" aqui, se souber mais sobre o que espera desses valores. Da mesma forma, para o código de localização, se você espera que um conjunto menor de locais apareça.

A única outra coisa que fiz foi ajustar a expressão regular para ficar mais tight em relação à seção Base-34.

Aqui está o script:

awk '
        BEGIN {
                recisco="[A-Z]{3}[0-9]{4}[0-9ABCDEFGHJKLMNPQRSTUVWXYZ]{4}"
        }
        $0 ~ recisco {
                while(match($0, recisco) > 0) {
                        week=substr($0, RSTART+5, 2);
                        if (week > 1 && week < 54) {
                                print "Found: "substr($0,RSTART,RLENGTH)
                        }
                        $0=substr($0, RSTART+RLENGTH);
                }
        }'
    
por 05.09.2018 / 20:14