分页: 1 / 3

关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-27 17:18
我就是我2
脚本功能:以notify方式提醒shell区最新回复/主题 只显示五个主题
显示格式“标题前十字符...最后作者@时间”
我是新手,使用的方法可能比较笨,请赐教。 :em03
在合并数据时遇到麻烦

代码: 全选

cat foo1.dat
abc abcabc
dcd dcddcd

代码: 全选

cat foo2.dat
7890
jklm
合并foo1.dat foo2.dat得到
abc abcabc 7890
dcd dcddcd jklm
暂时只能想到一行一行的合并。
ver 1
[bash]
#!/bin/zsh
# 使用到的命令/语法
# 变量 条件测试 while循环 mkdir curl 输出重定向到文件和/dev/null 反单引号 cat 管道 echo grep 正则表达式 perl sed head awk for循环 tr if...;then fi notify-send sleep
old=''
[ -d /tmp/test ] || mkdir /tmp/test
cd /tmp/test
while :
do
curl -s "viewforum.php?f=21" 2>/dev/null >forum.dat
data=`cat forum.dat`
title=`echo "$data" | grep -oP '[^ ]*topictitle.*' | perl -pe 's|.*title"\>(.*?)\<\/a>.*|\1|' | sed -n '6,$p' | head -5 | sed -r 's/^(.{10}).*/\1\.../'`
name=`echo $data | grep 'class="topicdetails"><a'|perl -pe 's|.*\>(.*?)\<.*|\1|' | sed -n '6,$p' | head -5`
last=`echo $data | grep '"topicdetails" style'|perl -pe 's|.*\>(.*?)\<.*|\1|' | sed '1~2d' | sed -n '6,$p' | head -5 | awk '{print "@"$2}'`
for i in {1..5};do echo $title | sed -n "${i}p">line$i.dat;echo $name | sed -n "${i}p" | tr '\n' '\034' >>line$i.dat;done;
titlename=`cat line?.dat | tr -d '\n' | tr '\034' '\n'`
for i in {1..5};do echo ${titlename} | sed -n "${i}p">line$i.dat;echo $last | sed -n "${i}p" | tr '\n' '\034' >>line$i.dat;done;
new=`cat line?.dat | tr -d '\n'|tr '\034' '\n'`
[ "$new" = "$old" ] || notify-send "$new"
old=$new
sleep 300
done
[/bash]

谢谢fnan的代码.
修正版本 ver 2
[bash]
#!/bin/bash
# 主要命令/语法: curl sed*7 awk*2 管道*5
old=''
[ -d /tmp/forumshell ] || mkdir /tmp/forumshell
cd /tmp/forumshell
while : ; do
curl -s "viewforum.php?f=21" 2>/dev/null >forum.dat
sed -nr 's/.*"topictitle">(.*)<\/a.*/\1/p' forum.dat | sed -rn 's/^(.{1,10}).*$/\1.../;6,10p' >title.dat
sed -nr 's/.*class="topicdetails"><.*>(.*)<\/a>$/\1/p' forum.dat | sed -n '6,10p' >name.dat
sed -nr 's/.*"topicdetails" style.* (.*)<\/p>/@\1/p' forum.dat | sed '1~2d' | sed -n '6,10p' >last.dat
new=`awk '{printf $0 ;getline <"name.dat";print}' title.dat | awk '{printf $0 ;getline <"last.dat";print}'`
[ "$new" = "$old" ] || notify-send "$new"
old="$new"
sleep 300
done[/bash]

sed -nr 's/.*"topictitle">(.*)<\/a.*/\1/p' forum.dat | sed -rn 's/^(.{1,10}).*$/\1.../;6,10p' >title.dat
修正为:
sed -rn '/>公告<\/b>/,/>主题<\/b>/d;/<b>置顶.<\/b>/d;/<b>投票.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | head -5 >title.dat

