如何从unix的json文件中提取值?

时间:2019-04-29 14:08:50

标签: shell unix awk sed

我的示例文件中包含以下json内容:

{
    "listingRequest": {
        "id": "016a1050-82dc-1262-cc9b-4baf3e0b7123",
        "uri": "http://localhost:9090/nifi-api/flowfile-queues/016a104a-82dc-1262-7d78-d84a704abfbf/listing-requests/016a1050-82dc-1262-cc9b-4baf3e0b7123",
        "submissionTime": "04/28/2019 19:40:58.593 UTC",
        "lastUpdated": "19:40:58 UTC",
        "percentCompleted": 0,
        "finished": false,
        "maxResults": 100,
        "state": "Waiting for other queue requests to complete",
        "queueSize": {
            "byteCount": 480,
            "objectCount": 20
        },
        "sourceRunning": false,
        "destinationRunning": false
    }
}

我想检索字节计数的值,即byteCount。结果应为480。

由于限制,不允许在我们的组织中安装其他工具,例如jq

如何通过sed / grep执行此操作?我尝试了grep -Po '"byteCount":.*?[^\\]",',但没有得到任何输出

2 个答案:

答案 0 :(得分:2)

$ sed -n 's/.*"byteCount": *\([0-9]*\).*/\1/p' file
480

通常,您可以使用此代码(使用任何POSIX awk)将您特定的JSON格式转换为平面文件,然后按其标记层次结构打印所需的任何内容:

$ cat tst.awk
{ gsub(/^[[:space:]]+|[[:space:]]+$/,"") }

match($0,/^"[^"]+"/) {
    subTag = substr($0,RSTART+1,RLENGTH-2)
    $0 = substr($0,RSTART+RLENGTH)
}

!NF || /^{/ { next }

/^:[[:space:]]*{/ {
    preTag = (preTag=="" ? "" : preTag ".") subTag
    next
}

/^}/ {
    sub(/\.[^.]+$/,"",preTag)
    next
}

{
    gsub(/^[[:space:]]*:[[:space:]]*|[[:space:]]*,[[:space:]]*$/,"")
    tag = preTag "." subTag
    val = $0
    printf "%s=%s\n", tag, val
}

$ awk -f tst.awk file
listingRequest.id="016a1050-82dc-1262-cc9b-4baf3e0b7123"
listingRequest.uri="http://localhost:9090/nifi-api/flowfile-queues/016a104a-82dc-1262-7d78-d84a704abfbf/listing-requests/016a1050-82dc-1262-cc9b-4baf3e0b7123"
listingRequest.submissionTime="04/28/2019 19:40:58.593 UTC"
listingRequest.lastUpdated="19:40:58 UTC"
listingRequest.percentCompleted=0
listingRequest.finished=false
listingRequest.maxResults=100
listingRequest.state="Waiting for other queue requests to complete"
listingRequest.queueSize.byteCount=480
listingRequest.queueSize.objectCount=20
listingRequest.sourceRunning=false
listingRequest.destinationRunning=false

$ awk -f tst.awk file | awk -F'=' '$1=="listingRequest.queueSize.byteCount"{print $2}'
480

答案 1 :(得分:0)

我认为您可以算出字符数

a= your_json
b="byteCount"
strindex() { 
  x="${1%%$2*}"
  [[ "$x" = "$1" ]] && echo -1 || echo "${#x}"
}
index=  strindex "$a" "$b"  #print 4
result ={your_json:(index+11)}

来源: https://www.tldp.org/LDP/abs/html/string-manipulation.html

Position of a string within a string using Linux shell script?