BashNewbie
BashNewbie

Reputation: 87

Extract values in json object with awk/sed, but cannot get it to work

I have a file with the return of a curl statement in it, in the form of json. Each object has a set of values, but the parameters for these values are all called the same names. See code below.

These objects are part of a larger object called workflow. The Cleaning up object is the last process that runs in our workflow. For every video that passes through the workflow, a json file in this format is created. (There are more than only these three objects, this is just for illustrative purposes)

I want to take the value of completed of the object with "description": "Cleaning up" and store it as a variable $end_time. Then I want to take the value of completed of the object with "description": "Ingest" and store it as a variable $start_time. These two values are then subtracted to give me an integer time in milliseconds so I can calculate the time it took for the video to go through this part of the process. With the maths part I am fine, and know how to do it. It is the extraction of the values that I am struggling with.

I hope this makes sense? ANY help would be appreciated. Thank you in advance!

EDIT: Had to delete original code in post, due to character limitations

Here is a proper example of the file that I have to work with:

{
    "workflows": {
        "count": "20", 
        "searchTime": "1", 
        "startPage": "0", 
        "totalCount": "1", 
        "workflow": {
            "configurations": {
                "configuration": [
                    {
                        "$": "1409750880000", 
                        "key": "schedule.start"
                    }, 
                    {
                        "$": "1409755980000", 
                        "key": "schedule.stop"
                    }, 
                    {
                        "$": "Capture_agent", 
                        "key": "schedule.location"
                    }, 
                    {
                        "$": "false", 
                        "key": "trimHold"
                    }, 
                    {
                        "$": "true", 
                        "key": "archiveOp"
                    }, 
                    {
                        "$": "false", 
                        "key": "captionHold"
                    }, 
                    {
                        "$": "false", 
                        "key": "videoPreview"
                    }
                ]
            }, 
            "creator": {
                "organization": "mh_default_org", 
                "roles": [
                    "76b1bdde-a080-40a4-b929-bde89af6a0a8_Instructor", 
                    "ROLE_ADMIN", 
                    "ROLE_ANONYMOUS", 
                    "ROLE_USER"
                ], 
                "userName": user_name
            }, 
            "description": "This workflow definition defines the steps involved in scheduling a recording, capturing it, and\n    ingesting it, after which processing operations may be added.\n  ", 
            "errors": "", 
            "id": "15518", 
            "mediapackage": {
                "attachments": "", 
                "creators": {
                    "creator": "Name"
                }, 
                "id": "2d25ed19-2978-458d-a4a0-c9c56d791c68", 
                "license": "Creative Commons 3.0: Attribution-NonCommercial-NoDerivs", 
                "media": "", 
                "metadata": "", 
                "publications": {
                    "publication": {
                        "channel": "engage-player", 
                        "id": "b7b68f91-2c33-4673-ba7c-2e9b891788f9", 
                        "mimetype": "text/html", 
                        "tags": "", 
                        "url": "http://some.url.com:80/engage/ui/watch.html?id=2d25ed19-2978-458d-a4a0-c9c56d791c68"
                    }
                }, 
                "series": "76b1bdde-a080-40a4-b929-bde89af6a0a8", 
                "seriestitle": "Recording_Title_user_name", 
                "start": "2014-09-03T13:28:00Z", 
                "title": "Recording_Title"
            }, 
            "operations": {
                "operation": [
                    {
                        "abortable": "false", 
                        "completed": 1409750882092, 
                        "configurations": {
                            "configuration": [
                                {
                                    "$": "1409750880000", 
                                    "key": "schedule.start"
                                }, 
                                {
                                    "$": "1409755980000", 
                                    "key": "schedule.stop"
                                }, 
                                {
                                    "$": "Capture_agent", 
                                    "key": "schedule.location"
                                }
                            ]
                        }, 
                        "continuable": "false", 
                        "description": "Scheduled", 
                        "execution-history": "", 
                        "execution-host": "http://some.url.com:8080", 
                        "fail-on-error": "true", 
                        "failed-attempts": "0", 
                        "hold-action-title": "View schedule", 
                        "holdurl": "/workflow/hold/org.opencastproject.workflow.handler.scheduleworkflowoperationhandler", 
                        "id": "schedule", 
                        "job": "15519", 
                        "max-attempts": "1", 
                        "retry-strategy": "none", 
                        "started": 1409750881745, 
                        "state": "SUCCEEDED", 
                        "time-in-queue": 0
                    }, 
                    {
                        "abortable": "false", 
                        "configurations": "", 
                        "continuable": "false", 
                        "description": "Capture", 
                        "execution-history": "", 
                        "execution-host": "http://some.url.com:8080", 
                        "fail-on-error": "true", 
                        "failed-attempts": "0", 
                        "hold-action-title": "Monitor capture", 
                        "holdurl": "/workflow/hold/org.opencastproject.workflow.handler.captureworkflowoperationhandler", 
                        "id": "capture", 
                        "job": "42894", 
                        "max-attempts": "1", 
                        "retry-strategy": "none", 
                        "started": 1409750884085, 
                        "state": "SKIPPED", 
                        "time-in-queue": 0
                    }, 
                    {
                        "completed": 1409756171224, 
                        "configurations": "", 
                        "description": "Ingest", 
                        "execution-history": "", 
                        "fail-on-error": "true", 
                        "failed-attempts": "0", 
                        "id": "ingest", 
                        "max-attempts": "1", 
                        "retry-strategy": "none", 
                        "state": "SUCCEEDED"
                    },                     
                    {
                        "completed": 1409854379552, 
                        "configurations": {
                            "configuration": {
                                "key": "preserve-flavors"
                            }
                        }, 
                        "description": "Cleaning up", 
                        "execution-history": "", 
                        "execution-host": "http://some.url.com:8080", 
                        "fail-on-error": "false", 
                        "failed-attempts": "0", 
                        "id": "cleanup", 
                        "job": "45113", 
                        "max-attempts": "1", 
                        "retry-strategy": "none", 
                        "started": 1409854378128, 
                        "state": "SUCCEEDED", 
                        "time-in-queue": 0
                    }
                ]
            }, 
            "organization": {
                "adminRole": "ROLE_ADMIN", 
                "anonymousRole": "ROLE_ANONYMOUS", 
                "id": "mh_default_org", 
                "name": "Opencast Project", 
                "properties": {
                    "property": [
                        {
                            "$": "true", 
                            "key": "adminui.i18n_tab_episode.enable"
                        }, 
                        {
                            "$": "false", 
                            "key": "adminui.i18n_tab_users.enable"
                        }, 
                        {
                            "$": "/engage/ui/img/mh_logos/OpencastLogo.png", 
                            "key": "logo_small"
                        }, 
                        {
                            "$": "http://opencast.org/matterhorn/", 
                            "key": "engageui.link_mobile_redirect.url"
                        }, 
                        {
                            "$": "false", 
                            "key": "engageui.annotations.enable"
                        }, 
                        {
                            "$": "true", 
                            "key": "engageui.links_media_module.enable"
                        }, 
                        {
                            "$": "2024", 
                            "key": "adminui.chunksize"
                        }, 
                        {
                            "$": "false", 
                            "key": "adminui.series_prepopulate.enable"
                        }, 
                        {
                            "$": "true", 
                            "key": "engageui.link_download.enable"
                        }, 
                        {
                            "$": "false", 
                            "key": "engageui.link_mobile_redirect.enable"
                        }, 
                        {
                            "$": "For more information have a look at the official site.", 
                            "key": "engageui.link_mobile_redirect.description"
                        }, 
                        {
                            "$": "/engage/ui/img/mh_logos/MatterhornLogo_large.png", 
                            "key": "logo_large"
                        }
                    ]
                }, 
                "servers": {
                    "server": {
                        "name": "localhost", 
                        "port": "8080"
                    }
                }
            }, 
            "parent": {
                "nil": "true"
            }, 
            "state": "SUCCEEDED", 
            "template": "full", 
            "title": "Scheduled Workflow"
        }
    }
}

Upvotes: 3

Views: 2401

Answers (1)

zerodiff
zerodiff

Reputation: 1700

Here is a jq example that should point you to getting what you want:

#!/bin/bash
# Assuming the json is in a file workflow.json
end_time=$( jq '.workflows.workflow.operations.operation[] | select(.description == "Cleaning up") | .completed' < workflow.json )
start_time=$( jq '.workflows.workflow.operations.operation[] | select(.description == "Ingest") | .completed' < workflow.json )

This is assuming the input you have is in an JSON array called workflow at the top level. Here's this on the command line:

$ jq '.workflows.workflow.operations.operation[] | select(.description == "Ingest") | .completed' < workflow.json
1406051539118
$ jq '.workflows.workflow.operations.operation[] | select(.description == "Cleaning up") | .completed' < workflow.json
1406051695440

Upvotes: 1

Related Questions