我需要显示完整的地址卷曲,当它找到状态代码为“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
文件并执行grep
on地点找出状态代码的 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 命令。sed
和awk
两者都提供比简单的更强大的字符串搜索${parameter##expansion}
球体曾经可以。
但是因为我们量身定制curl
的首先,要达到我们的目的,您不需要强大的字符串搜索。只要返回你想要的http代码curl
并且你的输出应该是"namefilter=$desired_string"
然后我不明白怎么办$ppa
永远可以等于任何不应该等于的东西。
如果您应该接受多个 http 返回代码,您的[
测试]
应该看起来像这样:
codes="$code1 $code2 $code3"
...
[ "${codes#*"${_curl%%[!0-9]*}"} -ne "$codes" ] && ppa=...