次の例のような行を含む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ライン」を読むにはmlr
Millerバージョン6以降を使用する必要があります)。次に、サブコマンドを使用してキー値を変更します。修正は、標準入力に渡された元の値を呼び出すことによって行われます。次に、応答からMD5ハッシュを除くすべてのエントリを削除して結果文字列を削除します。--jsonl
--json
put
target_number
openssl md5
mlr --json put '
$target_number = system("printf \"" . $target_number . "\" | openssl md5");
$target_number = sub($target_number, ".*= ", "")' file
md5sum
GNU 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()
削除せずに使用するため、そうするとコード注入の脆弱性が発生します。