我们有以下示例文件(非常长的文件,这是简短的示例)
"request_status" : "FAILED"
{
"href" : "http://localhost:8080/api/v1/clusters/sys41/requests/333",
"Requests" : {
"cluster_name" : "sys41",
"id" : 333,
"request_status" : "COMPLETED"
}
},
{
"href" : "http://localhost:8080/api/v1/clusters/sys41/requests/334",
"Requests" : {
"cluster_name" : "sys41",
"id" : 334,
"request_status" : "FAILED"
}
},
{
"href" : "http://localhost:8080/api/v1/clusters/sys41/requests/335",
"Requests" : {
"cluster_name" : "sys41",
"id" : 335,
"request_status" : "FAILED"
}
},
{
"href" : "http://localhost:8080/api/v1/clusters/sys41/requests/336",
"Requests" : {
"cluster_name" : "sys41",
"id" : 336,
"request_status" : "COMPLETED"
}
}
如何打印匹配的行之后的行,"id" : $num
例如
num=335
如何获得之后的线路
"id" : $num
预期产出
"request_status" : "FAILED"
答案1
假设 JSON 文件是一大对象数组,例如
{
"href": "http://localhost:8080/api/v1/clusters/sys41/requests/333",
"Requests": { "id": 333, "cluster_name": "sys41", "request_status": "COMPLETED" }
},
(请注意,换行符并不重要,对象中键的顺序也不重要)然后,以下jq
命令将获取request_status
对应id
于 的条目$num
:
$ num=355
$ jq -r ".[].Requests | select(.id == $num).request_status" file.json
FAILED
它通过Requests
从每个对象中挑选出所有条目并在id
.对于通过过滤器的那些,它会提取request_status
.
-r
使其jq
输出原始数据而不是 JSON 的选项(如果FAILED
没有它,就会被双引号括起来)。
奖励材料:
$ jq -r '.[].Requests | "\(.id): \(.request_status)"' file.json
333: COMPLETED
334: FAILED
335: FAILED
336: COMPLETED
答案2
假设 shell 变量num
设置等于335
:
grep -A1 "\"id\" : $num," /path/to/file
grep
我从方便的-A
、-B
和选项中得到了很多帮助-C
,我使用的助记符是“After”、“Before”和“Context”。
grep -A n 'pattern' file
将显示n线A模式匹配之后,除了匹配行本身之外。grep -C n 'pattern' file
将显示n线乙在模式匹配之前,除了匹配行本身之外。grep -C n 'pattern' file
将显示n之前的两行和之后(即Context of) 模式匹配,除了匹配行本身。
答案3
awk '/"id" : 335/{getline;print}'
或者
var="\"id\" : 335"
awk "/$var/{getline;print}"
或者
awk -v var="\"id\" : 335" '$0~var{getline;print}'
或者
var="\"id\" : 335"
awk -v var="$var" '$0~var{getline;print}'
或以上任何一项,但不需要"id" : "
字符串的一部分,格式为:
awk -v var="335" '$0~"id" : var{getline;print}'