4

我的 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有没有办法用or或简单的东西来做到这awk一点?我还没有真正想出如何grep去做我想做的事。

更新:感谢@Motti 和@Paul,我几乎可以完成以下操作,但必须使用单引号并删除尾随$才能起作用:

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

还有两个问题,我怎样才能让它忽略空行?我可以结合最后两个greps 吗?

4

5 回答 5

3

最少的测试表明应该这样做:

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER
  • -E 使用扩展正则表达式
  • -v 显示匹配的行
  • ^ 开头
  • 。* 任何事物
  • \* 一个星号
  • [0-9A-Fa-f] 十六进制数字
  • {2} 正好是前两个
  • $ 行尾
  • | grep -v ADVER清除 ADVER 行

HTH,莫蒂。

于 2008-08-31T11:24:27.220 回答
1

@Tom(改写)我必须删除尾随 $ 才能工作

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

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

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

grep -Ev "ADVER|ADPMB"
于 2008-09-02T08:26:49.407 回答
1

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

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt |grep -v ADVER
于 2008-08-31T12:56:11.570 回答
0

@Motti:结合greps 不起作用,它没有效果。

我知道如果没有尾随$其他东西可能会跟随校验和并且仍然匹配,但它根本不起作用所以我别无选择......

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

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

于 2008-09-02T13:32:52.013 回答
0

@汤姆

GNU grep 2.5.3 和 GNU bash 3.2.39(1) 如果这有什么不同的话。看起来日志文件正在使用 DOS 换行符 (CR+LF)。grep 是否需要一个开关才能正确处理?

grep (GNU grep) 2.4.2在 Windows 上使用(真遗憾!)它对我有用(并且自然接受 DOS 换行符),我目前无法访问其他操作系统,所以很抱歉,但我不会能够进一步帮助你:o(

于 2008-09-04T08:25:58.003 回答