我的示例文件中包含以下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":.*?[^\\]",'
,但没有得到任何输出
答案 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?