2008-08-31 71 views
4

我的GPS记录器偶尔会在日志文件的末尾留下“未完成”的行。我想他们只是在最后,但我想检查所有线路以防万一。如何使用grep找到损坏的NMEA日志句子?

样本完整的句子是这样的:

$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和@保罗,我是能够得到以下几乎做了我想要的东西,但必须使用单引号和删除尾随$之前,它的工作:

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显示该做比赛
  • ^开始与
  • 线
  • 。*任何东西
  • \ *星号
  • [0-9A-发F]的十六进制数字
  • {2}正好两个线的先前
  • $端的
  • | grep -v ADVER剔除ADVER行

HTH,Motti。

1

@ Motti的回答没有忽视ADVER行,但你轻松管道将grep的结果到另一个:

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

@汤姆(转述),我不得不删除尾随$为它工作

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

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

@汤姆,我可以结合过去两年里grep?

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

@汤姆

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

我在Windows上使用grep (GNU grep) 2.4.2(真丢脸!),它为我的作品(和DOS的换行符被自然而然地接受了),我真的没有在目前访问其他操作系统,所以我”对不起,但我无法进一步帮助你:o(