如何在搜索时用curl显示完整地址?

如何在搜索时用curl显示完整地址?

我需要显示完整的地址卷曲,当它找到状态代码为“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(这个名称是可变的),pipelight也只是一个例子。

这是我应用变量时的最终格式。

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文件并执行grepon地点找出状态代码的 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 - 它不一定是变量,但位于上面是为了提高可读性并证明它是。

所以我们接下来要做的就是${%%*}来自%%尾巴远至我们的输出*能直到我们遇到第一个[特点]在字符串中!不是A0-9数字。

然后我们[测试]根据我们想要的 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 兼容 shell。

结果在当前 shell 环境中进行显式测试,不会在子 shell 管道的远端使用,也不是正则表达式的结果。

它有一个缺点:

这取决于"namefilter=$RESULT"是 URL 字符串的尾部。如果不是的话,可以使用此处应用的相同机制进行处理,但可能至少需要一个以上的 shell 命令。sedawk两者都提供比简单的更强大的字符串搜索${parameter##expansion}球体曾经可以。

但是因为我们量身定制curl首先,要达到我们的目的,您不需要强大的字符串搜索。只要返回你想要的http代码curl并且你的输出应该是"namefilter=$desired_string"然后我不明白怎么办$ppa永远可以等于任何不应该等于的东西。

如果您应该接受多个 http 返回代码,您的[测试]应该看起来像这样:

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

相关内容