不显示三种主题: 公告/置顶/投票
文档结构:
公告 粗体
n条公告
主题 粗体
置顶/投票 粗体
一般主题
有新发现,算法改进. 也许修改一下url就可以应用到别的版.小区, 谁知道. 还没测试
ver 3 通过图标识别主题类型
[bash]
#!/bin/bash
[ -f ~/.forumstatus.dat ] || touch ~/.forumstatus.dat
old=`cat ~/.forumstatus.dat`
[ -d /tmp/forumshell ] || mkdir /tmp/forumshell
cd /tmp/forumshell
while : ; do
curl -s "viewforum.php?f=21" 2>/dev/null >forum.dat
delnum=$(expr $(grep -c announce_read.gif forum.dat ) + $(grep -c sticky_read.gif forum.dat ) - 2)
shownum=5
begin=`expr $delnum + 1`
end=`expr $delnum + $shownum`
sed -rn 's/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | sed -n "$begin,$end"p > title.dat
sed -nr 's/.*class="topicdetails"><.*>(.*)<\/a>$/\1/p' forum.dat | sed -n "$begin,$end"p >name.dat
sed -nr 's/.*"topicdetails" style.* (.*)<\/p>/@\1/p' forum.dat | sed '1~2d' | sed -n "$begin,$end"p >last.dat
new=`awk '{printf $0 ;getline <"name.dat";print}' title.dat | awk '{printf $0 ;getline <"last.dat";print}'`
[ "$new" = "$old" ] || notify-send "$new"
old="$new"
echo "$old" >~/.forumstatus.dat
sleep 300
done
[/bash]
ver 4
修正两个变量: delnum 和 new
后者使用paste
sunfish 写了:用命令可以实现的,
join 命令可以将两个文件有相同资料的行拼接在一起
paste命令直接按行拼接文件
[bash]#!/bin/bash
[ -f ~/.forumstatus.dat ] || touch ~/.forumstatus.dat
old=`cat ~/.forumstatus.dat`
[ -d /tmp/forumshell ] || mkdir /tmp/forumshell
cd /tmp/forumshell
while : ; do
curl -s "viewforum.php?f=21" 2>/dev/null >forum.dat
delnum=$(expr $(grep -cP 'styles\/.*\/imageset\/announce_.*' forum.dat ) + $(grep -cP 'styles\/.*\/imageset\/sticky_.*' forum.dat ) - 2)
shownum=5
begin=`expr $delnum + 1`
end=`expr $delnum + $shownum`
sed -rn 's/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | sed -n "$begin,$end"p > title.dat
sed -nr 's/.*class="topicdetails"><.*>(.*)<\/a>$/\1/p' forum.dat | sed -n "$begin,$end"p >name.dat
sed -nr 's/.*"topicdetails" style.* (.*)<\/p>/@\1/p' forum.dat | sed '1~2d' | sed -n "$begin,$end"p >last.dat
new=`paste title.dat name.dat last.dat |tr -d '\t'`
[ "$new" = "$old" ] || notify-send "$new"
old="$new"
echo "$old" >~/.forumstatus.dat
sleep 300
done
[/bash]
forumdata title name 和 last 若不想使用文件,可以考虑变量,<<< here来完成读取。

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-27 17:23
ChenFengyuan
你不能perl搞定么?

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-27 17:27
我就是我2
ChenFengyuan 写了:你不能perl搞定么?
我搞不定。我不会perl :em20

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-27 21:50
fnan
kose5@kose5-Aspire-4552:~$ cat 1.dat
abc abcabc
dcd dcddcd
kose5@kose5-Aspire-4552:~$ cat 2.dat
7890
jklm
kose5@kose5-Aspire-4552:~$ awk '{printf $0 " ";getline <"2.dat";print}' 1.dat
abc abcabc 7890
dcd dcddcd jklm
**************************************************************
title=`echo "$data" | grep -oP '[^ ]*topictitle.*' | perl -pe 's|.*title"\>(.*?)\<\/a>.*|\1|' | sed -n '6,$p' | head -5 | sed -r 's/^(.{10}).*/\1\.../'`
#title=`sed -nr '/<b>置顶.<\/b>/d;s/.*"topictitle">(.{10}).*/\1\.../p' forum.dat |head -5`
(还有什么麻烦?)

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-27 23:35
我就是我2
前面那个合并不错.
后面那个有点瑕疵若标题不够十个,它就会取够十个字符.导致出现html的标记 </a> 什么的

