wangchao.org
发布产品 | 发表软文 | 添加收藏 | 博客
 
购物汽车家饰IT业界自然风光女性王朝网络攻略首饰商城编程空间科普
 
互联网 | 美容 | 母婴 | 健康 | 旅游 | 娱乐 | 下载 | 美食 | 旅游 | 养生 | 手机 | 数码 | 汽车 | 珠宝 | 美容 | 装修 | 厨房 | 科普 | 动物 | 植物 | 百科 | 知道 | 词典
  
 您好! 您现在位于: 王朝网络 → 编程设计 → 《用spool+unix shell生成文本文件返回上一页 
 
1楼 

用spool+unix shell生成文本文件

  比较熟悉使用ORACLE的人一般都会用spool命令来生成OS下的文本文件.
  例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:
  set pages 50000;
  set lines 200;
  set trims on;
  set heading off;
  spool /oracle_backup/log/test/dept.lst;
  select deptno||','||dname||','||loc from scott.dept;
  spool off;
  但是生成的文本文件头和尾里含有不需要的空行和提示信息(虚线里面是生成文本文件的详细内容):
  ----------------------------------------
  10,ACCOUNTING,NEW YORK
  20,RESEARCH,DALLAS
  30,SALES,CHICAGO
  40,OPERATIONS,BOSTON
  50,MARKETING,FOTTH WORTH
  60,HEAD,Amercia
  6 rows selected.
  -----------------------------------------
  我请教了kane,他写出来的del_head_tail_line.sh可以把文件头尾的行去掉,并生成新文件:
  #!/bin/sh
  #第一个参数是要处理的文件名
  #第二个参数是文件头要去掉的行数
  #第三个参数是文件尾要去掉的行数
  #第四个参数是要输出的文件名
  #created by kane@geeyo.com
  lines=`wc -l $1 | awk '{print $1}'`
  taillines=`expr $lines - $2`
  tail -$taillines $1 > $1.tmp
  headlines=`expr $taillines - $3`
  head -$headlines $1.tmp > $4
  rm $1.tmp
  我们执行下面命令,就可以把不符合要求的行去掉,生成新文件1.txt
  $./del_head_tail_line.sh dept.lst 1 3 1.txt
  这样就解决了文本文件格式的问题.
  具体应用举例:
  因为工作需要,我经常要把一个小时或者一个星期变动过的数据生成文本文件上传到各个地区.
  借用上面的方法, 我只需要写几个sql语句+ unix shell程序,配合OS定时就可以自动来完成这些工作:
  第一步: 写好用来生成文本文件的SQL语句(假设是/oracle_backup/bin/test.sql)
   提示1: 如果有几个不同的查询条件,可以把两个查询结果用union all合并起来生成一个结果集
   提示2: Tab键的ascii码是char(9)
  
  第二步: 写好UNIX OS调用test.sql的脚本gen_test.sh
  su - oracle -c "sqlplus username/password"<<EOF
  @/oracle_backup/bin/test.sql;
  exit
  第三步: 删除文本文件头和尾的空行, 生成符合要求的文本文件gen_test_file.sh
   提示1: 我生成的结果文本文件的头和尾增加了有效记录的行数
  
   提示2: 生成的文本文件名含有年月日小时的信息
  
  cd /oracle_backup/log/test
  rm 1.txt 2.txt
  /oracle_backup/bin/del_head_tail_line.sh dept.lst 1 3 1.txt
  CDAY=`date +%Y%m%d%H`;export CDAY
  cat 1.txt|wc|awk '{print $1}'>2.txt
  cat 2.txt>english_companyname_$CDAY.txt
  cat 1.txt>>english_companyname_$CDAY.txt
  cat 2.txt>>english_companyname_$CDAY.txt
  第四步: 生成FTP传文件的脚本ftp_test.sh
   提示1: /oracle_backup/log/test/log/目录下记录了上传文件前后的时间差,是上传日志
  
   提示2: 下面例子里FTP服务器目的地址为默认的/目录,如果要传到子目录,可以在/后添加子目录名
  
  CDAY=`date +%Y%m%d%H`;export CDAY
  cd /oracle_backup/log/test/
  chmod 777 *.txt
  date>/oracle_backup/log/test/log/ftp_test_$CDAY.log
  ftp -i -n 192.168.0.253 <<FTPIT
  user username password
  bin
  put /oracle_backup/log/test/english_companyname_$CDAY.txt /english_companyname_$CDAY.txt
  quit
  FTPIT
  date>>/oracle_backup/log/test/log/ftp_test_$CDAY.log
  第五步: 设定unix root用户的定时操作
  Sun Solaris文件/var/spool/cron/crontabs/root
  Linux文件/var/spool/cron/root
  例如每小时执行一次:
  3 0-23 * * * /oracle_backup/bin/gen_test.sh
  5 0-23 * * * /oracle_backup/bin/gen_test_file.sh
  8 0-23 * * * /oracle_backup/bin/ftp_test.sh
  重新启动unix OS的定时服务,使新添加的任务生效
  Sun Solaris
  #/etc/rc2.d/S75cron stop
  #/etc/rc2.d/S75cron start
  Linux
  #/etc/rc.d/init.d/crond restart
  注意事项:
   unix shell脚本都应该有755的可执行权限.
  
   超过50000行的文件,会在每50000行的分隔处多出一个空行;
   如果这样的格式不合要求,可以再写一个unix shell重写文件,遇到空行时去掉空行.
  结束语:
   这里看似简单的方法却能实现很多复杂的功能, 希望对大家有所启发.

