【问题标题】:Save Alternate Output to Variable in Bash instead of Main Output?将备用输出保存到 Bash 中的变量而不是主输出?
【发布时间】:2021-11-18 14:41:45
【问题描述】:

这里是 Linux 新手,所以请多多包涵。

我正在为学校编写一个 Bash 脚本(在 CentOS 8 虚拟机上),并且我正在尝试将 Siege(负载测试器)的输出保存到一个变量中,以便我可以比较值。

这是我遇到的问题:“服务器现在处于围城”和“解除服务器围城...”之间的 HTTP 行是存储在变量中的内容,而不是之后的漂亮小摘要“解除服务器围攻……”

[root@prodserver siege-4.1.1]# siege -c 1 -t 1s 192.168.1.3
** SIEGE 4.1.1
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.00 secs:    6707 bytes ==> GET  /
HTTP/1.1 200     0.01 secs:    2008 bytes ==> GET  /assets/images/taste_bug.gif
HTTP/1.1 200     0.00 secs:    2579 bytes ==> GET  /assets/images/backpack_bug.gif
HTTP/1.1 200     0.00 secs:    2279 bytes ==> GET  /assets/images/desert_bug.gif
HTTP/1.1 200     0.00 secs:    1653 bytes ==> GET  /assets/images/calm_bug.gif
HTTP/1.1 200     0.00 secs:    1251 bytes ==> GET  /assets/javascripts/menus.js
...Shortened for readability...
HTTP/1.1 200     0.00 secs:    1251 bytes ==> GET  /assets/javascripts/menus.js
HTTP/1.1 200     0.00 secs:    2579 bytes ==> GET  /assets/images/backpack_bug.gif
HTTP/1.1 200     0.00 secs:    2279 bytes ==> GET  /assets/images/desert_bug.gif
HTTP/1.1 200     0.00 secs:    1653 bytes ==> GET  /assets/images/calm_bug.gif
HTTP/1.1 200     0.00 secs:    1251 bytes ==> GET  /assets/javascripts/menus.js
HTTP/1.1 200     0.01 secs:    2008 bytes ==> GET  /assets/images/taste_bug.gif
HTTP/1.1 200     0.00 secs:    2579 bytes ==> GET  /assets/images/backpack_bug.gif
HTTP/1.1 200     0.00 secs:    2279 bytes ==> GET  /assets/images/desert_bug.gif
HTTP/1.1 200     0.00 secs:    1653 bytes ==> GET  /assets/images/calm_bug.gif

Lifting the server siege...
Transactions:                149 hits
Availability:             100.00 %
Elapsed time:               0.22 secs
Data transferred:           3.95 MB
Response time:              0.00 secs
Transaction rate:         677.27 trans/sec
Throughput:            17.97 MB/sec
Concurrency:                1.00
Successful transactions:         149
Failed transactions:               0
Longest transaction:            0.01
Shortest transaction:           0.00

目前这是我尝试将变量存储在 bash 中的方式:

SIEGE="$(siege -c $1 -t $2 [ip])"

如前所述,当我回显 $SIEGE 时,事实证明该变量存储了所有 HTTP 行,而不是“解除围城...”之后的摘要

我的问题是如何将摘要存储在变量中。

【问题讨论】:

  • 看不到产生第一个输出的命令。此外,还不清楚您的“siege -c $1 -t $2 [ip]”命令产生了什么输出,以及您如何创建要保存到变量的输出。
  • 不要对外部图像使用 lnks,而是直接将示例输出剪切并粘贴到问题中(根据需要应用代码格式),否则如果/当链接图像消失时,我们会留下一个不完整的问题;至于捕获siege 输出......看看它是多么的大......我建议保存到一个文件然后解析文件(解析一个文件比一个塞满了很多的变量要容易得多文本行)
  • @Saboteur 为清晰起见进行了更新。当时我无法将 VM 的输出输出到我的桌面,但我找到了一种方法。我提供了命令的输出,并澄清了问题。
  • @markp-fuso 为清晰起见进行了更新。当时我无法将 VM 的输出输出到我的桌面,但我找到了一种方法。我提供了命令的输出,并澄清了问题。

标签: linux bash variables siege


【解决方案1】:

注意:我不熟悉siege,所以我不知道是所有输出都到stdout,还是部分输出到stderr .

假设所有siege 输出都将转到stdout ......根据需要忽略哪些行的几个想法:

# grab lines from `^Lifting` to end of output:

SIEGE="$(siege -c $1 -t $2 [ip] | sed -n '/^Lifting/,$ p')"

# ignore all lines starting with `^HTTP`

SIEGE="$(siege -c $1 -t $2 [ip] | grep -v '^HTTP')"

如果结果是某些输出被发送到stderr,请将siege 调用更改为将stderr 重定向到stdout

# from

siege -c $1 -t $2 [ip]

# to

siege -c $1 -t $2 [ip] 2>&1

虽然我可能会选择将所有输出保存到文件中,然后根据需要解析文件,ymmv ...

【讨论】:

  • 感谢您的帮助。可悲的是,这些似乎都没有让我到达我想要的地方。我尝试将输出保存到文本文件中,但是该命令给出的最终摘要未包含在文本文件中。我想知道它是否可能。几乎看起来就像它自己的脚本,一旦完成就会运行。
  • 如果添加 2>&1(将 stderr 重定向到 stdout)不起作用... 抱歉 ...需要更多关于 siege 是什么以及它如何生成的详细信息输出(例如,正如你提到的,可能是一个单独的操作系统进程写入同一个 tty ...?)
猜你喜欢
  • 2011-11-10
  • 1970-01-01
  • 2021-10-18
  • 2021-11-12
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多