修正后如下. 先用着这个版本了.
[bash]#!/bin/bash
# 主要命令/语法: curl sed*6 awk*2 管道*4
old=''
[ -d /tmp/forumshell ] || mkdir /tmp/forumshell
cd /tmp/forumshell
while : ; do
curl -s "viewforum.php?f=21" 2>/dev/null >forum.dat
sed -nr 's/.*"topictitle">(.*)<\/a.*/\1/p' forum.dat | sed -rn 's/^(.{1,10}).*$/\1.../;6,10p' >title.dat
sed -nr 's/.*class="topicdetails"><.*>(.*)<\/a>$/\1/p' forum.dat | sed -n '6,10p' >name.dat
sed -nr 's/.*"topicdetails" style.* (.*)<\/p>/@\1/p;1~2d' forum.dat | sed -n '6,10p' >last.dat
new=`awk '{printf $0 ;getline <"name.dat";print}' title.dat | awk '{printf $0 ;getline <"last.dat";print}'`
[ "$new" = "$old" ] || notify-send "$new"
old="$new"
sleep 300
done[/bash]

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 11:48
tusooa
feed.php?f=21
加到rr-RSS.perl的配置里,多好

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 15:53
我就是我2
tusooa 写了:feed.php?f=21
加到rr-RSS.perl的配置里,多好
:em20
先标记一下,有空看看。我实在不懂perl. :em06
这个也是作为shell脚本来练习的。

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 18:43
fnan
不用老想着shell,要练的是算法,适用于任何语言。
kose5@kose5-Aspire-4552:~$ sed -nr '/<b>置顶.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat |head -5
Ub培训...
请问这样的Shell...
如何传递参数给sed...
怎么样才能定时自动下...
关注shell区最新...
#而且最好是加强变通算法。

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 18:57
我就是我2
不用老想着shell,要练的是算法,适用于任何语言。
多谢.
原来的那个更差. 我居然这样来搞sed -n '6,$p' | head -5 其实就是 sed -n '6,10p'
sed -nr '/<b>置顶.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat |head -5
Ub培训...
请问这样的Shell...
如何传递参数给sed...
怎么样才能定时自动下...
关注shell区最新...

sed -nr '/<b>置顶.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | sed -n '2,6p'
:em06

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 19:06
fnan
不用多久我就要一边凉快了 :em04

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 20:27
我就是我2
fnan 写了:不用多久我就要一边凉快了 :em04
:em20 看不懂.

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 21:41
fnan
我就是我2 写了:
fnan 写了:不用多久我就要一边凉快了 :em04
:em20 看不懂.
#不用多久你的技术就可以很好了。

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 21:58
我就是我2
fnan 写了:
我就是我2 写了:
fnan 写了:不用多久我就要一边凉快了 :em04
:em20 看不懂.
#不用多久你的技术就可以很好了。
:em20 不敢当. 还要向你们这些高手学习, 指点迷津.

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-28 23:58
fnan
那就进一步练习吧。
sed -nr '/<b>置顶.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | sed -n '2,6p'
不管你用什么语言,这种算法都是失败的,你能保证公告贴永远只有一个吗?

Re: 关注shell区最新回复/主题·脚本练习

发表于 : 2011-08-29 0:46
我就是我2
:em06 接受批评. 当时确实没有想到这个问题.页面分析真是失败.哎

代码: 全选

sed -rn '/>公告<\/b>/,/>主题<\/b>/d;/<b>置顶.<\/b>/d;/<b>投票.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | head -5 >title.dat