我的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
或awk
或简单的方法做到这一点?我还没弄明白如何让grep
做我想做的事。
更新:感谢@Motti和@Paul,我能够得到以下内容几乎完成我想要的操作,但必须使用单引号并删除前面的$
。会工作:
grep -nvE '^\$.*\*[0-9A-F]{2}' *.log | grep -v ADVER | grep -v ADPMB
又出现了两个问题,如何让它忽略空行?我可以合并最后两个grep
s?
答案 0 :(得分:3)
最低限度的测试表明应该这样做:
grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER
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(