如何用grep查找损坏的NMEA日志语句?

时间:2008-08-31 10:04:36

标签: regex grep gps nmea

我的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)

有没有办法用grepawk或简单的方法做到这一点?我还没弄明白如何让grep做我想做的事。

更新:感谢@Motti和@Paul,我能够得到以下内容几乎完成我想要的操作,但必须使用单引号并删除前面的$。会工作:

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

又出现了两个问题,如何让它忽略空行?我可以合并最后两个grep s?

5 个答案:

答案 0 :(得分:3)

最低限度的测试表明应该这样做:

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER
  • -E使用扩展的regexp
  • -v显示匹配
  • 的行
  • ^以
  • 开头
  • 。*任何
  • \ *星号
  • [0-9A-Fa-f]十六进制数字
  • {2}前两个正好两个
  • $ end of line
  • | grep -v ADVER清除了ADVER行

HTH,Motti。

答案 1 :(得分:1)

@Motti的回答不会忽略ADVER行,但是你可以轻松地将grep的结果传递给另一个:

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

答案 2 :(得分:1)

  

@Tom(改述)我不得不删除尾随的$ for it

删除$意味着该行可能以其他内容结束(例如,将接受以下内容)

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

@Tom我可以结合最后两个greps吗?

grep -Ev "ADVER|ADPMB"

答案 3 :(得分:0)

@Motti:将grep组合起来不起作用,它没有效果。

据我所知,如果没有跟踪$其他内容可能会产生校验和&仍然匹配,但它根本不起作用所以我别无选择......

GNU grep 2.5.3和GNU bash 3.2.39(1)如果有任何区别。

看起来日志文件正在使用DOS换行符(CR + LF)。 grep是否需要切换才能正确处理?

答案 4 :(得分:0)

@汤姆

  

GNU grep 2.5.3和GNU bash 3.2.39(1)如果有任何区别。   看起来日志文件使用DOS换行符(CR + LF)。 grep是否需要一个开关才能正确处理?

我在Windows上使用grep (GNU grep) 2.4.2(为了羞耻!)它对我有效(并且自然接受DOS换行符),我现在无法访问其他操作系统,所以我对不起,但我无法再帮助你了:o(