Script Bash - armazena a saída 'curl' na variável, depois formata contra string na variável

6

Eu esperava curl data em uma variável de script de shell e, em seguida, use cat ou awk para operar nessa variável como se fosse um arquivo.

Isso é possível ou existe uma solução alternativa? Tenho que salvar o comando curl em um arquivo?

Eu preciso executar curl várias vezes, para cada bit de formatação de string que eu quero fazer?

Eu sou curl ing ipinfo.io e quero produzir as linhas correspondentes para "city" e "region". Eu sei como usar awk e sed para formatar a saída como desejado.

Tente, por exemplo, curl ipinfo.io/"8.8.8.8" para o resultado de um endereço IP do DNS do Google.

Gostaria de imprimir apenas "Mountain View" e "Califórnia", de preferência na mesma linha, com algumas formatações comuns, como "Mountain View, Califórnia".

    
por cfye14 29.12.2015 / 07:00

3 respostas

6

Em geral, há formas mais apropriadas de analisar objetos JSON, mas como neste caso o objeto JSON é muito simples, você pode armazenar a saída de curl em uma variável (o que é possível) e apenas usar o AWK:

var="$(curl ipinfo.io/"8.8.8.8" 2>/dev/null)"
<<<"$var" awk -F'"' '=="city"{printf("%s, ", )}=="region"{print }'
% var="$(curl ipinfo.io/"8.8.8.8" 2>/dev/null)"
% <<<"$var" awk -F'"' '=="city"{printf("%s, ", )}=="region"{print }'
Mountain View, California

No entanto, a menos que você queira usar a saída de curl várias vezes, pode usar apenas um canal:

curl ipinfo.io/"8.8.8.8" 2>/dev/null | awk -F'"' '=="city"{printf("%s, ", )}=="region"{print }'
curl ipinfo.io/"8.8.8.8" 2>/dev/null | awk -F'"' '=="city"{printf("%s, ", )}=="region"{print }'
Mountain View, California

<<< é uma forma de redirecionamento de entrada chamada "here string"; ele redireciona o STDIN de um comando do terminal para uma string.

O que acontece aqui é que $var é expandido entre aspas duplas; o STDIN do comando AWK é redirecionado do terminal para a string expandida e o AWK, consequentemente, lê a string como seu arquivo de entrada.

    
por kos 29.12.2015 / 07:33
4
  

Eu esperava enrolar dados em uma variável de script de shell e usar cat ou awk para operar essa variável como se fosse um arquivo. Isso é possível ou existe uma solução alternativa?

Claro que você pode. Se o conteúdo não for muito grande e você quiser executar vários comandos para analisar o conteúdo, é bom armazená-lo na memória em vez de fazer o download novamente.

Para armazenar o resultado de curl em uma variável:

ipinfo=$(curl ipinfo.io/8.8.8.8)

Para executar comandos:

<<< "$ipinfo" awk ...
<<< "$ipinfo" sed ...

As aspas duplas no '"$ ipinfo" são importantes para preservar todos os caracteres em branco.

Uma "solução" para não salvar o conteúdo em uma variável é descobrir uma maneira de processar o conteúdo em um único pipeline, como @kos fez.

    
por janos 29.12.2015 / 07:45
0

Outra maneira fácil e mais legível de fazer isso, você pode usar python , que existe em todos os sistemas baseados em linux, para analisar o json para você

Simplesmente, importe json e sys packages para carregar o objeto json , depois imprima a partir do objeto result qualquer propriedade que você precisar:

curl ipinfo.io/"8.8.8.8" 2>/dev/null | 
  python -c 'import  json,sys; 
             result=json.load(sys.stdin); 
             print(result["'city'"] + ", " + result["'region'"])';

Eu adicionei o script de uma forma mais legível, no entanto, você deve colocar em uma linha ou adicionar \ no final de cada linha, se você precisar escrevê-lo em várias linhas.

    
por msoliman 22.01.2018 / 17:52