jqdocker-api

Remove slash character in JSON response using jq


Docker Engine API returns container name with / appended

{
    "Id": "8dfafdbc3a40",
    "Names": [
        "/boring_feynman"
    ],
    "Image": "ubuntu:latest",
    "ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
    "Command": "echo 1",
    "Created": 1367854155,
    "State": "Exited",
    "Status": "Exit 0",
    "Ports": [{
        "PrivatePort": 2222,
        "PublicPort": 3333,
        "Type": "tcp"
    }],
    "Labels": {
        "com.example.vendor": "Acme",
        "com.example.license": "GPL",
        "com.example.version": "1.0"
    },
    "SizeRw": 12288,
    "SizeRootFs": 0,
    "HostConfig": {
        "NetworkMode": "default"
    },
    "NetworkSettings": {
        "Networks": {}
    },
    "Mounts": [{
        "Name": "fac362...80535",
        "Source": "/data",
        "Destination": "/data",
        "Driver": "local",
        "Mode": "ro,Z",
        "RW": false,
        "Propagation": ""
    }]
}

I want to remove the slash so the response can be used as a table in JQ:

jq -r '(["Names","Image"] | (., map(length*"-"))), (.[] | [.Names, .Image]) | @tsv'

Currently, when I run the above, I get:

jq: error (at <stdin>:1): array (["/boring_feynman"]) is not valid in a csv row

Solution

  • The problem is not because of / in the .Names field, but in your expression. For filters like @csv or @tsv to work, the values need to be in a scalar format and in an array. But your expression .Name in of type array.

    So basically you are passing this result to the @tsv function

    [
      [
        "/boring_feynman"
      ],
      "ubuntu:latest"
    ]
    

    instead of

    [
      "/boring_feynman",
      "ubuntu:latest"
    ]
    

    So modifying your filter, you can do below for the JSON in question.

    jq -r '(["Names","Image"] | (., map(length*"-"))), ([.Names[], .Image]) | @tsv'
    

    or if you still want to remove the /, use gsub() function

    jq -r '(["Names","Image"] | (., map(length*"-"))), ([ (.Names[] | gsub("^/";"")), .Image]) | @tsv'