English 中文(简体)
如何使用grep查找损坏的NMEA日志语句?
原标题:
  • 时间:2008-08-31 10:04:35
  •  标签:

我的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
	%s
" % (log, line)

有没有一种方法可以用grepawk或者其他简单的东西来做到这一点?我还没有真正弄清楚如何让grep做我想做的事情。

更新:感谢@Motti和@Paul,我能够让以下内容几乎完成我想要的操作,但必须使用单引号并删除尾随的$才能工作:

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

还有两个问题出现了,我如何让它忽略空白行?我能把最后两个<code>grep</code>组合起来吗?

问题回答

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

grep -Ev "^$.**[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER
  • -E use extended regexp
  • -v Show lines that do not match
  • ^ starts with
  • .* anything
  • * an asterisk
  • [0-9A-Fa-f] hexadecimal digit
  • {2} exactly two of the previous
  • $ end of line
  • | grep -v ADVER weed out the ADVER lines

莫蒂,HTH。

@Motti的回答不会忽略ADVER行,但您可以很容易地将该grep的结果传输到另一个:

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

@汤姆(换了个说法)我必须去掉后面的$才能工作

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

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

@汤姆。我能把最后两个grep组合起来吗?

grep -Ev "ADVER|ADPMB"

@格言:组合<code>grep</code>s不起作用,它没有效果。

我知道,如果没有后面的$,其他东西可能会跟随校验和&;仍然匹配,但它根本不起作用,所以我别无选择。。。

GNU grep 2.5.3和GNU bash 3.2.39(1),如果这有什么不同的话。

而且看起来日志文件使用的是DOS换行符(CR+LF)。<code>grep</code>是否需要一个开关来正确处理?

@汤姆

GNU grep 2.5.3 and GNU bash 3.2.39(1) if that makes any difference. And it looks like the log files are using DOS line-breaks (CR+LF). Does grep need a switch to handle that properly?

我在Windows上使用grep(GNU grep)2.4.2(真遗憾(





相关问题
热门标签