Declarações de múltiplas curvas em série

2
#!/usr/bin/env bash

URL_1=http://www.squid-cache.org/Versions/

URL_2=$(curl "$URL_1" | sed -n '/Stable Versions/{p; :loop n; p; /rolling/Iq; b loop}' | grep -i rolling | cut -d \" -f 2)

URL_3=$(curl "$URL_1""$URL_2" | sed -n '/Latest/{p; :loop n; p; /.gz/q; b loop}' | grep .gz | cut -d \" -f 2)

wget "$URL_1""$URL_2""$URL_3"

Posso de alguma forma reduzir o código acima para uma única linha de código?

Não é bom definir tantas variáveis apenas para baixar algo.

    
por GypsyCosmonaut 06.08.2017 / 11:26

2 respostas

3

Um forro, como foi pedido:)

A variável

URL_1 é usada para legibilidade. Não é necessário.

#!/bin/bash

URL_1=http://www.squid-cache.org/Versions/

curl "$URL_1" | 
grep -Pzo '(?s)Stable Versions.*?langpack' | 
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_squid-.tar.gz_p' | 
xargs -I{} wget "${URL_1}"{}
  1. %código%
    • grep -Pzo '(?s)Stable Versions.*?langpack' Interpreta o padrão como uma expressão regular compatível com Perl.
    • -P opção necessária para pesquisa de várias linhas.
    • -z imprime apenas as partes correspondentes (não vazias) de uma linha correspondente.
    • -o É ativado "ponto corresponde a nova linha" para o restante da expressão regular. Informações: Modificadores Inline .
    • (?s) correspondência não voraz.
  2. %código%
    • crie essa parte aqui: .*?
    • sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_squid-.tar.gz_p' processa apenas a última linha.
    • Eu uso o sublinhado em vez de barra para o comando v3/3.5/squid-3.5.26.tar.gz ubstitute, devido a barras nas tags $,$ e s . Exemplo: </tr> em vez </td>
  3. %código%
    • transmitir duas partes concatenadas para o s_foo_bar_ pelo s/foo/bar/ : xargs -I{} wget "${URL_1}"{} e wget .

EDIT - versão sem xargs (é desnecessário aqui):

#!/bin/bash

URL_1=http://www.squid-cache.org/Versions/

wget "${URL_1}$(curl "$URL_1" |
grep -Pzo '(?s)Stable Versions.*?langpack' |
sed -rn '$,$s_.*"(.*)">.*<td>(.*)</td></tr>.*_squid-.tar.gz_p')"
    
por 06.08.2017 / 14:16
3

Um one-liner, usando lynx em vez de han curl .

$ lynx -dump -listonly -nonumbers \
  "$(lynx -dump -listonly -nonumbers  http://www.squid-cache.org/Versions/ | 
     awk '/^http:.*\/Versions\/v/ {print ; exit}')" |
  awk '/^http:.*\.tar.gz/ {print; exit}'
http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.26.tar.gz

Para fazer com que, na verdade, baixe a última versão estável da fonte do squid, envolva o lote inteiro em wget "$(....)"

    
por 06.08.2017 / 14:26

Tags