16進数値を含むファイルを読み取り、処理する

16進数値を含むファイルを読み取り、処理する

プログラムによって行われたメモリ参照のトレース 3列目の値を読み取り、同じ列の他の値との差を見つけたいです。これを試しました

#!/usr/bin/awk -f
 NR==1 {prev=$3;next; }
dif=prev - $3;
{printf "%x",dif}
{print $3, dif > "diff"}

しかし、値は 16 進数なので、差としてゼロが返されます。

答え1

問題は、入力時に awk が 16 進数を自動的に解釈しないことです。 関数を使用して明示的に解釈するように要求する必要があります。 したがって、コードで数値が必要な場合は、を にstrtonum置き換えます。$3strtonum($3)

これをテストファイルとして考えてみましょう:

$ cat file
0x7f7488c4e6d7: R 0x7f7488b169ce
0x7f7488c4e6e9: R 0x7f7488b169cc
0x7f7488c4e6f8: R 0x7f7488b169d0

これをスクリプトとして使用してみましょう:

$ cat a.awk
#!/usr/bin/awk -f
NR==1 {
    prev=strtonum($3)
    next
}
{
    dif=prev - strtonum($3)
    printf "%x\n",dif
    print $3, dif > "diff"
}

画面出力は次のようになります。

$ ./a.awk file
2
fffffffffffffffe

出力ファイルは次のとおりです。

$ cat diff
0x7f7488b169cc 2
0x7f7488b169d0 -2

関連情報