【问题标题】:How to execute a url and parse it from bash shell script?如何执行 url 并从 bash shell 脚本中解析它?
【发布时间】:2014-03-06 20:48:57
【问题描述】:

我正在做一个项目,我需要从 bash shell 脚本对我的一台服务器进行 url 调用..

http://hostname.domain.com:8080/beat

点击上述网址后,我将得到以下响应,我需要对其进行解析并提取 syncssyncs_behind 的值

state: READY num_retries_allowed: 3 syncs: 30 syncs_behind: 100 num_rounds: 60 hour_col: 2 day_col: 0 oldest_day_col: 0

现在我需要在 10 分钟内每 10 秒点击一次上述 url,并从中提取 syncssyncs_behind 的值,并使用以下条件对其进行验证 -

syncs > 8
syncs_behind = 0

如果同步大于 8 并且 syncs_behind = 0,那么我将结束我的 shell 脚本并显示一些消息 - “数据已验证”,否则我将继续尝试 10 分钟的窗口。如果在那 10分钟窗口,这不会发生无论如何我都会结束shell脚本,这意味着我不会再试一次。

所以我从下面的代码开始但卡住了,我应该怎么做才能解析来自 URL 的数据 -

#!/bin/sh
wget -O - -q -t 1 http://hostname.domain.com:8080/beat

我对 shell 脚本不太熟悉,所以在阅读后我开始了解 wget.. 可能有更好的方法..

有什么想法可以做到这一点吗?

更新:-

我将文件保存为beat.sh,内容如下 -

#!/bin/bash

COUNT=60   #number of 10 second timeouts in 10 minutes
SUM_SYNCS=0
SUM_SYNCS_BEHIND=0

while [[ $COUNT -ge "0" ]]; do

#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)

#grep $DATA for syncs and syncs_behind
SYNCS=$(echo $DATA | grep -o 'syncs:: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo $DATA | grep -o 'syncs_behind: [0-9]+' | awk '{print $2}')
echo $SYNCS
echo $SYNCS_BEHIND

#add new values to the sum totals
let SUM_SYNCS+=SYNCS
let SUM_SYNCS_BEHIND+=SYNCS_BEHIND

#verify conditionals
if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi

#decrement the counter
let COUNT-=1

#wait another 10 seconds
sleep 10

done

当我以./beat.sh 运行它时,出现以下错误 -

./beat.sh: line 23: syntax error in conditional expression
./beat.sh: line 23: syntax error near `-a'
./beat.sh: line 23: `if [[ $SYNCS -gt "8" -a $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi'

任何想法我在这里做错了什么?

【问题讨论】:

标签: linux bash shell unix ubuntu


【解决方案1】:

伟大的开始!让我们分解一下:

COUNT=60   #number of 10 second timeouts in 10 minutes
SUM_SYNCS=0
SUM_SYNCS_BEHIND=0

while [[ $COUNT -ge "0" ]]; do

#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)

#grep $DATA for syncs and syncs_behind
SYNCS=$(echo $DATA | grep -oE 'syncs: [0-9]+' | awk '{print $2}')
SYNCS_BEHIND=$(echo $DATA | grep -oE 'syncs_behind: [0-9]+' | awk '{print $2}')

#add new values to the sum totals
let SUM_SYNCS+=SYNCS
let SUM_SYNCS_BEHIND+=SYNCS_BEHIND

#verify conditionals
if [[ $SYNCS -gt "8" && $SYNCS_BEHIND -eq "0" ]]; then exit -1; fi

#decrement the counter
let COUNT-=1

#wait another 10 seconds
sleep 10

done

【讨论】:

  • 感谢您的建议.. 在我的示例中,我需要验证 sync > 8 和 sync_behind = 0 是否只有我会跳出我的 shell 脚本.. 当它们都为真时..在您的示例中,您只验证了我猜的同步。
  • 当然.. 还有你为什么要添加这些? #add new values to the sum totals let SUM_SYNCS+=SYNCS let SUM_SYNCS_BEHIND+=SYNCS_BEHIND 有什么特别的原因吗?我只需要根据我的情况验证 syncs > 8 和 sync_behind = 0 是否?
  • 而且当我运行你的代码时,我尝试打印出 SYNCS 和 SYNCS_BEHIND,但它没有以某种方式打印出来。它是空的。有什么想法吗?
  • 我通过编辑修复了几个问题。您需要额外的 E 选项才能将扩展正则表达式与 [0-9] 一起使用,而 bash 不支持 -a选项。所以你需要使用&& 而不是-a
  • @problemPotato:你能解释一下我们是否需要#add new values to the sum totals let SUM_SYNCS+=SYNCS let SUM_SYNCS_BEHIND+=SYNCS_BEHIND吗?
【解决方案2】:

不是 c&p 就绪的解决方案,但希望能帮助您入门:

您想将wget 的输出重定向到一个文件中,然后使用awksed 的组合来提取您真正感兴趣的部分。您可能需要几分钟时间'hello worlds' 与这两个命令,但它非常值得努力。

在重试/退出方面,您可能需要一个带有if 语句的无限循环来评估退出条件。对于时间控制,我会使用sleep 命令,尽管crontab 可能是一个值得考虑的替代方案。

我建议专注于第一部分(解析和评估),一旦你准备好继续前进,也许会提出一个新问题......

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多