正则表达式用于捕获Curl的HTTP状态码和响应体

20 浏览
0 Comments

正则表达式用于捕获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)。

0
0 Comments

问题的出现原因是在使用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的值为空。

0
0 Comments

问题的出现原因是使用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状态码。

0