Minha pergunta é um pouco semelhante a ela, mas ainda me permite elaborar. Estou acessando um aplicativo meteorológico chamado wttr.in de onde posso obter informações meteorológicas. Isso pode ser facilmente chamado por -
$ curl wttr.in/Pune?format=4
Agora, o que estou interessado em saber se a estação meteorológica está fornecendo dados atuais ou dados obsoletos para os quais conheci algo chamado formato j1, que fornece a última vez que o servidor atualizou as informações meteorológicas.
$ curl wttr.in/Pune?format=j1 | less
A consulta acima me dá uma tonelada de dados, algo como -
current_condition": [
{
"FeelsLikeC": "18",
"FeelsLikeF": "65",
"cloudcover": "4",
"humidity": "42",
"localObsDateTime": "2021-11-11 12:20 AM",
"observation_time": "06:50 PM",
"precipInches": "0.0",
"precipMM": "0.0",
"pressure": "1012",
"pressureInches": "30",
"temp_C": "18",
Agora, se eu usar o grep, recebo a saída assim -
$ curl wttr.in/Pune?format=j1 | grep "localObsDateTime"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
2 48685 2 1159 0 0 4199 0 0:00:11 --:--:-- 0:00:11 4184 "localObsDateTime": "2021-11-11 12:20 AM",
100 48685 100 48685 0 0 90830 0 --:--:-- --:--:-- --:--:-- 90661
Ouvi dizer que o jq poderia embelezar e facilitar, alguém pode me dizer como. Além disso, em vez de curl, se houver outra maneira de obter dados, também seria interessante.
FWIW eu instalei ja 1.6 e a versão do bash no meu final é 5.1.8.
Com
jq
:Resultado:
Você pode usar:
Se você não souber exatamente onde no documento JSON a
localObsDateTime
chave está localizada, será necessário procurá-la recursivamente. Você pode fazer isso e, em seguida, extrair seu valor, com a seguintejq
expressão:Isso basicamente diz "para cada coisa individual no documento, se for um objeto e tiver uma chave chamada
localObsDateTime
, extraia o valor dessa chave".Você também pode encurtá-lo em
que diz "para cada coisa individual no documento, tente extrair o
localObsDateTime
valor, se existir, e se não existir ou seu valor fornull
, apenas não me dê nada".Você executaria assim:
ou,
A
-r
opção parajq
fazer com que o utilitário retorne uma string de texto decodificada em vez de uma string JSON.Observe que o acima retorna os valores de todas as
localObsDateTime
chaves. Você gostaria apenas do primeiro deles, use a seguintejq
expressão:ou,
Isso cria uma matriz de todos os valores e, em seguida, extrai o primeiro.
Observe que usar
j2
no lugar dej1
na URL faz com que o documento JSON na resposta seja menor.