关注shell区最新回复/主题·脚本练习
发表于 : 2011-08-27 17:18
脚本功能:以notify方式提醒shell区最新回复/主题 只显示五个主题
显示格式“标题前十字符...最后作者@时间”
我是新手,使用的方法可能比较笨,请赐教。
合并foo1.dat foo2.dat得到
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
不显示三种主题: 公告/置顶/投票
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
[ -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来完成读取。
显示格式“标题前十字符...最后作者@时间”
我是新手,使用的方法可能比较笨,请赐教。

在合并数据时遇到麻烦
代码: 全选
cat foo1.dat
abc abcabc
dcd dcddcd
代码: 全选
cat foo2.dat
7890
jklm
暂时只能想到一行一行的合并。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
不显示三种主题: 公告/置顶/投票
有新发现,算法改进. 也许修改一下url就可以应用到别的版.小区, 谁知道. 还没测试文档结构:
公告 粗体
n条公告
主题 粗体
置顶/投票 粗体
一般主题
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
[bash]#!/bin/bashsunfish 写了:用命令可以实现的,
join 命令可以将两个文件有相同资料的行拼接在一起
paste命令直接按行拼接文件
[ -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来完成读取。