Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于捕获URL HTTP状态代码和正文响应的正则表达式_Regex_Bash_Shell - Fatal编程技术网

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

Regex 用于捕获URL HTTP状态代码和正文响应的正则表达式,regex,bash,shell,Regex,Bash,Shell,我正在尝试创建一个正则表达式,它捕获HTTP状态代码和curl请求的主体。下面的正则表达式模式适用于多个在线站点,但在Mac的命令行上不匹配。我的正则表达式关闭了还是有其他事情发生了 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 option

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

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的机器)。

既然您也愿意接受其他解决方案,您可以尝试一下

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\u STATUS\u code
位于以HTTP开头的第一行。删除第一个空格之前的每个非空格,以及从结果('302 Found')删除从第一个空格到行尾的所有内容


BODY
从匹配单个字符的第一行开始(前面的行用“D”删除)。从这里开始打印每一行,直到输入结束。

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

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\u STATUS\u code
位于以HTTP开头的第一行。删除第一个空格之前的每个非空格,以及从结果('302 Found')删除从第一个空格到行尾的所有内容


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

与@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


将正文写入文件,并使用
-w
curl标志将curl输出到stdout?尝试使用基本正则表达式,如:
^HTTP/[0-9]\.[0-9][0-9]{3}OK
转义句点和空格是可以的,但其他转义序列是按字面解释的。也不要认为捕获状态代码会起作用。使用sed、awk、perl等可能会更好。@ColeTierney您能详细介绍一下吗?为什么其他转义序列,如
\d
\w
会被逐字解释?@EtanReisner这就是我目前的做法,尽管我试图给自己一个场景,其中我没有对系统的写访问权限,因此这个问题我正在用bash 3.2.57(1)-版本进行测试。尝试以下3个测试:
[=~\s]&&echo yes | | | echo no
(我得到否)、
[[“\s”=~\s]&&echo yes | | | echo no
(我得到是)和
[=[=~[:blank:]]]&&echo yes | | echo no
(我得到是)。将正文写入文件,并使用
-w
curl标志将curl仅输出状态代码到stdout?尝试使用基本正则表达式,如:
^HTTP/[0-9]\.[0-9][0-9]{3}OK
转义句点和空格是可以的,但其他转义序列是按字面解释的。也不要认为捕获状态代码会起作用。使用sed、awk、perl等可能会更好。@ColeTierney您能详细介绍一下吗?为什么其他转义序列,如
\d
\w
会被逐字解释?@EtanReisner这就是我目前的做法,尽管我试图给自己一个场景,其中我没有对系统的写访问权限,因此这个问题我正在用bash 3.2.57(1)-版本进行测试。尝试以下3个测试:
[=~\s]&&echo yes | | | echo no
(我得到否)、
[[“\s”=~\s]&&echo yes | | | echo no
(我得到是)和
[=[=~[:blank:][]echo yes | echo no
(我得到是)。我喜欢这个想法,尽管这两部分都在我的OSX终端中给出了sed:RE错误:非法字节序列。它在OSX中的我的zsh和bash中工作。我不知道问题出在哪里。。。我建议将它复制到文本编辑器中,并显示所有不可打印的字符。我通过@neric在其答案中链接的帖子修复了错误。当运行上述程序时(使用修复程序,在每个
sed
之前设置
LC\u ALL=C
),
HTTP\u STATUS\u code
会通过,但
正文似乎是空的。我喜欢这个主意,尽管这两个部分都在我的OSX终端中给出了
sed:RE错误:非法字节序列
。它在我的zsh和OSX中的bash中工作。我不知道问题出在哪里。。。我建议将它复制到文本编辑器中,并显示所有不可打印的字符。我通过@neric在其答案中链接的帖子修复了错误。当运行上述操作时(使用修复程序,在每个
sed
之前设置
LC\u ALL=C
),
HTTP\u STATUS\u code
会通过,但
正文
似乎是空的。与下面的错误完全相同:
sed:RE错误:非法字节序列
。不知道为什么。我正在把上面的内容复制/粘贴到终端上。嗯,你看到了吗:有趣。将
code
LC_ALL=C
放在
sed
之前可以让命令工作,但输出错误
LC_ALL=C
sed
之前,对于主体,命令仍然失败,并出现相同的错误。好的,通过使用
export LC_CTYPE=C export LANG=C
我使这两个命令都能工作。
BODY
的内容正确,但
code
的内容不正确。似乎包含一些随机的JS而不是HTTP状态代码,错误与下面的错误完全相同:
sed:RE错误:非法字节序列
。不知道为什么。我正在把上面的内容复制/粘贴到终端上。嗯,你看到了吗:有趣。将
code
LC_ALL=C
放在
sed
之前可以让命令工作,但输出错误
LC_ALL=C
sed
之前,对于主体,命令仍然失败,并出现相同的错误。好的,通过使用
export LC_CTYPE=C export LANG=C
我使这两个命令都能工作。
BODY
的内容正确,但
code
的内容不正确。似乎包含一些随机的JS,而不是HTTP状态代码