如何使用grep仅提取此特定text / json * *

时间:2017-12-15 14:23:10

标签: bash grep

所以我有这个json文件,它是上一个命令的输出:

{
    "upload": {
        "status": "INITIALIZED", 
        "contentType": "application/octet-stream", 
        "name": "mobile.apk", 
        "created": 1511111178.799, 
        "url": "https://amazonaws.com/arn%358%3Aproject%3A0030e-0a929/uploads/arn%3Aaws%3??/33bgb", 
        "type": "ANDROID_APP", 
        "arn": "arn:aws:devicefarm:us-west-2:588:upload:0000-aaa-bg01-11ab11/1feebbb-1a1a"
    }
}

我想提取" arn"值,包括引号,所以值:

"arn:aws:devicefarm:us-west-2:588:upload:0000-aaa-bg01-11ab11/1feebbb-1a1a"

应该退回。我还需要一个单独的命令来提取url值,因此需要返回以下内容:

"https://amazonaws.com/arn%358%3Aproject%3A0030e-0a929/uploads/arn%3Aaws%3??/33bgb"

所以我需要为这些值分别使用2个命令。我已经尝试了grep的所有不同组合,但我还没有任何工作要做。

我只想使用grep命令,我的情况不允许安装任何工具。

谢谢!

1 个答案:

答案 0 :(得分:1)

有几种可能的解决方案,具体取决于您可以使用的工具集。 让我们假设bash变量JSON包含您在主题中描述的整个JSON结构。

Bash + Python:

ARN=`echo "$JSON" | python -c "import sys, json; print json.load(sys.stdin)['upload']['arn']"`
URL=`echo "$JSON" | python -c "import sys, json; print json.load(sys.stdin)['upload']['url']"`

Bash + jq:

URL=`echo "$JSON" | jq -r '.upload.url'`
ARN=`echo "$JSON" | jq -r '.upload.arn'`

Bash + grep + awk

URL=`echo "$JSON" | grep -Po '"url":.*?".*?"' | awk '{ print $2 }'`
ARN=`echo "$JSON" | grep -Po '"arn":.*?".*?"' | awk '{ print $2 }'`

现在你可以做到

echo "$ARN"
echo "$URL"

但正如其他人已经提到的那样,不要使用awk,grep,sed和任何其他工具进行文本处理。使用专用工具。