Как найти неработающие предложения журнала NMEA с помощью grep?

Мой регистратор 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?


person Tom    schedule 31.08.2008    source источник


Ответы (5)


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

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

HTH, Мотти.

person Motti    schedule 31.08.2008

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

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

@Tom (перефразировано) Мне пришлось удалить завершающий $, чтобы он работал

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

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

@Tom А могу ли я объединить два последних grep?

grep -Ev "ADVER|ADPMB"
person Motti    schedule 02.09.2008

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

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

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

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

person Tom    schedule 02.09.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(

person Motti    schedule 04.09.2008