前段时间有这么个需求,两个文件,假设是tmp1和tmp2,tmp1里有服务器序列号和服务器主机名,如下:
a 1
b 2
c 3
d 4
e 5
f 6
g 7
tmp2里则是一些无序的序列号,如下:
d
c
e
f
a
g
b
现在需要做的是按tmp2里的顺序得到它们所对应的主机名。
对于这个需求,最开始想到的就是对tmp2里的每个序列号循环,每个循环里再遍历一次tmp1的内容,从而找到需要的主机名,不过这方法当文件很大时就很慢了。所以改进了一下,把tmp1存到一个hash里,然后遍历tmp2从hash里获得需要的东西。脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #!/usr/bin/perl
use warnings;
use strict;
open(TMP1,"<tmp1") or die("error1\n");
my %hash;
while(<TMP1>){
chomp(my $tmp = $_);
my($index,$value) = split(/\s+/,$tmp);
$hash{$index} = $value;
}
close(TMP1);
open(TMP2,"<tmp2") or die("error2\n");
while(<TMP2>){
chomp(my $tmp = $_);
print $hash{$tmp}."\n";
}
close(TMP2); |
当然,这样还是麻烦了点,简单一点可以直接在命令行下就搞定了
for i in `cat tmp2`
do grep $i tmp1 | awk '{print $2}'
done
问题描述:
在浏览器里打开feed地址,不能像正常的feed订阅那样出来订阅的页面,在firefox下是直接以纯文本形式显示,IE7下显示“已取消到该网页的导航”,而直接通过google reader等倒是能正常订阅。在Feed Validator上检查feed文件的正确性,问题如下:
This feed does not validate.
line 1, column 1: Blank line before XML declaration [help]
line 42, column 1: XML parsing error: :42:1: not well-formed (invalid token) [help]
虽然对于我这blog来说feed订阅这东西短期内基本上是拿来摆设的,不过有这问题心里总是不爽,于是乎网上搜寻解决办法,皇天不负有心人,最后顺利解决问题了,下面就介绍一下我的解决方法(方法非原创,参考了SAM LESHER)。
先说说引起这个问题的原因:godaddy的免费空间(CreatingDrew),因为godaddy会自动加上一段广告代码,所以在feed的XML文件输出时也在文件的最后两行给加上了广告代码,并在最前面加了一个空行,这就是上面检查出的问题,所以只要去了这个空行和广告代码就OK了,步骤大致如下:
1. 根据wordpress输出feed的默认地址下载feed文件到本地,这个文件是包含广告代码的
2. 写脚本,使用sed对文件进行过滤,把开头的空行和广告给删除掉
3. 通过修改后的feed文件输出feed订阅信息
4. 在godaddy管理页面上建一条cron任务,每隔一定时间执行一遍脚本,使更新后的feed地址也是正常的
可以把feed文件下载和过滤都写到一个脚本里,修改feed地址则可以使用插件来完成。
下面是实现脚本:
#!/bin/sh
BLOGADDRESS="http://blog.happysa.org" #blog地址,用于下载feed文件
FEEDPATH=/var/www/home/happysa/domains/happysa.org/public_html/feed #下载后的feed文件存放地址,路径根据具体情况修改
FEEDFILE=$FEEDPATH/feed.xml
RSSFILE=$FEEDPATH/rss.xml
RDFFILE=$FEEDPATH/rdf.xml
ATOMFILE=$FEEDPATH/atom.xml
COMMENTSFILE=$FEEDPATH/comments.xml
#GDSTRING1="</object></layer></span></div></table></body></html><!-- adsok -->"
#GDSTRING2="<script language='javascript' src='https://a12.alphagodaddy.com/hosting_ads/gd01.js'></script>"
if [ -f $FEEDFILE ]; #删除老的feed文件
then
rm -f $FEEDFILE
fi
wget -q $BLOGADDRESS/feed -O $FEEDFILE #下载feed文件
sed -i '/!-- adsok --/d;/alphagodaddy/d;1d' $FEEDFILE #过滤广告代码和最前面的空行,过滤条件可根据具体情况作改动
sed -i 's/blog.happysa.org\/feed\"\( rel=\"self\" type=\"application\/rss+xml\" \/>\)/feed.happysa.org\/\"\1/' $FEEDFILE #修改订阅地址
if [ -f $RSSFILE ];
then
rm -f $RSSFILE
fi
wget -q $BLOGADDRESS/feed/rss -O $RSSFILE
sed -i '/!-- adsok --/d;/alphagodaddy/d;1d' $RSSFILE
if [ -f $RDFFILE ];
then
rm -f $kRDFFILE
fi
wget -q $BLOGADDRESS/feed/rdf -O $RDFFILE
sed -i '/!-- adsok --/d;/alphagodaddy/d;1d' $RDFFILE
if [ -f $ATOMFILE ];
then
rm -f $ATOMFILE
fi
wget -q $BLOGADDRESS/feed/atom -O $ATOMFILE
sed -i '/!-- adsok --/d;/alphagodaddy/d;1d' $ATOMFILE
sed -i 's/blog.happysa.org\/feed\/atom\" \/>/feed.happysa.org\/atom.xml\" \/>/' $ATOMFILE
if [ -f $COMMENTSFILE ];
then
rm -f $COMMENTSFILE
fi
wget -q $BLOGADDRESS/comments/feed -O $COMMENTSFILE
sed -i '/!-- adsok --/d;/alphagodaddy/d;1d' $COMMENTSFILE
sed -i 's/blog.happysa.org\/feed\/comments\"\( rel=\"self\" type=\"application\/rss+xml\" \/>\)/feed.happysa.org\/comments.xml\"\1/' $COMMENTSFILE
以上代码新建一个脚本feed.sh,在空间下放哪都可以,之后在空间根目录下建立feed文件夹,用于存放feed文件。
好像免费空间没有ssh帐号的,有些东西设置就会麻烦一点,首先要打开ftp客户端登陆后在脚本文件上右击修改属性,使之有可执行权限。接着就是利用cron建立一个自动执行计划,让脚本每隔多少时间执行一次,在Hosting Control Center上Content下的Cron manager,如图:

Create Cron Job,主要是Command,时间勾上Run twice an hour,这样可以更新频繁一点,之后保存。

接下来就是设置feed地址了,只要feed正常了,怎么用就很简单了,网上的方法也很多,比如可以使用wp-feedlocations,安装后在里面设置feed地址

上面有个地方用到空间的绝对路径,查看绝对路径可以利用php的system函数,同时如果没到cron的时间而想手动执行脚本也可以利用这个,并且可以用这个来输出信息进行调试,我的方法是空间下新建一个php文件,如foo.php,写入如下代码:
<?php
system("pwd");
system("sh /var/www/home/happysa/domains/happysa.org/public_html/scripts/feed.sh >log 2>&1");
?>
然后在浏览器里访问http://happysa.org/foo.php,就可以看到绝对路径并手动执行脚本了。
最新评论