2017-05-24 3 views
1

JQ私はテキスト文字列を変換し、既存のJSONオブジェクト</p> <p>現在のJSON出力にそれらを追加するにはどうすればよい

{ 
    "start process": "Wed May 24 05:22:35 UTC 2017", 
    "logfilename": "log_test" 
} 
{ 
    "start filelist": [ 
    "/downloads/json_log_array2object.jq", 
    "/downloads/json_log_string2object.jq", 
    "/downloads/log_test.json", 
    "/downloads/log_test.txt", 
    "/downloads/test_logs.sh" 
    ] 
} 

ターゲットJSON出力:

{ 
    "start process": "Wed May 24 05:22:35 UTC 2017", 
    "logfilename": "log_test", 
    "start filelist": [ 
    "/downloads/json_log_array2object.jq", 
    "/downloads/json_log_string2object.jq", 
    "/downloads/log_test.json", 
    "/downloads/log_test.txt", 
    "/downloads/test_logs.sh" 
    ] 
} 

bashスクリプト:

logfilename="log_test" 

writelogstring2object() { 
    exec 4>>"${1}.json" 
    flock -x 4 
    tee -a "$1.txt" | jq -sRf json_log_string2object.jq >&4 
} 

writelogarray2object() { 
    exec 4>>"${1}.json" 
    flock -x 4 
    tee -a "$1.txt" | jq -nRf json_log_array2object.jq >&4 
} 

exec 3> >(writelogstring2object "$logfilename") 
{ 
echo "start process: $(date -u)" 
echo "logfilename:" $logfilename 
} >&3 
exec 3>&- 
flock -s "$logfilename.json" -c : 

exec 3> >(writelogarray2object "$logfilename") 
{ 
echo "start filelist:" 
printf '%s\n' "$PWD"/* 
} >&3 
exec 3>&- 
flock -s "$logfilename.json" -c : 

JQプログラム:

json_log_string2object.jq

def trim: sub("^ +";"") | sub(" +$";""); 

def s2o: 
    (index(":") // empty) as $ix 
    | {(.[:$ix]): (.[$ix+1:]|trim)}; 

split("\n") | map(s2o) | add 

json_log_array2object.jq

foreach (inputs,null) as $line ({}; 
    if $line == null then .emit = {(.key|tostring): .value} 
    elif $line[-1:] == ":" 
    then (if .key then {emit: {(.key): .value}} else null end) 
     + { key : $line[0:-1] } 
    else {key, value: (.value + [$line])} 
    end; 
    .emit // empty) 

は$一、二JSONオブジェクトを追加するにはアプローチと例

答えて

1
  1. に感謝し、$ 2つで、$one + $twoと書くことができます。

  2. 問題の説明の冒頭に示す2つのオブジェクトは、JSONとしてはあまり有効ではありません。ファイルinput.jsonに訂正されたテキストが含まれていると仮定すると、呼び出しは:

    jq -s '[0] +。[1] 'input.json

は、目的の答えが得られます。

+0

ありがとうございます、それは関数として実装された2つのオブジェクトを追加するのに非常にうまく機能します。前のオブジェクトをどのように削除しますか?あるいは、ログに1つのオブジェクトしか作成されないように、次のオブジェクトの作成時にaddをインクルードする方法がありますか? – Gabe

+0

'writelogarray2object()'がファイル記述子JSONオブジェクトをログファイルJSONオブジェクトに追加するように実装しようとしています。しかし、ログファイルに別の「追加された」オブジェクトを書き込むため、これは部分的な解決策に過ぎないと考えています。ログファイル内のJSONオブジェクトを1つのJSONオブジェクトログファイルに後処理するのを避けようとしましたが、それ以外の方法はわかりません。 – Gabe

関連する問題