当前位置: 首页 > 知识库问答 >
问题:

将curl响应和-w保存到变量

申屠弘图
2023-03-14

我使用下面的命令来卷曲url,并显示--write out选项提供的响应\u code时间\u total

curl -o /dev/null -sL $@ -w "$(printf %-100.100s $@) %{response_code}\t%{time_total}\n"
# https://example.com/?p=5                                200            0.084437

由于一些页面显示了基于cms的404,我想检查页面内容中的特定字符串,并在输出中显示包含:true/false

https://example.com/?p=4                  No               200           0.084437
https://example.com/?p=5                  Yes              200           0.081241

所以我想真正的问题是,如何让-w显示他的输出,同时将响应主体保存到变量?

基于这个答案,我目前正在使用这个变通方法

# <body>\n<code>#<time>
c=$(curl -o - -s -L ${1} -w "%{response_code}#%{time_total}")

# Body
cb=$(sed '$ d' <<< "$c")

# Info
ci=$(tail -n1 <<< "$c")
IFS='#' read -r -a cs <<< "$ci"

# CMS-404
ul=<regex magic>
[[ $ul != ${2} ]] && pe="CMS-404" || pe=""

# Print result
printf "$(printf %-100.100s ${1})\t${pe}\t\t${cs[0]}\t${cs[1]}\n"

它捕获完整的输出,获取最后一行,其中包含-w信息,并使用sed获取剩余内容,即正文。

由于我希望-w输出(可选)是多行,因此我正在寻找一种更可靠的方法来实现这一点。

链接问题/答案

>

  • 如何使用cURL一次测量请求和响应时间?

    因为-w不能输出页面内容,不是一个选项

    如何在Bash中将curl输出存储在多个变量中

    是拆分页面内容,无-w选项

    Curl返回超文本传输协议状态代码以及响应

    不保存为变量

    补充资料

    编辑,根据@Philippe的回答,这似乎是可行的,但是,ci=“${c#*$'\1'}”非常慢,因为我使用这个函数处理1000个url,我希望有一个“更快”的解决方案。

    我已经用下面的脚本进行了测试,简化了;

    #!/bin/bash
    
    get() {
    
        echo "---> ${1}"
    
        # Request
        c=$(curl -o - -s -L ${1} -w $'\1'"%{response_code}#%{time_total}")
    
        # Body
        cb="${c%$'\1'*}"
        time_after_body=$(date +%s%N)
    
        ci="${c#*$'\1'}"
        time_after_info=$(date +%s%N)
    
        time_diff="$((time_after_info - time_after_body))"
        echo "TimeDiff: ${time_diff}ms"
        echo "CurlInfo: ${ci}"
    }
    
    get "https://stackoverflow.com/questions/65395089/save-curl-response-and-w-to-variables"
    
     ✗ ./small_so.sh
    ---> https://stackoverflow.com/questions/65395089/save-curl-response-and-w-to-variables
    TimeDiff: 9886412000ms
    CurlInfo: 200#0.469687
    
  • 共有1个答案

    宋正真
    2023-03-14

    您能使用像$'\1'这样的标记吗?

    #!/usr/bin/env bash
      
    c=$(curl -o - -s -L ${1} -w $'\1'"%{response_code}#%{time_total}")
    
    cb="${c%$'\1'*}"
    
    ci="${c#*$'\1'}"
    
    declare -p cb ci
    
    # Calling method : ./test.sh "https://example.com/?p=5"
    

    我刚刚在macos上测试过:

    ~/$ /bin/bash --version
    GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
    Copyright (C) 2007 Free Software Foundation, Inc.
    
    ~/$ /bin/bash test.sh "https://example.com/?p=5"
    declare -- cb="<!doctype html>
    ...
    "
    declare -- ci="200#0.693779"
    
     类似资料:
    • 问题内容: 我仍然是jQuery和ajax领域的新手,但是我有一个$ .ajax请求,执行GET来检索一些XML文件(〜6KB或更少),但是在用户花那个页面的时间内,XML内容应该不会/不会更改(此设计我无法更改,在我从其他地方读取XML文件时也无权更改它)。因此,我有一个全局变量将响应数据存储到该变量中,并且对该数据进行的所有后续查询都将在此变量上进行,因此不需要进行多个请求。 考虑到XML文件

    • 问题内容: 我使用getJSON从我的网站请求JSON。效果很好,但是我需要将输出保存到另一个变量中,如下所示: 我需要将结果保存到其中,但似乎此语法不正确。有任何想法吗? 问题答案: 仅在响应后才能调用,无法获得价值。

    • 问题内容: 我想知道如何将PHP变量保存到txt文件,然后再次检索它们。 例: 有一个输入框,提交后,在输入框中写入的内容将保存到文本文件中。稍后,需要将结果作为变量返回。因此,可以说变量是$ text,我需要将其保存到文本文件中并能够再次取回它。 问题答案: 这应该可以执行您想要的操作,但是如果没有更多上下文,我无法确定。 将$ text写入文件: 再次检索它:

    • 问题内容: 我试图在同一行中打印逗号后的值,以便我可以拥有这些值的csv文件,但即时通讯无法保存的值 预期输出为 请让我知道我做错了,谢谢! 问题答案: 使用反引号(或-可以嵌套),而不是单引号:

    • 我有一个包含10个项目(书名)的Jlist。用户将被允许从10个项目中选择3个。我想将选定的项目保存到3个不同的字符串变量(例如book0、book1、book2等)。 我不知道该怎么做。

    • 问题内容: 我遇到下面显示的行未将变量存储到全局范围的问题: 我究竟做错了什么?我需要将其包装到单独的函数中还是什么? 问题答案: 该代码在收到响应之前运行。 这就是为什么。 在这里,您可以看到警报发生故障。默认情况下,AJAX请求不会阻止后续代码运行。 这就是拥有 回调 方法的全部目的。该方法在适当的时间被调用,而不是依赖于同步执行。