bash脚本学习(一)

[2014年6月3日更新]

这两天突然对bash感兴趣了,写了个抓取学校内网通知的小脚本,就当学习吧。两个脚本,一个是内网抓取网页,另外一个是服务器上更新的。

脚本一,本地内网执行:get.sh

#!/bin/bash
#定义抓取链接及目录
dir="news/"
url="http://192.168.1.102/news/liulan2.aspx"
#创建文件夹
if [ ! -d $dir ];then
	mkdir $dir
	lastid='1'
fi
#获取上次更新id
len=`echo ${#dir}`
lastid=`find $dir | sort | tail -1 | sed 's/.txt//g'`
lastid=`echo ${lastid:$len}`
#抓取新闻列表,获取最后更新的id
id=`curl $url | grep liulan1.aspx?newsid= | head -n 1 | sed 's/<a href=liulan1.aspx?newsid=//g' | sed 's/ target=_blank>//g' | sed 's/t//g' | sed 's/r//g'`
#抓取页面
for (( i = $id ; i > $lastid ; i --))
do
	filename=$dir$i".htm"
#如果文件不存在,则抓取为文件,将文件转码,方便linux下处理
	if [ ! -f $filename ];then
		curl "http://192.168.1.102/news/liulan1.aspx?newsid="$i | iconv -c -f gbk -t utf8 | sed "s/charset=gb2312/charset=UTF-8/g" > $filename
	else
		echo $filename" exist,skip!"
	fi
#删除不存在的新闻	
	error=`cat $filename | grep 'web.config'`
	if [ !$error ];then
#如果新闻存在,则上传至服务器
		scp $filename root@***.***.***:/xxnw/news/
	else
		rm $filename
		echo "del unexisted file!"
	fi
done
#远程执行更新
ssh root@***.***.*** "/xxnw/addnews.sh"

脚本二,服务器上运行:addnews.sh

#/bin/bash
dir="/xxnw/news/"
if [ ! -d $dir ];then
	echo '没有那个文件夹!'
	exit
fi
for file in `ls $dir | grep 'htm'`
do
	filenum=${file%.*}
	newfile1=$dir$filenum".sql"
	newfile2=$dir$filenum".txt"
	if [ ! -f $newfile2 ];then
		url="http://192.168.1.102/news/liulan1.aspx?newsid="$filenum
		echo "INSERT INTO `news_article` (`news_id`,`news_web`,`news_type`,`news_url`,`news_title`,`news_post`,`news_posttime`,`news_content`) VALUES("","学校内网","校园新闻","$url","" | iconv -f gbk -t utf8 > $newfile2
		cat $dir$file | head -35 |  sed "s/<[^>]+>//g;s/
$//g;s/ //g;s/^[ t]*//g;s/[ t]*$//g;" | sed '2,30d' | sed '3,5d' | sed '4,6d' | sed -e '/^$/d' | sed -e '1a","' | sed '3a","' | sed '5a","' >> $newfile2 
		tail -n +39 $dir$file | sed "s/<[^>]+>//g;s/
$//g;s/ //g" | tr 'n' ' ' | sed 's/^[ t]*//g;s/[ t]*$//g' | sed 's/"/\"/g' >> $newfile2
		echo "");" >> $newfile2
		cat $newfile2 | tr -d 'n' > $newfile1
		tail -n +39 $dir$file | sed -e '$d' | sed -e '$d' | sed -e '$d' | sed -e '$d' > $newfile2
		echo $file
		mysql -uroot -ppassword dbname < $newfile1
		rm $newfile1
	fi
done

一下子就把从2008年以来的800多条通知全部抓下来了,呵呵!没网络权限,不然直接拖库了。

脚本还有些小问题,回头再研究。

续:现在基本上完善了,我只需在局域网的linux笔记本上运行一下:./get.sh,服务器上的数据就更新了,太方便了^-^

bash脚本学习(一)》有2个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据