Bash从模式中提取值

时间:2015-04-14 15:32:21

标签: bash sed grep

[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]

假设我上面有json数组,我想使用sed / grep来提取我只知道名字的id,例如" dog"。我不能使用jq等工具。

2 个答案:

答案 0 :(得分:2)

由于输入是json数据,我会使用jq

echo '[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]' \
    | jq --raw-output '.[] | select(.name=="dog") | .id'

如果服务器上没有,请安装它。另一种方法可能是使用pythonrubyperlphp等编程语言。如果您愿意,我可以用其中一种语言提供示例。如果它们在您的服务器上都不可用,则服务器安装不符合您的要求。

正如您所要求的,python中有一个简单的实现:

import json

data='[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]'
for item in json.loads(data):
    if item['name'] == "dog":
        print(item['id'])
        exit(0)

如果您想在stdin示例中阅读jq,请使用此代码:

import sys
import json

data=sys.stdin.read()
for item in json.loads(data):
    if item['name'] == "dog":
        print(item['id'])
        exit(0)

(蟒蛇可能会怪我,因为代码太冗长,我是一个蟒蛇菜鸟!))

答案 1 :(得分:0)

如果你想在没有jq的情况下这样做,这里有一个混合了sed和grep的解决方案:

sed 's/},{/}\n{/g' inputfile |grep '"name":"dog"' |sed 's/.*"id":"\([0-9]*\)".*/\1/g

第一部分sed 's/},{/}\n{/g' inputfile将每对夫妻分开。

第二部分grep '"name":"dog"'提取您正在寻找的ID的行(用适当的id替换dog)

第三部分sed 's/.*"id":"\([0-9]*\)".*/\1/g从行中提取id的值。

确保使用sed的gnu版本。

希望有所帮助!