比较熟悉使用ORACLE的人一般都会用spool命令来生成OS下的文本文件. 例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下: set pages 50000; set lines 200; set trims on; set heading off; spool /oracle_backup/log/test/dept.lst; select deptno||','||dname||','||loc from scott.dept; spool off; 但是生成的文本文件头和尾里含有不需要的空行和提示信息(虚线里面是生成文本文件的详细内容): ---------------------------------------- 10,ACCOUNTING,NEW YORK 20,RESEARCH,DALLAS 30,SALES,CHICAGO 40,OPERATIONS,BOSTON 50,MARKETING,FOTTH WORTH 60,HEAD,Amercia 6 rows selected. ----------------------------------------- 我请教了kane,他写出来的del_head_tail_line.sh可以把文件头尾的行去掉,并生成新文件: #!/bin/sh #第一个参数是要处理的文件名 #第二个参数是文件头要去掉的行数 #第三个参数是文件尾要去掉的行数 #第四个参数是要输出的文件名 #created by kane@geeyo.com lines=`wc -l $1 | awk '{print $1}'` taillines=`expr $lines - $2` tail -$taillines $1 > $1.tmp headlines=`expr $taillines - $3` head -$headlines $1.tmp > $4 rm $1.tmp 我们执行下面命令,就可以把不符合要求的行去掉,生成新文件1.txt $./del_head_tail_line.sh dept.lst 1 3 1.txt 这样就解决了文本文件格式的问题. 具体应用举例: 因为工作需要,我经常要把一个小时或者一个星期变动过的数据生成文本文件上传到各个地区. 借用上面的方法, 我只需要写几个sql语句+ unix shell程序,配合OS定时就可以自动来完成这些工作: 第一步: 写好用来生成文本文件的SQL语句(假设是/oracle_backup/bin/test.sql) 提示1: 如果有几个不同的查询条件,可以把两个查询结果用union all合并起来生成一个结果集 提示2: Tab键的ascii码是char(9) 第二步: 写好UNIX OS调用test.sql的脚本gen_test.sh su - oracle -c "sqlplus username/password"<<EOF @/oracle_backup/bin/test.sql; exit 第三步: 删除文本文件头和尾的空行, 生成符合要求的文本文件gen_test_file.sh 提示1: 我生成的结果文本文件的头和尾增加了有效记录的行数 提示2: 生成的文本文件名含有年月日小时的信息 cd /oracle_backup/log/test rm 1.txt 2.txt /oracle_backup/bin/del_head_tail_line.sh dept.lst 1 3 1.txt CDAY=`date +%Y%m%d%H`;export CDAY cat 1.txt|wc|awk '{print $1}'>2.txt cat 2.txt>english_companyname_$CDAY.txt cat 1.txt>>english_companyname_$CDAY.txt cat 2.txt>>english_companyname_$CDAY.txt 第四步: 生成FTP传文件的脚本ftp_test.sh 提示1: /oracle_backup/log/test/log/目录下记录了上传文件前后的时间差,是上传日志 提示2: 下面例子里FTP服务器目的地址为默认的/目录,如果要传到子目录,可以在/后添加子目录名 CDAY=`date +%Y%m%d%H`;export CDAY cd /oracle_backup/log/test/ chmod 777 *.txt date>/oracle_backup/log/test/log/ftp_test_$CDAY.log ftp -i -n 192.168.0.253 <<FTPIT user username password bin put /oracle_backup/log/test/english_companyname_$CDAY.txt /english_companyname_$CDAY.txt quit FTPIT date>>/oracle_backup/log/test/log/ftp_test_$CDAY.log 第五步: 设定unix root用户的定时操作 Sun Solaris 文件 /var/spool/cron/crontabs/root Linux 文件 /var/spool/cron/root 例如每小时执行一次: 3 0-23 * * * /oracle_backup/bin/gen_test.sh 5 0-23 * * * /oracle_backup/bin/gen_test_file.sh 8 0-23 * * * /oracle_backup/bin/ftp_test.sh 重新启动unix OS的定时服务,使新添加的任务生效 Sun Solaris #/etc/rc2.d/S75cron stop #/etc/rc2.d/S75cron start Linux #/etc/rc.d/init.d/crond restart 注意事项: unix shell脚本都应该有755的可执行权限. 超过50000行的文件,会在每50000行的分隔处多出一个空行; 如果这样的格式不合要求,可以再写一个unix shell重写文件,遇到空行时去掉空行. 结束语: 这里看似简单的方法却能实现很多复杂的功能, 希望对大家有所启发.

 
标签: shell  spool+unix  文本文件  生成  
 
您可以将本页贴到其他网站
UBB代码HTML代码
 
 
 
 
 
 更多内容
 ·APACHE WEB SERVER管理 ·UNIX机器设置自动开关数据库的方 ·[AD_LAB-04003] Linux 2.6.* 内核 ·MDAC 2.5 堆栈和 Windows 文件保
 ·给FreeBSD新手的一些建议 ·How to simulate a Form POST re ·第五章Windows Message Mapping  ·Acer S10 Palm和Linux同步的办法
 ·Windows XP网络修复的步骤 ·Windows服务初探 ·Windows自启动程序十大藏身之所 ·Windows XP风格的鼠标右键菜单
 ·Linux学习随手记(2) 用户管理 ·Linux下通用线程池的构建 ·配置Symbian WINS Emulator ·Windows 95 System Programming
 ·Windows 95 System Programming  ·Windows服务的一些解释 ·WindowsXP操作系统登录账户10大问 ·换主板一定要重装Windows操作系统
 ·详解Windows XP操作系统登录原理 ·最新让linux访问ntfs分区方法 ·Linux下Windows磁盘分区(NTFS,FA ·Linux与Windows资源共享
 
最新评论  点此查看所有评论
 
 
 
 
发表评论(支持UBB码)


验证码:  
 
 
© 2005- 王朝网络 版权所有