我有一些非常大的 json 文件,我甚至不确定其中一些是否写得正确
因此无法使用编辑器查看(它会冻结 vscode 等)
我可以使用查看它们,less thefile.json
但我正在寻找单词的(所有)出现及其后面的数据
我怎样才能从终端找到这些事件?
例如我想找到该单词的所有出现位置OutputResults
及其值
{ "OutputResults":
{ "first": 0,
"second": 2
}
}
编辑:
我在尝试
cat thefile.json | grep -i '"OutputResults":'
cat thefile.json | grep -A 4 '"OutputResults":'
但这会显示整个文件,并以红色突出显示 OutputResults。而且这是一个巨大的文件,所以我必须在某个时候停止它。
我怎样才能提取出现 OutputResults 的部分?
答案1
如果您正在解析 JSON 之类的结构化文本,请使用能够理解该结构的专用工具,因为通用文本处理工具将依赖于换行符和空格等对结构并不重要的提示。
所以,使用jq
,你可以.OutputResults
使用类似以下方法获取所有键的值:
jq '.. | select(.OutputResults?) | .OutputResults'
例如:
% cat foo.json | jq '.. | select(.OutputResults?) | .OutputResults'
{
"first": 0,
"second": 2
}
{
"first": 0,
"second": 2
}
或者如果您需要.OutputResults
作为输出的一部分:
% jq '.. | select(.OutputResults?) | {OutputResults}' foo.json
{
"OutputResults": {
"first": 0,
"second": 2
}
}
{
"OutputResults": {
"first": 0,
"second": 2
}
}
或者使用紧凑输出:
% jq '.. | select(.OutputResults?) | {OutputResults}' -c < foo.json
{"OutputResults":{"first":0,"second":2}}
{"OutputResults":{"first":0,"second":2}}
为了使用 读取非常大的 JSON 文件jq
,我们必须使用它的“流式传输模式”,但jq
流式传输的方式使其使用起来更加复杂。我认为以下jq
程序是通过调整jq
常见问题解答中的示例,应该只显示OutputResults
键的值:
foreach inputs as $in (
null;
if has("OutputResults") then null
else . as $x
| $in
| if length != 2 and $x then {"OutputResults": $x}
elif length != 2 then null
elif .[0][-2] == "OutputResults" then ($x + {"\(.[0][-1])": "\(.[-1])"})
else $x
end
end;
select(has("OutputResults")) | .
)
将其放入一个文件中,例如outputresults.jq
,并像这样使用它:
jq -n --stream -f outputresults.jq some-inputjson
答案2
grep
就是您想要的。man grep
如果您需要更多信息,请输入。
使用这个:
grep -a 4 '"OutputResults":' thefile.json
它将输出类似这样的内容:
{ "OutputResults":
{ "first": 0,
"second": 2
}
}
{ "OutputResults":
{ "first": 5,
"second": 3
}
}
{ "OutputResults":
{ "first": 2,
"second": 2
}
}