Eu tenho este texto json:
{
"buildStatus" : {
"status" : "ERROR",
"conditions" : [{
"status" : "OK",
"metricKey" : "bugs"
}, {
"status" : "ERROR",
"metricKey" : "test_success_density"
}, {
"status" : "OK",
"metricKey" : "vulnerabilities"
}
],
"periods" : []
}
}
Eu quero extrair o status geral do buildStatus, ou seja, a saída esperada foi "ERRO"
"buildStatus" : {
"status" : "ERROR",
....
}
Eu tentei a expressão sed abaixo, mas não está funcionando, ela retorna OK
:
status= sed -E 's/.*\"buildStatus\":.*\"status\":\"([^\"]*)\",.*/\1/' jsonfile
O que estou fazendo de errado?
fonte
jq
:jq -r .buildStatus.status
Trabalho para
jq
:Pode ser reduzido para:
-r
(--raw-output
) gera a string semjson
formatação, sem aspas.Exemplo:
Se ainda não estiver instalado, instale-o por (disponível no repositório Universe):
fonte
Como já foi mencionado, é preferível analisar dados estruturados complexos com a API apropriada. O Python possui um
json
módulo para isso, que eu pessoalmente uso bastante em meus scripts, e é muito fácil extrair os campos desejados da seguinte maneira:O que acontece aqui é que redirecionamos o arquivo de entrada para o stdin do python e o lemos com
json.load()
. Isso se torna um dicionário python com a chave "buildStatus" e contém outro dicionário python com a chave "status". Portanto, estamos apenas imprimindo o valor de uma chave em um dicionário que é armazenado em outro dicionário. Relativamente simples.Além da simplicidade, outra vantagem é que o python e essa API estão pré-instalados e vêm com o Ubuntu por padrão.
fonte
Na verdade, você pode fazer isso
sed
, mas recomendo que você use uma linguagem mais sofisticada que possua ferramentas escritas para manipular dados JSON. Você pode tentar perl ou python, por exemplo.Agora, no seu exemplo simples, tudo o que você deseja é a primeira ocorrência
"status"
, para que você possa fazer:O truque é usar
-n
para evitar a impressão; se a linha coincidir comstatus
(/status/
), você remove tudo, exceto a parte desejadas/.*:\s*"(.*)",/\1/
,p
pinta a linha eq
uit.Pessoalmente, acho esse comando grep equivalente muito mais simples:
Ou este:
Sério, se você planeja analisar arquivos JSON, não tente fazer isso manualmente. Use um analisador JSON adequado.
fonte
grep -m 1 status file.json | tr -cd '[[:alnum:]]:' | cut -f2 -d':'
Não estou dizendo que você deveria usar
sed
(acho que alguém me deu um voto negativo apenas por não escrever uma advertência obrigatória), mas, se você precisar procurar algo na próxima linha,buildStatus
como parece estar tentando em sua própria tentativa, precisará dizersed
para ler a próxima linha com oN
comandoNotas:
-n
não imprima nada até pedirmos-r
use ERE (igual a-E
)/buildStatus/N
encontre esse padrão e leia a próxima linha tambéms/old/new/
substituaold
pornew
.*
qualquer número de caracteres na linha\n
nova linha: "(.*)",
salve os caracteres que ocorrem entre: "
e",
\1
referência anterior ao padrão salvop
imprimir a parte em que trabalhamosfonte
Há uma explicação típica do porquê
sed
e ferramentas de processamento de fluxo de texto semelhantes não estão bem equipadas para analisar dados estruturados, como JSON e XML. Eu não tenho isso em mãos, mas está lá fora, e acredito que o ponto é que as expressões necessárias em quase todas as situações, menos a menor, rapidamente se tornam muito complexas, enquanto ferramentas alternativas criadas especificamente para analisar a estrutura são mais elegante, legível e eficiente na mesma análise.Como muru colocou em um comentário ,
jq
deve ser a ferramenta certa para o trabalho. Também posso garantir que, pessoalmente, estou muito empolgado em vê-lo substituir várias vezes, quando tentei analisar os mesmos dados sem quase nenhum ou com grande sucesso. Ele ainda contém uma grande capacidade de formatação e controle da saída. Eu prefirojsontool
por um motivo ou mais do que eu esqueço atualmente.O Byte Commander parece recomendar
jshon
em outra resposta . Eu não usei essa ferramenta, mas ela me lembraxmlstarlet
e sua sintaxe, também com uma apresentação personalizável para a saída.fonte
jsontool
pode ser usado no caso específico do OP.jq
que muru e heemayl descrevessem que já têm exemplos, e apenas postando o raciocínio por trás disso: askubuntu.com/a/863948/230721Apenas outra ferramenta Json chamada json ( https://github.com/trentm/json )
Este estudo de caso é enganoso: parece que as ferramentas não estão funcionando. Você também pode usar
json
para alterar arquivos json:ou até ...
documentação em: http://trentm.com/json/
se não estiver instalado:
npm install -g json
fonte