Como exibir o endereço completo com o curl na pesquisa?

0

Eu preciso exibir o endereço completo com curl , quando encontrar resultados com '301 'código de status.

Esta é minha variável.

search=$(curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o /dev/null | sed 's#404##g') 

echo $search
301

Os trabalhos acima, mas só são exibidos se o site existir com o código de status '301'.

Eu quero

echo $search
https://launchpad.net/~mqchael/+archive/pipelight

UPDATE

Esta é minha nova variável, talvez possa explicar o que preciso. Essa variável me permitirá pesquisar e instalar um ppa no Ubuntu o similar.

ppa=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=$packagename | grep '<td><a href="/~' | grep ">$packagename<" )

echo $ppa

Exemplo:

ppa=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight | grep '<td><a href="/~' | grep ">Pipelight<" )

echo $ppa 

<td><a href="/~mqchael/+archive/pipelight">Pipelight</a></td>

O problema aqui é que não consigo extrair mqchael (esse nome é variável), também pipelight é apenas um exemplo.

Este é o formato final quando vou aplicar minha variável.

ppa:mqchael/pipelight
    
por davidva 21.03.2014 / 21:23

3 respostas

2

Isso deve fazer o que você quer:

curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight |  awk -F/ '/>Pipelight</{print $2}'

Explicação:

O -F/ define o delimitador arquivado como / , e o />Pipelight</ significa "execute os comandos no {} apenas nas linhas correspondentes a >Pipelight< . Assim, pelo menos no exemplo que você publicou, o linha com >Pipelight< é:

<td><a href="/~mqchael/+archive/pipelight">Pipelight</a></td>

Portanto, como awk está dividindo em / , o primeiro campo será <td><a href=" e o segundo será ~mqchael . É por isso que {print $2} imprime ~mqchael .

Se você também quiser se livrar do til ( ~ ), use isto:

curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight |  
    awk -F/ '/>Pipelight</{print $2}' | sed 's/~//'
    
por 22.03.2014 / 19:02
0

Acho que você está tentando descobrir os sites que têm o código de status 301 retornado. Você pode gravar o conteúdo do comando curl em um arquivo e fazer um grep no Local para descobrir as URLs do código de status 301 . Tente este.

curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o
grep 'Location' file1.txt

A saída seria,

Location: https://launchpad.net/~j/+archive/ppa/pipelight
    
por 21.03.2014 / 21:44
0
code=$desired_HTML_return_code
url="https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight"
_curl=$( curl -o /dev/stderr -sL -w \
    "%{http_code} %{url_effective}\n" "$url" ) 
[ ${_curl%%[!0-9]*} -eq  $code ] && {\
    ppa="${_curl##*~}"
    ppa="ppa:${ppa%%/*}/${_curl##*namefilter=}" 
}

Então, eu não testei o que foi dito acima, mas aparentemente curl para garantir sua saída, em vez de depender dos analisadores em grande grau.

Como escrito curl deve imprimir em seu curl somente o código de retorno http de sua consulta e o URL que você o alimenta - o que não precisa ser uma variável, mas está acima de legibilidade e de demonstrar que pode ser.

So the next thing we do is ${strip%%*} from the %%tail of that output as far forward as we *can until we encounter the first [character] in the string that !isn't a 0-9number.

Then we [test] the resulting numeric string against our desired http return $code.

&&If they -equal we ${strip##*} from the ##head of our stored $_curl output as far forward as we can up to and including the last ~tilde it contains and assign= the results to $ppa.

Then we assign= $ppa again to:

The string "ppa:" plus:

${ppa's} previous value ${less%%*} the first /forward-slash it contains and everything thereafter plus:

Only what remains of $_curl after ${removing##*} from its ##head everything up to and including the string "namefilter="

Isso oferece algumas vantagens sobre as outras soluções.

As already explained, curl guarantees its standard output only to be the short string "$code $url", but, as written, it also sends the html results to your terminal for debugging on standard error. Its results are not consumed by a parsing program.

Only two applications are involved here: curl and whatever POSIX-compatible shell in which you invoke it.

The results are explicitly tested in the current shell environment and are not consumed on the far side of a subshelled pipe nor are they the result of a regular expression.

Tem uma desvantagem:

It depends upon the "namefilter=$RESULT" being the tail of your URL string. It is possible to handle using the same mechanics applied here if it is not, but it will likely require at least one more shell command. sed and awk both offer more powerful string searches than simple ${parameter##expansion} globs ever could.

MAS porque ajustamos a saída de stdout para o nosso propósito, em primeiro lugar, você não precisa de pesquisas de string poderosas. Contanto que o código http desejado seja retornado para curl E sua saída deve ser curl , então não vejo como "namefilter=$desired_string" pode sempre igualar qualquer coisa que não deveria.

Se você deve aceitar vários códigos de retorno http, seu $ppa test [ deve ser assim:

codes="$code1 $code2 $code3"
...
[ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...
    
por 23.03.2014 / 10:54

Tags