使用wget和awk从网站提取货币汇率

时间:2019-02-20 07:47:05

标签: bash awk grep

我想从网站上获取当前汇率:

<span id="aq_usdpln#1_c5">3.81990</span>

结果应为USD: 3.81

也可以获取此代码,但是它不起作用:

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0"|awk -F"[ >]" '/<span id="aq_usdpln#1_c5">/ {printf "%s"}'

可以帮助别人并粘贴正确的代码吗? 谢谢

4 个答案:

答案 0 :(得分:1)

请您尝试以下。

yor_command | awk -F"[><]" '{printf("USD: %.02f\n",$3)}'

答案 1 :(得分:1)

我发现wget返回的html(和javascript等)的困难在于,当使用{{1时,它是由148506个字段组成的一些5007个字符}}作为文件分隔符。

一种解决方案是遍历每个字段并找到您的-F'[><]'文本,然后将下一个字段作为浮点值,例如

"span id=aq_usdpln_c5"

使用/输出示例

您只需将以上内容粘贴到终端中,例如

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | 
awk -F'[><]' '{
    for (i = 1; i <= NF; i++)
        if ($i == "span id=aq_usdpln_c5")
            printf "USD: %.2f\n", $(i+1)
}'

仔细研究一下,如果您有任何疑问,请告诉我。

答案 2 :(得分:0)

您快到了,您错过了 sed 函数调用。 Sed可帮助您解析和转换Shell中的文本。

尝试一下:

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F ">" '{ print $2 }' | sed 's/<\/span\>//' | awk '{ print substr($0,0,4) }'
3.81
  1. awk -F ">" '{ print $2 }'在定界符>上分割文本,并打印第二部分
  2. sed 's/<\/span\>//'用注释替换文本/span>
  3. awk '{ print substr($0,0,4) }' substr(s,i [,n])返回从i开始的s的最多n个字符的子字符串。如果省略n,则使用s的其余部分。

答案 3 :(得分:0)

站点不断变化,它将为不同的位置和不同的UA提供不同的来源。
当我对其进行测试时,返回的源代码不包含ID "aq_usdpln#1_c5",而是包含aq_usdpln_c5,并且ID周围没有引号。

我认为最好先使用GNU grep,对regex进行一些概括,然后再输入awk

$ wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | grep -oP "span id=.?aq_usdpln(#1)?_c5.?>\K.*?(?=<)"|awk -F. '{printf "USD: %s.%s\n",$1,substr($2,1,2)}'
USD: 3.81

grep的正则表达式span id=.?aq_usdpln(#1)?_c5.?>\K.*?(?=<)
.?用于公开报价,它可能存在或不存在。
(#1)?类似,如果存在#1则兼容。
\K表示正则表达式将匹配它之前的内容,但仅返回它之后的内容。
.*?表示匹配所有更长的内容,但不匹配。
(?=<)表示匹配应在<之前结束,但不包含<本身。

我也建议您在wget命令中添加UA。

如果您不希望在结果后添加换行符,请删除\n部分的"USD: %s.%s\n"

如果您需要 round 而不是截断,请在awk '{printf "USD: %.2f",$0}'部分使用awk
-从您的示例中,我可以看到您想要截断,因为3.81990将四舍五入到3.82,但是您可能也需要此选项。

如果您不希望使用grep部分,也可以使用(需要GNU awk):

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F'[.>]' '/^span id=.?aq_usdpln(#1)?_c5/{printf "USD: %s.%s\n",$2,substr($3,1,2)}' RS='<'

或者这不需要GNU awk:

wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F. 'sub(/^span id=.?aq_usdpln(#1)?_c5\"?>/,""){printf "USD: %s.%s\n",$1,substr($2,1,2)}' RS='<'