2008-08-31 2 views
4

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

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

$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, чтобы делать то, что я хочу.

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

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

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

ответ

3

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

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

HTH, Motti.

1

@ ответ Моти в не игнорировать Adver линии, но вы легко передать результаты этого Grep к другому:

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

@tom (перефразировать) я должен был удалить косую $ за это работа

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

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

@tom И я могу объединить два последних отбирает?

grep -Ev "ADVER|ADPMB" 
0

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

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

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

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

0

@tom

ГНУ Grep 2.5.3 и ГНУ Баш 3.2.39 (1), если это делает никакой разницы. И похоже, что файлы журнала используют разрывы DOS (CR + LF). Требуется ли grep переключателю для правильной обработки?

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