Regex,用于捕获Curl HTTP状态代码和正文响应



我正在尝试创建一个regex,它可以捕获HTTP状态代码和curl请求的主体。下面的regex模式适用于多个在线网站,但在我的Mac命令行上的shell if语句中不匹配。我的正则表达式关闭了吗?还是发生了其他事情?

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.ds([d]{3})[wdsWDS]*[rn]{2}([wdsWDS]*)?$"
if [[ "${RESPONSE}" =~ $re ]]; then
  echo "match"
  # Now do stuff with the captured groups, "${BASH_REMATCH[...]}"
else
  echo "no match"
fi

我也对其他方法持开放态度(我的目标是运行Centos5的机器)。

由于您也对其他解决方案持开放态度,因此可以尝试一下。

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

CCD_ 1位于以HTTP开头的第一行中。删除第一个空格之前的每个非空格,并从结果('302Found')中删除从第一个空格到行尾的所有内容。

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

最新更新