by

Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Erik Berg
    @eb4x_gitlab

    I'm leaving this here as a puzzle someone might help me solve. I have a netplan (converted from yaml), and I haven't quite figured out how to combine searches in these types of nested dicts.

    {
      "ethernets": {
        "enp3s0f0": {
          "match": {
            "macaddress": "01:23:45:67:89:ab"
          },
          "set-name": "eth0"
        },
        "enp3s0f1": {
          "match": {
            "macaddress": "cd:ef:01:23:45:67"
          },
          "set-name": "eth1"
        },
        "enp4s0f0": {
          "match": {
            "macaddress": "89:ab:cd:ef:01:23"
          },
          "set-name": "eth2"
        },
        "enp4s0f1": {
          "match": {
            "macaddress": "45:67:89:ab:cd:ef"
          },
          "set-name": "eth3",
          "addresses": [
            "172.16.0.3/24"
          ]
        }
      },
      "bonds": {
        "bond0": {
          "interfaces": [
            "eth0",
            "eth1"
          ],
          "parameters": {
            "mode": "802.3ad"
          }
        }
      },
      "vlans": [
        "bond0.1202",
        "bond0.203",
        "bond0.204",
        "bond0.205"
      ],
      "bridges": {
        "br-maas": {
          "addresses": [
            "172.16.1.3/24"
          ],
          "interfaces": [
            "bond0"
          ]
        },
        "br-mgmt": {
          "addresses": [
            "172.16.2.3/24"
          ],
          "interfaces": [
            "bond0.1202"
          ]
        },
        "br-storage": {
          "addresses": [
            "172.16.3.3/24"
          ],
          "interfaces": [
            "bond0.203"
          ]
        },
        "br-vxlan": {
          "addresses": [
            "172.16.4.3/24"
          ],
          "interfaces": [
            "bond0.204"
          ]
        },
        "br-iscsi": {
          "addresses": [
            "172.16.5.3/24"
          ],
          "interfaces": [
            "bond0.205"
          ]
        },
        "br-vlan": {
          "interfaces": [
            "eth2"
          ]
        }
      }
    }

    *.*.addresses will yield addresses, I can flatten it with [] but I suppose a [?addresses] type filter would be a better approach, so we only look for those with addresses. [keys(@)] gives me [ethernets, bonds, vlans, bridges], but *.[keys(@)] doesn't seem to give me the interface-names. But then *.*[keys(@)] gives me keys inside the interfaces.

    I'd like to get something that returns interface-name + address in some kind of combination. Like [ ["enp4s0f1", "172.16.0.3/24"], ["br-maas", "172.16.1.3/24"], ...]or [ {"enp4s0f1": ["172.16.0.3/24"]},{"br-maas":["172.16.1.3/24"]}, ...]

    Erik Berg
    @eb4x_gitlab
    So apparently the "vlans": [...] is causing problems? I removed it, and now I get something from *.[keys(@)]. I can probably work with this... Just fix the vlans in my lazy netplan.
    Gabriel
    @GaboFDC

    hey guys, not sure if this is the proper place, but just a suggestion in the contains examples would also be good to explain this syntax

    machines[?contains(guest_fullname, `Windows`) == `false`]

    for dicts like:

    {
      "machines": [
        {
          "guest_fullname": "Other (32-bit)",
          "age": 30
        },
        {
          "guest_fullname": "Microsoft Windows 10 (64-bit)",
          "age": 50
        },
        {
          "name": "Ubuntu",
          "age": 40
        }
      ]
    }

    I needed to do it, but it was really hard to come up with the proper syntax, wasn't even sure if it was possible.

    Dominic D'Apice
    @dapiced
    anyone can help me with the function max() ?
    Harbie34
    @Harbie34

    Hi, there!
    I'm trying to convert the result of AWS CloudWatch Logs Insights, but I can't.

    Like this:

    {
        "results": [
            [
                {
                    "field": "@timestamp",
                    "value": "2020-02-03 15:03:26.315"
                },
                {
                    "field": "@message",
                    "value": "some messages 1"
                },
                {
                    "field": "@ptr",
                    "value": "xxx"
                }
            ],
            [
                {
                    "field": "@timestamp",
                    "value": "2020-02-03 15:03:27.495"
                },
                {
                    "field": "@message",
                    "value": "some messages 2"
                },
                {
                    "field": "@ptr",
                    "value": "xxx"
                }
            ]
        ],
        "statistics": {
            "recordsMatched": 887.0,
            "recordsScanned": 887.0,
            "bytesScanned": 101532.0
        },
        "status": "Complete"
    }

    To this:

    [
        [ "2020-02-03 15:03:26.315", "some messages 1" ],
        [ "2020-02-03 15:03:27.495", "some messages 2" ]
    ]

    Can anyone help me?

    Chris Armstrong
    @chris-armstrong
    JMESPath makes this trickier than it needs to be, but here it is @Harbie34:
    map(&[([?field=='@timestamp'])[0].value, ([?field=='@message'])[0].value ], results)
    Harbie34
    @Harbie34
    @chris-armstrong Wow! Excellent! I'll study the map function more. Thanks!
    Chris Armstrong
    @chris-armstrong
    No worries - I think this one can also be done with filter expressions and pipes but I haven't explored that.
    Harbie34
    @Harbie34
    @chris-armstrong Hmm... I'll try to think a little more, too.
    Jason Slagle
    @jmslagle
    Is JEP-11 dead?
    Jens J.
    @zerog2k

    I feel really dumb, but can't seem to figure out how to transform this:

    {
        "Foo": "somekey",
        "Bar": "somevalue"
    }

    into:

    { "somekey": "somevalue" }

    the closest I can get is like:

    { Foo : Bar }

    but that yields:

    {
      "Foo": "somevalue"
    }

    so it's the key in the hash part I cant figure out how to get
    (I want to make the new hash's key, the value of an existing key in the input hash)

    Jens J.
    @zerog2k

    so I have read somewhere this may not be possible w/ stock JMESPath

    Jmespath does not allow to use dynamic names in multi select hashes.

    but there is some extension:
    https://github.com/grofers/go-codon/wiki/Jmespath-extensions#5-support-for--expressions-as-key-when-performing-multi-select-hash
    (wanted to be able to do this in aws cli --query )

    Jens J.
    @zerog2k
    i guess i need to pass output through jq from_entries
    aws ec2 describe-tags --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags' | jq from_entries >/tmp/tags.json
    basically gives me what I want ;)
    wu-lee
    @wu-lee
    Is there a way to turn an object of objects into a list of {key1, key2, value} objects?
    For example: {animal: {ant: 1, bee: 2, cat: 3}, vegetable: {apple: 4, banana: 5}, mineral: {axe: 6, bell; 7}} into [{key1: "animal", key2: "ant", value: }, {key1: "animal", key2: "bee", value: 2}, ... {key1: "mineral", key2: "bell", value: 7}]
    wu-lee
    @wu-lee
    Or even just doing it for a single object?
    dr7tbien
    @dr7tbien
    ¿?
    Hi
    dr7tbien
    @dr7tbien
    I'm trying install aws sdk php v3. And I've got this:
    composer require aws/aws-sdk-php
    Using version ^3.133 for aws/aws-sdk-php
    ./composer.json has been created
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - Installation request for mtdowling/jmespath.php (installed at 2.4.0) -> satisfiable by mtdowling/jmespath.php[2.4.0].
        - aws/aws-sdk-php 3.133.0 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.1 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.10 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.11 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.2 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.3 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.4 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.5 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.6 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.7 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.8 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - aws/aws-sdk-php 3.133.9 requires mtdowling/jmespath.php ^2.5 -> satisfiable by mtdowling/jmespath.php[2.5.0].
        - Conclusion: don't install mtdowling/jmespath.php 2.5.0
        - Installation request for aws/aws-sdk-php ^3.133 -> satisfiable by aws/aws-sdk-php[3.133.0, 3.133.1, 3.133.10, 3.133.11, 3.133.2, 3.133.3, 3.133.4, 3.133.5, 3.133.6, 3.133.7, 3.133.8, 3.133.9].
    
    
    Installation failed, deleting ./composer.json.
    The issue is that ubuntu only can get V2.3 by apt-get
    how I could install the V2.5?
    Doqnach
    @Doqnach
    how do you mean apt-get?
    this says composer @dr7tbien
    try composer why --tree mtdowling/jmespath to see why it is locked to 2.4.0
    Andrew Curioso
    @andrewcurioso
    Hello all... is there a way to emulate a ternary operator? Basically I want one value is there is a match and another value if there isn't
    Never mind, this works
    locations[0].state == 'NY' && 'a' || 'b'
    lakshmi Pendyala
    @lpendyala_gitlab
    Hi Everyone, new to jmespath and yaml. So I've a requirement where I'm substituting region as a variable, I'm getting this error. jmespath.exceptions.LexerError: Bad jmespath expression: Unknown token '-':
    "123456789012".us-east-1 . Any help would be appreciable.
    this is my original yaml file expression expr: '"{account_id}".{region}'
    James Saryerwinnie
    @jamesls
    You need to quote values that have chars that aren't a-zA-Z0-9
    try "{account_id}"."{region}"
    lakshmi Pendyala
    @lpendyala_gitlab
    expected <block end>, but found '<scalar>'
    in "<unicode string>", line 18, column 31:
    expr: "{account_id}"."{region}"
    James Saryerwinnie
    @jamesls
    I don't think that's a jmespath error? Here's a full example:
    $ echo '{"12345": {"us-east-1": "value-i-want"}}' | jp.py '"12345"."us-east-1"'
    "value-i-want"
    lakshmi Pendyala
    @lpendyala_gitlab
    this expression is in yaml file
    even for me it's working good when I queried this command cat /tmp/test.json | jp '"987654321012"."us-east-1"'
    James Saryerwinnie
    @jamesls
    oh, maybe just quote the whole value in the yaml file. I'm guessing yaml's thinking it's two separate strings. So:
    expr: '"{account_id}"."{region}"'
    lakshmi Pendyala
    @lpendyala_gitlab
    It's not throwing any error and at the same time it's not getting evaluated at all
    Federico Olivieri
    @Federico87_gitlab
    Hi people, I am super new in jmespath. I had just a look to the docs for pyhon and I did not have chance to play with it yet. Just a very high level question. Is there any way to make search to work in the opposite way? I mean, instead to search a key:value, to exclude the key:value passed and return all the rest
    Thank you very much!
    James Saryerwinnie
    @jamesls
    No, not right now :(. I know people want that feature though.
    Federico Olivieri
    @Federico87_gitlab
    If I have something like this : {"peers": {"ns1.sys.cloudsys.tmcs": {"delay": [ 0.476, 0.371 ]}, "insert": { "10.75.33.5": { "delay": [ 0.384 ]}}, "delete": {"ns2.sys.cloudsys.tmcs": { "delay": [ 0.465 ]}}}
    and i want take just insert and delete, is it possible to do with wildcards? kind of peer.[insert|delete] ?
    James Saryerwinnie
    @jamesls
    Federico Olivieri
    @Federico87_gitlab
    Yeap! Amazing! Thanks a lot. I will go tomorrow through all docs. Great application btw!
    mtndoe
    @mtndoe
    Hi people, just learning jmespath. Based on my first experiments I can use jmespath as a template language (meaning using the desired json as a template and using the path expressions to get the necessary values). Using it as such would it be possible to create an object depending on a condition? So if the condition is true create object A else object B or nothing?
    James Saryerwinnie
    @jamesls
    Not really, but conditionals like that is something I'm looking to add.
    Federico Olivieri
    @Federico87_gitlab
    Question. I have a json like the belo and I want to catch just interfaceStatus I can do interfaces.*.interfaceStatus and I get the right result, however I lose Ethernet47 so I am not sure to which interface the interfaceStatus belongs to
    "Ethernet48": {
                "lastStatusChangeTimestamp": [
                    1580496491.6286151,
                    1580496491.6286182
                ]
            },
            "Ethernet47": {
                "lastStatusChangeTimestamp": [
                    1580496491.629291,
                    1582706128.6775026
                ],
                "interfaceStatus": [
                    "connected",
                    "disabled"
                ]
            }
    I can workaround with some code but I was wondering if there is some sort of reference/dereference that I can apply to .*. and get back the value of * where jmspath match
    Chris Armstrong
    @chris-armstrong
    JMESPath doesn't have a way to do this I'm afraid - there are no backreferences to a previous match, nor can you convert the object to a set entries (like JavaScript Object.entries()) and map over the result.
    Chris Armstrong
    @chris-armstrong
    Adding an entries function is a good target for a specification addition, but there is no formal process for those at the moment (development on the main repo seems to be stalled)
    Matthew Slowe
    @jiscfoo
    Afternoon. I am wondering if there are jmespath packages for Alpine Linux…?