我试图创建一个正则表达式,捕获HTTP状态代码以及卷曲请求的正文。下面的正则表达式模式适用于多个在线网站,但在我的Mac命令行中不匹配in a shell if-statement。我的正则表达式是关闭还是还有其他事情发生?
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的机器)。
答案 0 :(得分:3)
与@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
答案 1 :(得分:2)
由于您也对其他解决方案持开放态度,您可以尝试一下。
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开头的第一行中找到 HTTP_STATUS_CODE
。直到第一个空格被移除的每个非空格和结果(' 302 Found')从第一个空格到直线末尾的所有内容都被删除。
BODY
从匹配单个字符的第一行开始(之前的行与' D'一起删除)。从这里打印每一行直到输入结束。