Regex 用于捕获URL HTTP状态代码和正文响应的正则表达式
我正在尝试创建一个正则表达式,它捕获HTTP状态代码和curl请求的主体。下面的正则表达式模式适用于多个在线站点,但在Mac的命令行上不匹配。我的正则表达式关闭了还是有其他事情发生了Regex 用于捕获URL HTTP状态代码和正文响应的正则表达式,regex,bash,shell,Regex,Bash,Shell,我正在尝试创建一个正则表达式,它捕获HTTP状态代码和curl请求的主体。下面的正则表达式模式适用于多个在线站点,但在Mac的命令行上不匹配。我的正则表达式关闭了还是有其他事情发生了 RESPONSE=$(curl -s -i -X GET http://www.google.com/) # Match and capture the status code, match the headers, match two new lines, match and capture an option
RESPONSE=$(curl -s -i -X GET http://www.google.com/)
# Match and capture the status code, match the headers, match two new lines, match and capture an optional body
re="^HTTP\/\d\.\d\s([\d]{3})[\w\d\s\W\D\S]*[\r\n]{2}([\w\d\s\W\D\S]*)?$"
if [[ "${RESPONSE}" =~ $re ]]; then
echo "match"
# Now do stuff with the captured groups, "${BASH_REMATCH[...]}"
else
echo "no match"
fi
我也愿意接受其他方法(我的目标是一台运行CentOS 5的机器)。既然您也愿意接受其他解决方案,您可以尝试一下
RESPONSE=$(curl -s -i -X GET http://www.google.com/)
HTTP_STATUS_CODE=`echo $RESPONSE | sed '
/HTTP/ {
s/^HTTP[^ ]* //
s/ .*$//
q
}
D'`
BODY=`echo $RESPONSE | sed '
/^.$/ {
:body
n
b body
}
D'`
echo $HTTP_STATUS_CODE
echo $BODY
HTTP\u STATUS\u code
位于以HTTP开头的第一行。删除第一个空格之前的每个非空格,以及从结果('302 Found')删除从第一个空格到行尾的所有内容
BODY
从匹配单个字符的第一行开始(前面的行用“D”删除)。从这里开始打印每一行,直到输入结束。由于您也对其他解决方案持开放态度,您可以尝试一下
RESPONSE=$(curl -s -i -X GET http://www.google.com/)
HTTP_STATUS_CODE=`echo $RESPONSE | sed '
/HTTP/ {
s/^HTTP[^ ]* //
s/ .*$//
q
}
D'`
BODY=`echo $RESPONSE | sed '
/^.$/ {
:body
n
b body
}
D'`
echo $HTTP_STATUS_CODE
echo $BODY
HTTP\u STATUS\u code
位于以HTTP开头的第一行。删除第一个空格之前的每个非空格,以及从结果('302 Found')删除从第一个空格到行尾的所有内容
BODY
从匹配单个字符的第一行开始(前面的行用“D”删除)。从这里开始打印每一行,直到输入结束。与@delarsschneider的想法相同,稍微简单一些
RESPONSE=$(curl -s -i -X GET http://www.google.com/)
CODE=$(echo $RESPONSE | sed -n 's/HTTP.* \(.*\) .*/\1/p')
BODY=$(echo $RESPONSE | tr '\n' ' ' | sed -n 's/.*GMT *\(.*\)/\1/p')
echo $CODE
echo $BODY
与@delarsschneider的想法相同,稍微不那么复杂
RESPONSE=$(curl -s -i -X GET http://www.google.com/)
CODE=$(echo $RESPONSE | sed -n 's/HTTP.* \(.*\) .*/\1/p')
BODY=$(echo $RESPONSE | tr '\n' ' ' | sed -n 's/.*GMT *\(.*\)/\1/p')
echo $CODE
echo $BODY
将正文写入文件,并使用
-w
curl标志将curl输出到stdout?尝试使用基本正则表达式,如:^HTTP/[0-9]\.[0-9][0-9]{3}OK
转义句点和空格是可以的,但其他转义序列是按字面解释的。也不要认为捕获状态代码会起作用。使用sed、awk、perl等可能会更好。@ColeTierney您能详细介绍一下吗?为什么其他转义序列,如\d
或\w
会被逐字解释?@EtanReisner这就是我目前的做法,尽管我试图给自己一个场景,其中我没有对系统的写访问权限,因此这个问题我正在用bash 3.2.57(1)-版本进行测试。尝试以下3个测试:[=~\s]&&echo yes | | | echo no
(我得到否)、[[“\s”=~\s]&&echo yes | | | echo no
(我得到是)和[=[=~[:blank:]]]&&echo yes | | echo no
(我得到是)。将正文写入文件,并使用-w
curl标志将curl仅输出状态代码到stdout?尝试使用基本正则表达式,如:^HTTP/[0-9]\.[0-9][0-9]{3}OK
转义句点和空格是可以的,但其他转义序列是按字面解释的。也不要认为捕获状态代码会起作用。使用sed、awk、perl等可能会更好。@ColeTierney您能详细介绍一下吗?为什么其他转义序列,如\d
或\w
会被逐字解释?@EtanReisner这就是我目前的做法,尽管我试图给自己一个场景,其中我没有对系统的写访问权限,因此这个问题我正在用bash 3.2.57(1)-版本进行测试。尝试以下3个测试:[=~\s]&&echo yes | | | echo no
(我得到否)、[[“\s”=~\s]&&echo yes | | | echo no
(我得到是)和[=[=~[:blank:][]echo yes | echo no
(我得到是)。我喜欢这个想法,尽管这两部分都在我的OSX终端中给出了sed:RE错误:非法字节序列。它在OSX中的我的zsh和bash中工作。我不知道问题出在哪里。。。我建议将它复制到文本编辑器中,并显示所有不可打印的字符。我通过@neric在其答案中链接的帖子修复了错误。当运行上述程序时(使用修复程序,在每个sed
之前设置LC\u ALL=C
),HTTP\u STATUS\u code
会通过,但正文似乎是空的。我喜欢这个主意,尽管这两个部分都在我的OSX终端中给出了sed:RE错误:非法字节序列
。它在我的zsh和OSX中的bash中工作。我不知道问题出在哪里。。。我建议将它复制到文本编辑器中,并显示所有不可打印的字符。我通过@neric在其答案中链接的帖子修复了错误。当运行上述操作时(使用修复程序,在每个sed
之前设置LC\u ALL=C
),HTTP\u STATUS\u code
会通过,但正文
似乎是空的。与下面的错误完全相同:sed:RE错误:非法字节序列
。不知道为什么。我正在把上面的内容复制/粘贴到终端上。嗯,你看到了吗:有趣。将code
的LC_ALL=C
放在sed
之前可以让命令工作,但输出错误LC_ALL=C
在sed
之前,对于主体,命令仍然失败,并出现相同的错误。好的,通过使用export LC_CTYPE=C export LANG=C
我使这两个命令都能工作。BODY
的内容正确,但code
的内容不正确。似乎包含一些随机的JS而不是HTTP状态代码,错误与下面的错误完全相同:sed:RE错误:非法字节序列
。不知道为什么。我正在把上面的内容复制/粘贴到终端上。嗯,你看到了吗:有趣。将code
的LC_ALL=C
放在sed
之前可以让命令工作,但输出错误LC_ALL=C
在sed
之前,对于主体,命令仍然失败,并出现相同的错误。好的,通过使用export LC_CTYPE=C export LANG=C
我使这两个命令都能工作。BODY
的内容正确,但code
的内容不正确。似乎包含一些随机的JS,而不是HTTP状态代码