我有一个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
你能帮助我吗? :)
答案 0 :(得分:1)
这是执行此操作的众多不同方法之一。已使用cut
和sed
(cut -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%'
事实上,grep
和head
命令也是多余的;你可以用一个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'
。