Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在unix中从json文件中提取值?_Shell_Unix_Awk_Sed - Fatal编程技术网

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

Shell 如何在unix中从json文件中提取值?,shell,unix,awk,sed,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-4baf3e0b71

我的示例文件中包含以下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
    }
}
我想检索字节计数的值,即字节计数。结果应该是480

由于受到限制,我们的组织不允许使用其他工具,如
jq


我如何通过sed/grep实现这一点?我尝试了
grep-Po的“字节数”:。*?[^\\]”,
但没有得到任何输出

我想你可以数一数字符

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)}
资料来源:

更一般地说,您可以使用它(使用任何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
}


如果您不能使用jq,那么perl或python呢?我们都知道,
jq
是json处理的正确工具,因为OP说在他的情况下不允许使用jq,所以现在就在post中添加回标记。
sed-n的s/*“byteCount”:\([0-9]*\).*/\1/p'文件
可能会起作用,但您应该使用能够解析JSON的工具来完成这项工作,仅仅因为不能使用
jq
并不能使
sed
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