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, como0899
ou0900
. -
[[:alnum:]]{4}
permitirá quatro alfanuméricos, o que permitirá oI
eO
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:
- percorre todas as linhas de entrada, procurando por algo que possa ser um número de série da Cisco
- 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);
}
}'