我试图解析从curl请求返回的JSON,就像这样:
curl 'http://twitter.com/users/username.json' |
sed -e 's/[{}]/''/g' |
awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
上面将JSON划分为多个字段,例如:
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
我如何打印一个特定的字段(由-v k=文本表示)?
YAML处理器yq
考虑使用yq进行JSON处理。
yq是一个轻量级、可移植的命令行YAML处理器(JSON是YAML的一个子集)。
语法类似于jq。
输入
{
"name": "Angel",
"address": {
"street": "Stairway to",
"city": "Heaven"
}
}
用法举例1
yq e ` .name ` $FILE
Angel
用法举例二
yq有一个很好的内置特性,可以使JSON和YAML成为grep-able
yq——输出格式道具$FILE
name = Angel
address.street = Stairway to
address.city = Heaven
不幸的是,使用grep的得票最多的答案返回完整的匹配,这在我的场景中不起作用,但如果您知道JSON格式将保持不变,您可以使用向后和向前查找来提取所需的值。
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="FooBar":")(.*?)(?=",)'
he\"llo
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="TotalPages":)(.*?)(?=,)'
33
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="anotherValue":)(.*?)(?=})'
100
使用Python的JSON支持,而不是使用AWK!
就像这样:
curl -s http://twitter.com/users/username.json | \
python -c "import json,sys;obj=json.load(sys.stdin);print(obj['name']);"
macOS v12.3 (Monterey)删除了/usr/bin/python,因此对于macOS v12.3及更高版本,我们必须使用/usr/bin/python3。
curl -s http://twitter.com/users/username.json | \
python3 -c "import json,sys;obj=json.load(sys.stdin);print(obj['name']);"
既然PowerShell是跨平台的,我想我就把它扔到那里,因为我发现它相当直观和非常简单。
curl -s 'https://api.github.com/users/lambda' | ConvertFrom-Json
ConvertFrom-Json将JSON转换为PowerShell自定义对象,这样您就可以轻松地使用这些属性。例如,如果你只想要'id'属性,你只需要这样做:
curl -s 'https://api.github.com/users/lambda' | ConvertFrom-Json | select -ExpandProperty id
如果你想从Bash内部调用整个东西,那么你必须像这样调用它:
powershell 'curl -s "https://api.github.com/users/lambda" | ConvertFrom-Json'
当然,有一个纯粹的PowerShell方法来做它没有卷曲,这将是:
Invoke-WebRequest 'https://api.github.com/users/lambda' | select -ExpandProperty Content | ConvertFrom-Json
最后,还有ConvertTo-Json,它可以很容易地将自定义对象转换为JSON。这里有一个例子:
(New-Object PsObject -Property @{ Name = "Tester"; SomeList = @('one','two','three')}) | ConvertTo-Json
它会生成这样的JSON:
{
"Name": "Tester",
"SomeList": [
"one",
"two",
"three"
]
}
诚然,在Unix上使用Windows shell有点亵渎神明,但PowerShell确实擅长某些事情,解析JSON和XML就是其中之一。这是跨平台版本PowerShell的GitHub页面
我已经这样做了,为一个特定的值“解析”JSON响应,如下所示:
curl $url | grep $var | awk '{print $2}' | sed s/\"//g
显然,这里的$url将是Twitter url, $var将是“text”,以获取该变量的响应。
实际上,我认为我所做的OP所遗漏的唯一一件事是grep,用于他所寻找的特定变量的行。AWK获取行上的第二项,并使用sed删除引号。
比我聪明的人可能会用AWK或grep来做整个思考。
现在,你可以用sed完成这一切:
curl $url | sed '/text/!d' | sed s/\"text\"://g | sed s/\"//g | sed s/\ //g
因此,没有AWK,没有grep…我不知道为什么我以前没想到。嗯…