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

sh/bash/dash/ksh/zsh等Shell脚本
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#1

帖子 我就是我2 » 2011-08-27 17:18

脚本功能:以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来完成读取。
上次由 我就是我2 在 2011-08-30 15:40,总共编辑 9 次。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

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

#2

帖子 ChenFengyuan » 2011-08-27 17:23

你不能perl搞定么?
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#3

帖子 我就是我2 » 2011-08-27 17:27

ChenFengyuan 写了:你不能perl搞定么?
我搞不定。我不会perl :em20
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#4

帖子 fnan » 2011-08-27 21:50

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`
(还有什么麻烦?)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#5

帖子 我就是我2 » 2011-08-27 23:35

前面那个合并不错.
后面那个有点瑕疵若标题不够十个,它就会取够十个字符.导致出现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]
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

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

#6

帖子 tusooa » 2011-08-28 11:48

feed.php?f=21
加到rr-RSS.perl的配置里,多好

代码: 全选

] ls -ld //
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#7

帖子 我就是我2 » 2011-08-28 15:53

tusooa 写了:feed.php?f=21
加到rr-RSS.perl的配置里,多好
:em20
先标记一下,有空看看。我实在不懂perl. :em06
这个也是作为shell脚本来练习的。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#8

帖子 fnan » 2011-08-28 18:43

不用老想着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区最新...
#而且最好是加强变通算法。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#9

帖子 我就是我2 » 2011-08-28 18:57

不用老想着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
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#10

帖子 fnan » 2011-08-28 19:06

不用多久我就要一边凉快了 :em04
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#11

帖子 我就是我2 » 2011-08-28 20:27

fnan 写了:不用多久我就要一边凉快了 :em04
:em20 看不懂.
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#12

帖子 fnan » 2011-08-28 21:41

我就是我2 写了:
fnan 写了:不用多久我就要一边凉快了 :em04
:em20 看不懂.
#不用多久你的技术就可以很好了。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#13

帖子 我就是我2 » 2011-08-28 21:58

fnan 写了:
我就是我2 写了:
fnan 写了:不用多久我就要一边凉快了 :em04
:em20 看不懂.
#不用多久你的技术就可以很好了。
:em20 不敢当. 还要向你们这些高手学习, 指点迷津.
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#14

帖子 fnan » 2011-08-28 23:58

那就进一步练习吧。
sed -nr '/<b>置顶.<\/b>/d;s/.*"topictitle">(.{1,10}).*<\/a>.*/\1\.../p' forum.dat | sed -n '2,6p'
不管你用什么语言,这种算法都是失败的,你能保证公告贴永远只有一个吗?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#15

帖子 我就是我2 » 2011-08-29 0:46

: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
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
回复