4

私の GPS ロガーは時折、ログ ファイルの最後に「未完成」の行を残します。最後までだと思いますが、念のため全行確認したいと思います。

サンプルの完全な文は次のようになります。

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

$行は記号で始まり*、2 文字の 16 進チェックサムで終わる必要があります。チェックサムが正しいかどうかは気にしません。存在するだけです。チェックサムがなく、すべてのファイルの先頭にある「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

さらに 2 つの疑問が生じます。空白行を無視するにはどうすればよいですか? そして、最後の 2 つの s を組み合わせることができgrepますか?

4

5 に答える 5

3

最小限のテストは、これがそれを行うべきであることを示しています:

grep -Ev "^\$.*\*[0-9A-Fa-f]{2}$" a.txt | grep -v ADVER
  • -E拡張正規表現を使用します
  • -v一致しない行を表示する
  • ^で始まる
  • 。* なんでも
  • \*アスタリスク
  • [0-9A-Fa-f]16進数
  • {2}前のちょうど2つ
  • $行末
  • | grep -v ADVERADVERラインを取り除く

HTH、モッティ。

于 2008-08-31T11:24:27.220 に答える
1

@Mottiの答えはADVER行を無視しませんが、そのgrepの結果を別のgrepに簡単にパイプできます。

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

@Tom(言い換え)動作させるには、末尾の $ を削除する必要がありました

$ を削除すると、行が別のもので終了する可能性があります (たとえば、次は受け入れられます)。

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

@Tomそして、最後の2つのgrepを組み合わせることができますか?

grep -Ev "ADVER|ADPMB"
于 2008-09-02T08:26:49.407 に答える
0

@トム

違いが生じる場合は、GNUgrep2.5.3およびGNUbash3.2.39(1)。また、ログファイルはDOS改行(CR + LF)を使用しているようです。grepはそれを適切に処理するためにスイッチを必要としますか?

私はgrep (GNU grep) 2.4.2Windowsで使用しています(恥ずかしいです!)そしてそれは私のために働きます(そしてDOSの改行は自然に受け入れられます)、私は現在他のOSに実際にアクセスできないので申し訳ありませんが私はしませんさらにあなたを助けることができる:o(

于 2008-09-04T08:25:58.003 に答える
0

@Motti: greps を組み合わせても機能しません。効果はありません。

末尾がなければ、他の$何かがチェックサムに従い、それでも一致する可能性があることを理解していますが、まったく機能しなかったため、選択の余地がありませんでした...

GNU grep 2.5.3 と GNU bash 3.2.39(1) に違いがある場合。

また、ログ ファイルは DOS の改行 (CR+LF) を使用しているようです。grepそれを適切に処理するためにスイッチが必要ですか?

于 2008-09-02T13:32:52.013 に答える