Как отобразить полный адрес с curl в поиске?

Мне нужно отобразить полный адрес с curl , когда он находит результаты с кодом статуса 301.

Это моя переменная.

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

Вышеприведенное работает, но отображается только в том случае, если сайт существует с кодом статуса 301.

я хочу

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

ОБНОВИТЬ

Это моя новая переменная, может быть, может объяснить, что мне нужно. Эта переменная поможет мне искать и устанавливать ppa в Ubuntu o аналогично.

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

Пример:

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> 

Проблема здесь в том, что я не могу извлечь mqchael (это имя является переменной), а также pipelight – только пример.

Это окончательный формат, когда я буду применять свою переменную.

 ppa:mqchael/pipelight 

Это должно делать то, что вы хотите:

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

Объяснение:

-F/ устанавливает поданный разделитель в / , а />Pipelight</ "запускает команды в {} только в строках, соответствующих >Pipelight< . Итак, по крайней мере, в примере, который вы опубликовали, строка с >Pipelight< is:

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

Итак, поскольку awk расщепляется на / , первое поле будет <td><a href=" а второе будет ~mqchael . Вот почему {print $2} будет печатать ~mqchael .

Если вы также хотите избавиться от тильды ( ~ ), используйте это:

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

Я думаю, вы пытаетесь найти сайты, на которых есть код статуса 301 . Фактически вы можете написать содержимое команды curl в файл и сделать grep on Location, чтобы узнать URL-адреса для кода состояния 301 . Попробуй это.

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

Выход был бы,

 Location: https://launchpad.net/~j/+archive/ppa/pipelight 
 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=}" } 

Поэтому я не тестировал выше, но, по-видимому, этот парень имеет, и он также довольно хорошо объясняет, что делают различные операнды curl , не говоря уже о многих других, которые у вас есть в вашем распоряжении. Дело в том, что вы сами используете curl , чтобы гарантировать его выход, а не полагаться на синтаксические анализаторы.

Поскольку письменный curl должен печатать на своем stdout только код возврата HTTP своего запроса и URL-адрес, который вы его кормите, который не должен быть переменной, но выше для читаемости и демонстрировать, что это может быть.

Итак, следующая вещь, которую мы делаем, это ${ strip %%*} из хвоста %% этого вывода, насколько мы можем, пока мы не встретим первый символ [ ] в строке, которая ! не является числом 0-9 .

Затем мы проверим итоговую числовую строку на наш желаемый $code. возврата http $code.

&&If они -equal мы ${strip##*} из ##head нашего хранимого вывода $_curl так далеко, насколько можем, и в том числе последнюю ~tilde он содержит, и assign= результаты $ppa .

Затем снова assign= $ppa :

Строка «ppa:» плюс:

${ppa's} предыдущее значение ${less%%*} сперва /forward-slash он содержит, и все после этого плюс:

Только то, что осталось от $_curl после ${removing##*} из его ##head вплоть до строки "namefilter="

Это дает некоторые преимущества перед другими решениями.

Как уже объяснялось, curl гарантирует, что его стандартный вывод будет только короткой строкой "$code $url" , но, как написано, он также отправляет результаты html на ваш терминал для отладки стандартной ошибки. Его результаты не потребляются программой синтаксического анализа.

Здесь задействованы только два приложения: curl и любая совместимая с POSIX оболочка, в которой вы ее вызываете.

Результаты в явном виде проверяются в текущей среде оболочки и не потребляются на противоположной стороне подсолнечного канала и не являются результатом регулярного выражения.

У него есть один недостаток:

Это зависит от того, что "namefilter=$RESULT" является хвостом вашей строки URL. Можно обрабатывать с использованием той же самой механики, применяемой здесь, если это не так, но для нее, скорее всего, потребуется хотя бы еще одна команда оболочки. sed и awk предлагают более мощные поиски строк, чем просто доступные ${parameter##expansion} expand ${parameter##expansion} globs.

НО, потому что мы адаптируем вывод curl для нашей цели, в первую очередь вам не нужны мощные поиски строк. До тех пор, пока ваш желаемый http-код будет возвращен для curl И ваш вывод должен быть "namefilter=$desired_string" тогда я не вижу, как $ppa может когда-либо равняться чему бы то ни было.

Если вы должны принять несколько кодов возврата HTTP, ваш [ тест ] должен выглядеть так:

 codes="$code1 $code2 $code3" ... [ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...