Shell 如何在unix中从json文件中提取值?
我的示例文件中包含以下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
{
"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