bash命令提取json文件的给定键的所有值

时间:2014-06-10 11:32:44

标签: json bash awk sed

我有一个像这样的json文件:

{"field1": "value","field2": [{"field3":"value", ....}],"field4":"value4"}

我想从所有行中提取,只是field2的值。所以我想要一个类似的输出:

[{"field3":"value", ....}]
[{"field3":"value", ....}]
[{"field3":"value", ....}]

我想知道sed或awk在这种情况下是否有帮助。 我试过用

sed -e 's/^.*"field2":"\([^"]*\)".*$/\1/' 

但是我得到了起始文件的相同输出。

我也试过

 grep -o '"field2": [^, }]*' people_test_1 | sed 's/^.*: //'

但价值被切断了

5 个答案:

答案 0 :(得分:1)

使用jq很容易。

示例:

echo '{"field1": "value","field2": [{"field3":"value","asd":1},{"field3":"value2","asd":2}],"field4":"value4"}' | jq '.field2[] | .["field3"]'

可生产

"value"
"value2

答案 1 :(得分:0)

在您的具体情况下(基于此显式格式,其中内容介于[{与第一个}]之间)

sed -e 's/^.*\(\[{.*}\]\).*$/\1/' YourFile

对于任何其他格式(....的内容包含此模式或其他格式,您必须指定可能的内容。

最终您需要--posix选项以及此处的强制-e

答案 2 :(得分:0)

我会使用正确的JSON解析器执行此操作。如果您真的想在命令行上使用oneliner,可以发出

echo -e "import json\nfor line in open('file', 'r'): print(json.loads(line)['field2'])" | python

python -c "exec(\"import json\nfor line in open('file', 'r'): print(json.loads(line)['field2'])\")"

答案 3 :(得分:0)

您也可以使用此sed命令

$-sed -r 's/[^[]+([^]]*.).*/\1/g' File_name

答案 4 :(得分:0)

假设您的输入文件包含一系列对象,例如

[{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"},
{"field1": "value","field2": [{"field3":"value" }],"field4":"value4"}]

以下jq命令将产生所需的输出:

jq '.[]|.field2' people_test_1
相关问题