2008-08-31 36 views
4

Mon enregistreur GPS laisse occasionnellement des lignes "non finies" à la fin des fichiers journaux. Je pense qu'ils sont seulement à la fin, mais je veux vérifier toutes les lignes juste au cas où.Comment trouver des phrases de journal NMEA avec grep?

Un échantillon phrase complète ressemble:

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

La ligne doit commencer par un signe $, et se terminer par un * et une somme de contrôle hexagonale deux caractères. Je m'en fous si la somme de contrôle est correcte, juste que c'est présent. Il doit également ignorer les phrases "ADVER" qui n'ont pas la somme de contrôle et sont au début de chaque fichier.

Le code Python suivant pourrait fonctionner:

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) 

Est-il possible de le faire avec grep ou awk ou quelque chose de simple? Je n'ai pas vraiment compris comment obtenir grep pour faire ce que je veux.

Mise à jour: Merci @Motti et @ Paul, j'ai pu obtenir ce qui suit pour faire presque ce que je voulais, mais il a dû utiliser des guillemets simples et enlever le $ avant de fuite ça marcherait:

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

Deux autres questions se posent, comment puis-je lui faire ignorer les lignes vides? Et puis-je combiner les deux derniers grep s?

Répondre

3

Le minimum d'essais montre que cela devrait le faire:

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER 
  • -E utilisation regexp étendue
  • lignes -v Montrer qui ne pas match de
  • ^commence par
  • . * N'importe quoi
  • \ * un astérisque
  • [0-9A-Fa-f] chiffres hexadécimaux
  • {2} exactement deux du précédent
  • $ end de la ligne
  • | grep -v ADVER éliminer les lignes ADVER

HTH, Motti.

1

@ réponse de Motti ne pas ignorer les lignes Adver, mais vous facilement conduit les résultats de cette grep à l'autre:

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

@ Tom (reformulée) je devais retirer le $ de suivi à

Supprimer le $ signifie que la ligne peut se terminer par autre chose (par ex.les éléments suivants seront acceptés)

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

Et @ Tom puis-je combiner les deux dernières greps?

grep -Ev "ADVER|ADPMB" 
0

@Motti: En combinant les grep s ne fonctionne pas, il est sans effet.

Je comprends que sans $ quelque chose de fuite d'autre peut la somme de contrôle & folow correspond encore, mais ça n'a pas du tout si j'avais pas le choix ...

GNU grep 2.5.3 et GNU bash 3.2.39 (1) si cela fait une différence.

Et il semble que les fichiers journaux utilisent des sauts de ligne DOS (CR + LF). Est-ce que grep a besoin d'un commutateur pour gérer cela correctement?

0

@ Tom

GNU grep 2.5.3 et GNU bash 02/03/39 (1) si cela fait une différence. Et il semble que les fichiers journaux utilisent des sauts de ligne DOS (CR + LF). Est-ce que grep a besoin d'un commutateur pour gérer cela correctement?

J'utilise grep (GNU grep) 2.4.2 sous Windows (pour la honte!) Et ça marche pour moi, je n'ai pas vraiment accès (et sauts de ligne sont naturellement accepté DOS) à d'autres systèmes d'exploitation au moment donc je Je suis désolé mais je ne serai pas en mesure de vous aider plus loin: o (