0

データが二重コロン "::" で区切られているログ ファイル (C を使用) を処理したい。ツールはこれが好きawkで、これを行うのsedに非常に効率的だと思います。しかし、awk 出力値が私の C 変数に渡される可能性はありますか? たとえば、1 つのログ情報は次のようになります。

a::b::c::d  

私はstruct4つのint要素で構成されています。4つの部分を構造体要素に保存する方法は? 別の方法として libary call
を使用することも考えましたが、呼び出す前に、大量のログ情報から適切な行を選別する必要があり、 orについてさらに考えさせられます。 ご協力ありがとうございました。より良い選択肢がある場合は、それを共有するのはとても親切です.strtoksedgrep

更新: 「指定された値に従って一致した行を並べ替える」など、上記のすべてが実行時に行われ、それらを処理してから値を保存することを強調するのを忘れていました。scanfは問題ありstringませんが、内部にスペースがある値がある場合はどうなりますか?

4

3 に答える 3

1

strtokあなたが本当にそれを必要とするまで、私は近づかないでしょう。これは で行うことができますscanf

scanf("%d::%d::%d::%d", &a, &b, &c, &d);

そして、 、 、 の 3 つのツールのうちsed、「適切な行を選別する」という詳細に大きく依存します。値を検出するには問題ありません。とははるかに強力なツールですが、学習には多くの時間を費やす必要があります (どちらも Turing-Complete プログラミング言語です)。awkgrepgrepawksed

于 2013-02-04T13:22:49.770 に答える
1

4 つの整数フィールドを持つ構造体へのポインター "s" と、開いている FILE "ログファイル" があると仮定します。

    res = fscanf(logfile, "%d::%d::%d::%d", &s->field0, &s->field1, &s->field2, &s->field3);
于 2013-02-04T13:23:17.950 に答える
1

いつでも複数のツールを組み合わせて使用​​できます。たとえば、ログ ファイルが file にあるとしますlog.out

次にgrep、興味のある行を選択するために使用できます。

grep "^-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+$" log.out

別のファイルとして保存するか、プログラムに直接渡すことができます

grep ... | ./analyze_data

プログラムの名前がanalyze_data. プログラムのソースでは、必要な値を読み取ってstdin保存するだけです。

scanf("%d::%d::%d::%d", &a, &b, &c, &d);

もちろん、適切なエラーチェックを行います。

于 2013-02-04T13:24:04.320 に答える