次のファイルがあります。
{
"1": {
"state": "RUNNING",
"stats": {
"name": "some-file",
"uris": [
"some-example.com"
],
"host": "127.0.0.1",
"port": 8080,
"uptime": 168,
"mem_quota": 2147483648,
"disk_quota": 2147483648,
"fds_quota": 16384,
"usage": {
"time": "2016-09-13 07:39:40 +0000",
"cpu": 0.30315522606369516,
"mem": 1069568000,
"disk": 237203456
}
}
},
"0": {
"state": "RUNNING",
"stats": {
"name": "some-file2",
"uris": [
"some-example-e.com"
],
"host": "127.0.0.2",
"port": 8081,
"uptime": 169,
"mem_quota": 2147483648,
"disk_quota": 2147483648,
"fds_quota": 16384,
"usage": {
"time": "2016-09-13 07:39:40 +0000",
"cpu": 0.3086296386531593,
"mem": 1073180672,
"disk": 237203456
}
}
},
"2": {
"state": "RUNNING",
"stats": {
"name": "some-file3",
"uris": [
"some-example.com"
],
"host": "127.1.20.3",
"port": 8190,
"uptime": 168,
"mem_quota": 2147483648,
"disk_quota": 2147483648,
"fds_quota": 16384,
"usage": {
"time": "2016-09-13 07:39:40 +0000",
"cpu": 0.31213565359044587,
"mem": 1072861184,
"disk": 237203456
}
}
}
}
cpu、mem、diskの値を抽出して、次の形式のファイルに入れる必要があります。
0.30315522606369516,1069568000,237203456,0.3086296386531593,1073180672
基本的にはそうしなければならない
first_instance_cpu,first_instance_mem,first_instance_disk,second_instance_cpu,second_instance_mem...
私はあなたがこれを理解することを願っています。
grep
これらの値を取得するには、次の文を使用します。
grep -Eow '"(cpu|mem|disk)": [0-9.]+' SampleOutput | grep '[0-9.]'
これは私に次のような結果を与えます
"cpu": 0.30315522606369516
"mem": 1069568000
"disk": 237203456
"cpu": 0.3086296386531593
"mem": 1073180672
"disk": 237203456
"cpu": 0.31213565359044587
"mem": 1072861184
"disk": 237203456
数字(一致)を赤で強調表示したいです。数字だけが必要ですが、-o
2番目のgrep
コマンドでそのオプションを使用するともちろん数字が得られますが、各数字は以下のように別の行にあります。
0
.
3
3
1
...など。
他の行で少なくとも整数である結果を取得するには?その後、trなどを使用してコンマで区切ることができます。
答え1
ファイルはJSON形式なので、次を使用します。ジャック:
jq '
flatten |
map(.stats.usage | del(.time)) |
map([.cpu, .mem, .disk]) |
flatten |
.[]' <file.json | \
paste -sd ,
出力:
0.30315522606369516,1069568000,237203456,0.3086296386531593,1073180672,237203456,0.31213565359044587,1072861184,237203456
答え2
$ grep -Po '"(cpu|mem|disk)": \K[\d.]+' SampleOutput | paste -sd , -
0.30315522606369516,1069568000,237203456,0.3086296386531593,1073180672,237203456,0.31213565359044587,1072861184,237203456
grep
サポートされている実装は-o
通常-P
PCRE もサポートします。これは\K
、PCREバージョン7.2(2007年6月19日以降)で一致するテキストの先頭をリセットするために使用できます(したがって、右側の一致のみが出力されgrep -o
ます)。
あなたの方法はそれほど遠くありません。つまり、次grep -o '[0-9.]'
のように置き換えてください。grep -oE '[0-9.]+'
注文1つの数字または点ではなく、1つ以上の数字または点。
答え3
解決策もありますjq
:
jq -r '.[].stats.usage|[.cpu,.mem,.disk]|@csv' f.json