전체 주소를 보여줘야 해요곱슬, 상태 코드가 "301"인 결과를 찾은 경우.
이것은 내 변수입니다.
search=$(curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o /dev/null | sed 's#404##g')
echo $search
301
위의 방법은 작동하지만 사이트가 존재하고 상태 코드가 "301"인 경우에만 표시됩니다.
제 생각에는
echo $search
https://launchpad.net/~mqchael/+archive/pipelight
고쳐 쓰다
여기에 내가 필요한 것을 설명할 수 있는 새 변수가 있습니다. 이 변수를 사용하면 Ubuntu에서 유사한 ppa를 검색하고 설치할 수 있습니다.
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
(이름은 변경 가능함). 파이프라이트도 단지 예일 뿐입니다.
변수를 적용할 때의 최종 형식입니다.
ppa:mqchael/pipelight
답변1
이렇게 하면 원하는 작업이 수행됩니다.
curl https://launchpad.net/ubuntu/+ppas?name_filter=Pipelight | awk -F/ '/>Pipelight</{print $2}'
설명하다:
-F/
필드 구분 기호를 로 설정합니다. /
이는 " />Pipelight</
일치하는 유일한 줄에서 명령을 실행합니다. 따라서 적어도 게시한 예에서 줄은 다음과 같습니다.{}
>Pipelight<
>Pipelight<
<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/~//'
답변2
301
어떤 웹사이트가 상태 코드를 반환하는지 알아내려고 하시는 것 같습니다 . 실제로 명령 내용을 curl
파일에 쓰고 실행할 grep
수 있습니다.장소상태 코드의 URL을 알아보세요 301
. 이 시도.
curl -s --head -w %{http_code} https://launchpad.net/~[a-z]/+archive/pipelight -o
grep 'Location' file1.txt
출력은 다음과 같습니다.
Location: https://launchpad.net/~j/+archive/ppa/pipelight
답변3
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만 있습니다. 변수일 필요는 없지만 가독성과 증명을 위해 위에 있습니다.할 수 있는예.
그럼 우리가 다음에 해야 할 일은
${
조각%%*}
~에서%%
꼬리우리의 생산량만큼*할 수 있는우리가 처음 만날 때까지[
특징]
문자열로!
아니요ㅏ0-9
숫자.그럼 우리는
[
시험]
우리가 원하는 http return에 따라 결과를 반환하여 얻은 숫자 문자열$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}
구체는 한때 가능했습니다.
하지만 저희는 맞춤 제작을 하기 때문에curl
~의첫째, 우리의 목적을 위해서는 강력한 문자열 검색이 필요하지 않습니다. 원하는 http 코드를 반환하면 됩니다.curl
그리고 당신의 출력은"namefilter=$desired_string"
그러면 어떻게 해야 할지 모르겠어요$ppa
같지 않아야 하는 모든 것과 항상 같을 수 있습니다.
여러 http 반환 코드를 수락해야 하는 경우[
시험]
다음과 같아야 합니다.
codes="$code1 $code2 $code3"
...
[ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...