2

以下のJSON出力を「out」ファイルに書き込んでおり、内容は以下の通りです。

$ キャットアウト

{
    "columns": [
        "Tests",
        "Errors",
        "Mean Test Time (ms)",
        "Test Time Standard Deviation (ms)",
        "TPS",
        "Peak TPS"
    ],
    "status": {
        "description": "Collection stopped",
        "state": "Stopped"
    },
    "tests": [
        {
            "description": "Cheetah client test",
            "statistics": [
                0,
                0,
                "NaN",
                0.0,
                0.0,
                0.0
            ],
            "test": 1
        },
        {
            "description": "Reads 95%",
            "statistics": [
                304000,
                0,
                8.7931875,
                7.948696618436826,
                6907.677974959667,
                13594.0
            ],
            "test": 101
        },
        {
            "description": "Writes 5%",
            "statistics": [
                16000,
                0,
                9.963375,
                9.92775949594747,
                363.5619986820878,
                1638.0
            ],
            "test": 102
        }
    ],
    "totals": [
        320000,
        0,
        8.851696875,
        8.063234652303947,
        7271.239973641756,
        14259.0
    ]
}

説明ブロック「読み取り 95%」に関する統計が必要です。以下の形式で配置し、BASH スクリプトを使用して文字列変数に割り当てます。

var=304000,0,8.7931875,7.948696618436826,6907.677974959667,13594.0

よろしくお願いいたします。

4

4 に答える 4

1

これには専用のコマンドライン JSON パーサーを使用する必要があります (例:アンダースコア) :

アンダースコアをインストールすると、次のことができます。

cat data.json | underscore select '.description, .statistics first-child'| tr -d '[]'

編集: Sedのみの解決策(注意して使用してください):

sed -rn '/"description": *"Reads 95%",/,/],/{/statistics|description/!{1h; 1!H;};/],/{x;s/ *\n *|^ *|],//gp;};}' out

# gives 304000,0,8.7931875,7.948696618436826,6907.677974959667,13594.0
于 2013-06-24T10:46:48.200 に答える
0

私の「純粋なシェル」ソリューションは以下のとおりです

cat data.json | sed 's/^[ \t]*//;s/[ \t]*$//' | awk  -F ': *' 'BEGIN { RS=",\n\"|\n}," } { gsub(/[\n\]\[\}]/,"",$2); if ($2) { printf("%s,", $2); } }'
于 2013-06-24T11:56:32.453 に答える
0

出力ファイルには、JSON に解析された Grinder (オープン ソースの負荷テスト ツール) テスト データが含まれています。

curl -s -X GET http://<localhost>:6373/recording/data' | python -mjson.tool > out

~$ cat out

{
    "columns": [
        "Tests",
        "Errors",
        "Mean Test Time (ms)",
        "Test Time Standard Deviation (ms)",
        "TPS",
        "Peak TPS"
    ],
    "status": {
        "description": "Collection stopped",
        "state": "Stopped"
    },
    "tests": [
        {
            "description": "Cheetah client test",
            "statistics": [
                0,
                0,
                "NaN",
                0.0,
                0.0,
                0.0
            ],
            "test": 1
        },
        {
            "description": "Reads 95%",
            "statistics": [
                304000,
                0,
                8.7931875,
                7.948696618436826,
                6907.677974959667,
                13594.0
            ],
            "test": 101
        },
        {
            "description": "Writes 5%",
            "statistics": [
                16000,
                0,
                9.963375,
                9.92775949594747,
                363.5619986820878,
                1638.0
            ],
            "test": 102
        }
    ],
    "totals": [
        320000,
        0,
        8.851696875,
        8.063234652303947,
        7271.239973641756,
        14259.0
    ]
}

コマンド:

sed -nr "H;/$name/,/\}/{s/(\})/\1/;T;x;p};/\{/{x;s/.*\n.*//;x;H}" out | sed -e     '1,/statistics/d' | sed -e '/test/,$d' | sed '$d' | sed '/^$/d' | tr "\\n" " " | sed -e 's/[\t ]//g;/^$/d'

以下の出力を示します-テスト「Reads 95%」のテスト統計

304000,0,8.7931875,7.948696618436826,6907.677974959667,13594.0

次の sed コマンド:

sed -nr "H;/"Reads 95%"/,/\}/{s/(\})/\1/;T;x;p};/\{/{x;s/.*\n.*//;x;H}" out gives

    {
        "description": "Reads 95%",
        "statistics": [
            304000,
            0,
            8.7931875,
            7.948696618436826,
            6907.677974959667,
            13594.0
        ],
        "test": 101
    },
  1. | で結果 1 をパイプします。sed -e '1,/statistics/d' は、行に「統計」が含まれている後のすべての行を示します

            304000,
            0,
            8.7931875,
            7.948696618436826,
            6907.677974959667,
            13594.0
        ],
        "test": 101
    },
    
  2. | で結果 2 をパイプします。sed -e '/test/,$d' は、「test」で構成される行より上の行を提供します

            304000,
            0,
            8.7931875,
            7.948696618436826,
            6907.677974959667,
            13594.0
        ],
    
  3. | で結果 3 をパイプします。sed '$d' は、出力 3 304000, 0, 8.7931875, 7.948696618436826, 6907.677974959667, 13594.0 の最後の行を削除します

  4. | で結果 4 をパイプします。tr "\n" " " | sed -e 's/[\t ]//g;/^$/d' を与える

    304000,0,8.7931875,7.948696618436826,6907.677974959667,13594.0

tr "\n" " " CR (または \n) をスペースに置き換え、 sed -e 's/[\t ]//g;/^$/d' はすべてのスペースとタブを削除します

注: 私はこの分野の専門家ではないため、これが最も効率的な解決策ではない可能性があります。

于 2013-06-25T06:02:58.323 に答える