Shell脚本拉一个数字

时间:2011-11-22 23:37:14

标签: linux shell

我有一个shell脚本可以吸引在线玩家的数量,但我需要一些帮助。

剧本:

#!/usr/bin/bash
wget --output-document=- http://runescape.com/title.ws 2>/dev/null \
    | grep PlayerCount \
    | head -1l \
    | sed 's/^[^>]*>//' \
    | sed "s/currently.*$/$(date '+%r %b %d %Y')/"

输出以下内容:

<p class="top"><span>69,215</span> people 06:31:37 PM Nov 22 2011

我想说的是:

69,215 people 06:31:37 PM Nov 22 2011
你能帮助我吗? :)

3 个答案:

答案 0 :(得分:1)

这是执行此操作的众多不同方法之一。已使用cutsedcut -d">" -f 3,4 | sed 's/<\/span>//'):

[ 15:40 jon@hozbox.com ~ ]$ echo "<p class="top"><span>69,215</span> people 06:31:37 PM Nov 22 2011" | cut -d">" -f 3,4 | sed 's/<\/span>//'
69,215 people 06:31:37 PM Nov 22 2011



#!/usr/bin/bash
wget --output-document=- http://runescape.com/title.ws 2>/dev/null \
    | grep PlayerCount \
    | head -1l \
    | sed 's/^[^>]*>//' \
    | sed "s/currently.*$/$(date '+%r %b %d %Y')/" \
    | cut -d">" -f 3,4 \
    | sed 's/<\/span>//'

答案 1 :(得分:1)

将输出传输到:

sed 's%<p class="top"><span>\(.*\)</span>%\1%'

或者将您已有的两个sed脚本与此脚本合并,为您提供:

sed -e 's/^[^>]*>//' \
    -e "s/currently.*$/$(date '+%r %b %d %Y')/" \
    -e 's%<p class="top"><span>\(.*\)</span>%\1%'

事实上,grephead命令也是多余的;你可以用一个sed命令做很多事情。请注意,将|放在行的末尾意味着您不需要反斜杠。

#!/usr/bin/bash
wget --output-document=- http://runescape.com/title.ws 2>/dev/null |
    sed -e '/PlayerCount/!{d;n}' \
        -e 's/^[^>]*>//' \
        -e "s/currently.*$/$(date '+%r %b %d %Y')/" \
        -e 's%<p class="top"><span>\(.*\)</span>%\1%' \
        -e 'q'

/PlayerCount/!n表示跳到下一个输入行,除非输入与'PlayerCount'匹配。接下来的三行就是他们一直以来所做的。最后一行通过打印(隐式)和退出来实现head -1l

作为一个空闲的问题,如果wget命令运行完成,它会生成大约790行数据。如果我不重定向,我会收到“cannot write to "-" (Broken pipe)”错误标准错误为/dev/null(加上一些不需要的进度报告)。可能有一些选项可以处理;它似乎只有一行带有'PlayerCount',所以你可以省略'-e q '命令。

答案 2 :(得分:1)

我认为你所追求的是删除任何标签的代码。您的sed 's/^[^>]*>//'仅替换了第一个>

您可能需要考虑使用sed 's/<[^>]*>//g'