files regex grep gps nmea

regex - files - search file grep command



¿Cómo encuentro frases de registro NMEA rotas con grep? (5)

Mi registrador de GPS ocasionalmente deja líneas "inacabadas" al final de los archivos de registro. Creo que solo están al final, pero quiero verificar todas las líneas por si acaso.

Una oración completa de muestra se ve así:

$GPRMC,005727.000,A,3751.9418,S,14502.2569,E,0.00,339.17,210808,,,A*76

La línea debe comenzar con un signo $ y terminar con una suma de comprobación * y dos caracteres hexadecimales. No me importa si la suma de comprobación es correcta, solo que está presente. También debe ignorar las frases "ADVERTE" que no tienen suma de comprobación y están al inicio de cada archivo.

El siguiente código de Python podría funcionar:

import re from path import path nmea = re.compile("^/$.+/*[0-9A-F]{2}$") for log in path("gpslogs").files("*.log"): for line in log.lines(): if not nmea.match(line) and not "ADVER" in line: print "%s/n/t%s/n" % (log, line)

¿Hay alguna manera de hacer eso con grep o awk o algo simple? Realmente no he descubierto cómo hacer que grep haga lo que quiero.

Actualización : Gracias @Motti y @Paul, pude hacer lo siguiente para hacer casi lo que quería, pero tuve que usar comillas simples y eliminar los $ finales antes de que funcionara:

grep -nvE ''^/$.*/*[0-9A-F]{2}'' *.log | grep -v ADVER | grep -v ADPMB

Surgen otras dos preguntas, ¿cómo puedo hacer que ignore las líneas en blanco? ¿Y puedo combinar los dos últimos grep s?


@Tom (reformulado) tuve que eliminar los $ finales para que funcione

Eliminar $ significa que la línea puede terminar con algo más (por ejemplo, se aceptará lo siguiente)

$GPRMC,005727.000,A,3751.9418,S,14502.2569,E,0.00,339.17,210808,,,A*76xxx

@Tom ¿Y puedo combinar los dos últimos greps?

grep -Ev "ADVER|ADPMB"


@Motti: la combinación de grep s no funciona, no tiene ningún efecto.

Entiendo que sin el resto $ algo más puede seguir la suma de comprobación y la coincidencia, pero no funcionó para nada, así que no tuve elección ...

GNU grep 2.5.3 y GNU bash 3.2.39 (1) si eso hace alguna diferencia.

Y parece que los archivos de registro usan saltos de línea de DOS (CR + LF). ¿ grep necesita un interruptor para manejarlo correctamente?


@Tom

GNU grep 2.5.3 y GNU bash 3.2.39 (1) si eso hace alguna diferencia. Y parece que los archivos de registro usan saltos de línea de DOS (CR + LF). ¿Grep necesita un interruptor para manejarlo correctamente?

Estoy usando grep (GNU grep) 2.4.2 en Windows (¡lástima!) Y funciona para mí (y los saltos de línea de DOS son naturalmente aceptados), realmente no tengo acceso a otros SO en este momento, así que Lo siento, pero no podré ayudarte más: o (


El mínimo de pruebas muestra que esto debería hacerlo:

grep -Ev "^/$.*/*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER

  • -E usa la expresión regular ampliada
  • -v Mostrar líneas que no coinciden
  • ^ comienza con
  • .* cualquier cosa
  • /* Un asterisco
  • [0-9A-Fa-f] dígito hexadecimal
  • {2} exactamente dos de los anteriores
  • $ fin de línea
  • | grep -v ADVER elimina las líneas de ADVERP

HTH, Motti.


La respuesta de @Motti no ignora las líneas de PUBLICIDAD, pero usted fácilmente canaliza los resultados de ese grep a otro:

grep -Ev "^/$.*/*[0-9A-Fa-f]{2}$" a.txt |grep -v ADVER