庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>编程开发>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

Linux下文件操作编程和GAWK的介绍和应用

 作者:本站收集   日期:2005-4-13
字号选择〖 〗/ 双击滚屏 单击停止   
最近学着用Linux上网,结果经常忘了网址,就mount上c盘,打开windows/favorites/用notepad打开???.url,再Ctrl+c和Ctrl+v,才浏览上该网址,但很不方便。于是就想把书签都从*.url中提取出来,可是用”Ctrl cv”大法不是办法,太麻烦了,现在什么事情都要“自动化”,因此就着手编个程序来实现。

   大概原理:

   从起始目录搜索各个子目录,用GAWK从各个url文件中把网址提取出来,用重定向符“>”存成文件。

   首先,来介绍一下GAWK。GAWK是一个资料处理的程序,能用相当简短的语句来完成字符串处理功能。现在以”CPCW网站.url”文件为例,介绍一下。

   CPCW网站.url有以下内容

   [DEFAULT]

   BASEURL=http://www.cpcw.com/

   [InternetShortcut]

   URL=http://www.cpcw.com/

   Modified=2098A2DAC868BF0124

   在shell中输入gawk /url/ {print $0} CPCW网站.url

   输出如下:

   BASEURL=http://www.cpcw.com/

   URL=http://www.cpcw.com/

   Gawk格式为: gawk ‘表达式 {动作} 表达式 {动作}…..' 要处理的文件1 文件2…..

   Gawk 读入文件首先以内部变量RS为分界符,把文件内容分成一个一个记录,再以FS把记录分解成栏位。一个记录的第一个栏位为$1,第二个为$2…..$0为该记录。Gawk一个一个记录地处理,如果符合任意一个表达式,就会执行该表达式后面的动作。

   常见表达式有以下几个:

   xxxxx/ {print $0} 只要记录有字符串xxxxx,就输出该记录。

   $1= =match {print $2} 如果记录的第一个栏位是match,就输出第二个栏位。除了==,还有&&,||,!学过C的一定不会陌生!

   回到正题,怎样提取http://www.cpcw.com/ 呢?只要把栏位分界符FS设为”=”,如果$1==”URL”,那$2就是网址了。整条命令为:

   gawk 'BEGIN {FS="="} $1=="URL" {print $2}'

   BEGIN 后面的动作唯一开始就强行执行的,类似的还有END

   接着就是文件操作,这里主要是打开目录,获得目录中的文件名,用到函数有:

   #include

   DIR *opendir(char *pathname); //打开成功返回一目录指针

   struct dirent *readdir(DIR *dirptr); //返回指向结构dirent的指针dirent->d_name为一字符

     //数组,存放着该目录中的文件名,调用一次readdir(),

     //d_name就存放下一个文件名,当返回0时,表明已经读完了。

   int closedir(DIR *dirptr); //工作完成后,别忘了关闭连接

   其次,就要判断一个文件名是文件还是目录:

   #include

   int stat(char *pathname,struct stat *sbuf); //调用之后,sbuf.st_mode存放文件类型值

     // if (sbuf.st_mode&S_IFMT==S_IFDIR) 是目录

     // else 不是目录

   本程序采用递归的方式,找到一个目录,就进入搜索,否则就调用system()执行shell命令

   使用方法:

   比如,书签放在/c/windows/Favorites/下,输出文件为/home/url

   就执行 程序名 /c/windows/Favorites/ /home/url

   使用的时候才发现,由于gawk的限制,文件名中不能有空格,+,&等符号,也是要我修改,不过收获也挺多!如果有疑问,就email给我一起交流  (penly@21cn.com)

   附:源程序

   #include

   #include

   #include

   #include

   #include

   char command[60];

   char rootdir[50]; //起始目录

   char pwd[500]; //pwd为当前目录

   char output[20];

   main(int argc,char *arg[])

   {

     DIR *d;

     strcpy(rootdir,arg[1]);

     strcpy(pwd,rootdir);

     strcpy(command,"gawk 'BEGIN {FS=\"=\"} $1==\"URL\" {print $2}'");

     strcpy(output,arg[2]);

     if (d=opendir(rootdir))

       chuli(d);

   }

   chuli(DIR *d)

   {

     struct dirent *link;

     char temp[300];

     char bakpwd[300];

     strcpy(bakpwd,pwd); //保存当前目录,供递归后恢复pwd

     link=readdir(d); /*skip . */

     link=readdir(d); /*skip .. */

     while((link=readdir(d))!=0)

     {

     if (isdir(link->d_name)==S_IFDIR)

     { //是目录,改变当前目录,进入该目录,递归

     sprintf(pwd,"%s%s/",bakpwd,link->d_name);

     chuli(opendir(pwd));

     }

     else

     { // “>>”为重定向符,向指定文件追加内容

     sprintf(temp,"%s %s%s>>%s",command,pwd,link->d_name,output);

     system(temp);

     }

     strcpy(pwd,bakpwd); //恢复pwd

     }

     closedir(d);

     return;

   }

   isdir(char *name)

   {

     struct stat sbuf;

     char temp[200];

     sprintf(temp,"%s%s",pwd,name);

     stat(temp,&sbuf);

     return (sbuf.st_mode)&S_IFMT;

   }
上一篇:gtk编程经验两点    下一篇:PHP中的常量和变量  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-4-13
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