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

时间:2016-04-13 10:53:40

标签: regex bash shell

我试图创建一个正则表达式,捕获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的机器)。

2 个答案:

答案 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'一起删除)。从这里打印每一行直到输入结束。