sedコマンドを使用してJSONファイルの数をMD5ハッシュに置き換えるにはどうすればよいですか?

sedコマンドを使用してJSONファイルの数をMD5ハッシュに置き換えるにはどうすればよいですか?

次の例のような行を含むJSON形式の大容量ログファイルがあります。

{"data_1":210,"target_number":1096748811,"extra_data":66}
{"data_1":0,"target_number":7130881445,"extra_data":56}
{"data_1":1712,"target_number":1098334917,"extra_data":48}
{"data_1":0,"target_number":3062674667,"extra_data":54}
{"data_1":53,"target_number":5110609228,"extra_data":246}

target_number値をファイル全体のMD5ハッシュに置き換えたいと思います。

sed次の基本構文を使用してコマンドを試しています。

sed -i 's/target_number/target_number_md5/' input.log

上記の例の最初の項目の推定出力は次のとおりです。

{"data_1":210,"target_number":620e25e6f054992308c564cb883e4940,"extra_data":66}

ベストアンサー1

次のコマンドを使用してくださいミラー()JSON入力を解析します(「JSONライン」を読むにはmlrMillerバージョン6以降を使用する必要があります)。次に、サブコマンドを使用してキー値を変更します。修正は、標準入力に渡された元の値を呼び出すことによって行われます。次に、応答からMD5ハッシュを除くすべてのエントリを削除して結果文字列を削除します。--jsonl--jsonputtarget_numberopenssl md5

mlr --json put '
    $target_number = system("printf \"" . $target_number . "\" | openssl md5");
    $target_number = sub($target_number, ".*= ", "")' file

md5sumGNU coreutilsを使用するには、openssl md5上記の内容をmd5sum --tag

md5ユーティリティ(通常はBSDシステムで見つかります)を使用すると、printfパイプを避けることができます。

mlr --json put '
    $target_number = system("md5 -s \"" . $target_number . "\"");
    $target_number = sub($target_number, ".*= ", "")' file

質問の例では、上記の各コマンドの出力は次のようになります。

{ "data_1": 210, "target_number": "620e25e6f054992308c564cb883e4940", "extra_data": 66 }
{ "data_1": 0, "target_number": "f83d74be3dcb71d53263aefdf08203a9", "extra_data": 56 }
{ "data_1": 1712, "target_number": "56ae797ad2c16813d1a6168d28b58d89", "extra_data": 48 }
{ "data_1": 0, "target_number": "81394a193503036fad53b8a9d6ca2456", "extra_data": 54 }
{ "data_1": 53, "target_number": "6f01490a5dc694e51a69b79f7dd21c24", "extra_data": 246 }

MD5ハッシュは10進数以外の文字列なので、生成されたJSON文書に文字列として挿入されます。

mlrこのオプションを使用すると、Millerは入力ファイルを生成された文書に置き換えることができます(つまり、「所定の位置で」編集)-I

target_number上記の各コマンドは呼び出し時に生の値をsystem()削除せずに使用するため、そうするとコード注入の脆弱性が発生します。

おすすめ記事