正则表达式用于捕获Curl的HTTP状态码和响应体
正则表达式用于捕获Curl的HTTP状态码和响应体
我正在尝试创建一个正则表达式,用于捕获curl请求的HTTP状态码和正文。下面的正则表达式模式在多个在线网站上有效,但无法在我的Mac命令行中的一个shell if语句中匹配。是我的正则表达式有问题还是其他原因?
RESPONSE=$(curl -s -i -X GET https://www.google.com/)
# 匹配并捕获状态码,匹配头部,匹配两个换行符,匹配并捕获可选的正文
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 "匹配"
# 现在可以使用捕获的组进行操作,"${BASH_REMATCH[...]}"
else
echo "未匹配"
fi
我也可以接受其他方法来实现这个目标(我在目标机器上运行的是CentOS 5)。
问题的出现原因是在使用Curl命令获取HTTP状态码和响应内容时,无法直接从命令输出中提取所需的信息。解决方法是使用正则表达式来提取所需的信息。
首先,我们使用命令RESPONSE=$(curl -s -i -X GET https://www.google.com/)
来获取Curl命令的输出并保存到变量RESPONSE
中。
然后,我们使用sed
命令来提取HTTP状态码。我们首先找到第一行以HTTP开头的行,然后删除行中的所有非空格字符直到第一个空格字符,并从结果中删除从第一个空格字符到行尾的内容。将提取出的HTTP状态码保存到变量HTTP_STATUS_CODE
中。
接下来,我们使用sed
命令来提取响应内容。我们找到第一行只包含一个字符的行(之前的行已经被删除),然后打印从该行开始到输入的末尾的所有行。将提取出的响应内容保存到变量BODY
中。
然而,作者在OSX终端中执行时遇到了sed: RE error: illegal byte sequence
错误。解决方法是在每个sed
命令之前设置LC_ALL=C
,通过这种方式固定字符编码。
作者在修复错误后发现HTTP_STATUS_CODE
正常获取,但BODY
的值为空。
问题的出现原因是使用sed命令时出现了"sed: RE error: illegal byte sequence"错误。解决方法是在执行sed命令之前使用LC_ALL=C或者export LC_CTYPE=C export LANG=C命令来设置字符编码。
以下是解决问题的代码:
RESPONSE=$(curl -s -i -X GET https://www.google.com/) CODE=$(echo $RESPONSE | LC_ALL=C sed -n 's/HTTP.* \(.*\) .*/\1/p') BODY=$(echo $RESPONSE | LC_ALL=C tr '\n' ' ' | sed -n 's/.*GMT *\(.*\)/\1/p') echo $CODE echo $BODY
需要注意的是,虽然使用LC_ALL=C或者export LC_CTYPE=C export LANG=C可以让命令正常执行,但是CODE的输出可能会包含一些随机的JS代码,而不是HTTP状态码。