Как найти неверные предложения журнала NMEA с помощью grep? - PullRequest
4 голосов
/ 31 августа 2008

Мой GPS-регистратор иногда оставляет «незаконченные» строки в конце файлов журнала. Я думаю, что они только в конце, но я хочу проверить все строки на всякий случай.

Примерное предложение выглядит следующим образом:

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

Строка должна начинаться со знака $ и заканчиваться * и двухсимвольной шестнадцатеричной контрольной суммой. Мне все равно, правильна ли контрольная сумма, просто она присутствует. Также необходимо игнорировать предложения "ADVER", которые не имеют контрольной суммы и находятся в начале каждого файла.

Может работать следующий код Python:

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)

Есть ли способ сделать это с помощью grep или awk или чего-то простого? Я действительно не понял, как заставить grep делать то, что я хочу.

Обновление : Спасибо @Motti и @Paul, я смог получить следующее, чтобы сделать почти то, что хотел, но мне пришлось использовать одинарные кавычки и удалить конечный $, прежде чем он заработал:

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

Возникают еще два вопроса: как я могу игнорировать пустые строки? И можно ли объединить последние два grep с?

Ответы [ 5 ]

3 голосов
/ 31 августа 2008

Минимум тестирования показывает, что для этого нужно:

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER
  • -E использовать расширенное регулярное выражение
  • -v Показать строки, которые не соответствуют
  • ^ начинается с
  • . * Что-нибудь
  • \ * звездочка
  • [0-9A-Fa-f] шестнадцатеричная цифра
  • {2} ровно два из предыдущих
  • $ конец строки
  • | grep -v ADVER отсеять линии ADVER

HTH, Motti.

1 голос
/ 02 сентября 2008

@ Том (перефразировано) Мне пришлось убрать конечный $, чтобы он заработал

Удаление символа $ означает, что строка может заканчиваться чем-то другим (например, будет принято следующее)

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

@ Том. А можно мне объединить последние две команды?

grep -Ev "ADVER|ADPMB"
1 голос
/ 31 августа 2008

@ Ответ Мотти не игнорирует строки ADVER, но вы легко передаете результаты этого grep другому:

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt |grep -v ADVER
0 голосов
/ 04 сентября 2008

@ Том

GNU grep 2.5.3 и GNU bash 3.2.39 (1), если это имеет значение. И похоже, что файлы журналов используют разрывы строк DOS (CR + LF). Для корректной работы grep нужен переключатель?

Я использую grep (GNU grep) 2.4.2 в Windows (для позора!), И это работает для меня (и разрывы строки DOS естественно принимаются), в настоящий момент у меня нет доступа к другим ОС, поэтому извините, но я больше не смогу вам помочь: o (

0 голосов
/ 02 сентября 2008

@ Мотти: Объединение grep не работает, оно не имеет никакого эффекта.

Я понимаю, что без конечного $ что-то еще может следовать за контрольной суммой и все равно совпадать, но это не сработало вообще, поэтому у меня не было выбора ...

GNU grep 2.5.3 и GNU bash 3.2.39 (1), если это имеет какое-либо значение.

И похоже, что в файлах журнала используются переносы строк DOS (CR + LF). grep нужен ли переключатель для правильной работы?

...