列出size大于某特定值的所有子目录
下面的脚本根据你给定的目录和阈值,会遍历所有子目录,并列出大于阈值的所有子目录名称和大小。注意如何在awk中引用shell变量。[@more@]dasomg01(215)% cat big_dir.sh#!/bin/shif [ $# -ne "2" ]then pgm=`basename $0` echo "Usage: $pgm <target_dir> <bytes> " echo " target_dir => the directory to be checked" echo " bytes => the threshold" exit 1ficd $1threshold=$2for i in `ls -l|grep '^d'|awk '{print $9}'`do du $i | awk '{if ($1>'&
用shell脚本发送带附件的email
下面的脚步,可以发送带附件的email。其中附件名称为attachment.tar,邮件正文内容包含在letter.txt文件中。此二文件要求在当前目录下(不在当前目录下稍微改点脚本当然也很容易)。$ ls -l-rw-r--r-- 1 oracle dba 34816 Aug 27 13:22 attachment.tar-rw-r--r-- 1 oraapdev1 dba 197 Aug 27 13:45 letter.txt-rwxr-xr-x 1 oraapdev1 dba 156 Aug 27 13:46 mail_att.sh[@more@]$ cat mail_att.sh#!/bin/shmaillist=zhyuh@itpub.netattachment=attachment.tar(uuencode $attachment $attachment && cat letter.txt)|mailx -s 'Hell
要找出某个文件中所有包含数字,且数字大于1000的行
要找出某个文件中所有包含数字,且数字大于1000的行[@more@]$grep -E "[1-9][0-9]{3}" file_name$/usr/xpg4/bin/grep -E '[1-9][0-9]{3}' file_name (Solaris中){3}表示前面部分重复三次,[0-9]就是0-9十个数字种的任何一个,[1-9][0-9]{3}所以就是1000以上的数字。如果要小于1000的话可以用grep -wE "[1-9][0-9]{1,3}",{1,3}是重复1-3次,-w表示整个单词匹配。还有如果只显示匹配部分,不显示整行的话可以加上-o参数。
从屏幕上读入用户名和密码
很多shell脚本需要动态从终端读入用户名和密码。用户名可以在输入时显示在屏幕上,但是密码不可以。下面的脚本就是实现这个功能。[@more@]$ cat echo1#!/bin/sh echo "User:"read userstty -echo echo "Password:"read pswdstty echo echo "User is $user, Password is $pswd. Done!" 执行结果如下:$ ./echo1User:zhyuhPassword:User is zhyuh, Password is my_paswd. Done! 可以看到用户名zhyuh显示在屏幕上,而密码被盖掉了。最后一句echo命令用来显示输入的全部信息。
Shell 参数的读取和处理
Shell脚本经常需要传入一些参数。下面的脚本可以作为一个通用模块,在写shell时用来1. 指定参数的类型2. 允许用户灵活指定参数顺序,或者省掉某几个参数3. 通过shift命令,将参数传给指定的变量 注意1. getopt a:b:c $* $*和c之间有空格(必须)2. basename用处3. shift用法 [@more@]$ cat getopt1#!/bin/sh set -- `getopt a:b:c: $*` getopt_rc=$? if [ "$getopt_rc" -ne "0" ]; then pgm=`basename $0` echo "$pgm $getopt_rc Process failed during getopt attempt - illegal parame
逐行显示文件内容并允许修改的DCL脚本
功能: 从屏幕读取用户指定的文件,逐行显示文件内容,并允许用户修改。修改后的文件保存为同名文件的新版本要点: 1. 循环结构的实现2. IF ... THEN... ENDIF结构3. 用READ, WRITE实现对文件的操作4. READ/END_OF_FILE=END_LOOP INFILE RECORD当读到文件末尾时转到END_LOOP所标记的脚本块中5. $ WRITE SYS$OUTPUT "FILE ''FILENAME' DOES NOT EXIST!"在双引号里调用symbol时,注意symbol前面要有两个单引号 ''FILENAME' [@more@]$!提示用户输入文件名,并判断文件在当前目录下是否存在$ GET_NAME:$ INQUIRE FILENAME "FIL
VMS 常用命令小注(4)
61-end[@more@]$ SET SECURITY/PROTECTION=(W:RW) 95_FORECAST.TXT修改文件95_forecast.txt的权限属性$ DEFINE COMS DISK7:[WALSH.COMMAND_PROC]定义logical name COMS,代替目录DISK7:[WALSH.COMMAND_PROC]$ DEFINE/TABLE=LNM$SYSCLUSTER CUSTOMERS DISK1:[CUSTOMER_VISITS]CUSTOMERS.TXT创建logical name CUSTOMERS,并将其存入指定的表lnm$syscluster_table中$ SHOW LOGICAL/TABLE=*显示所有存储logical name的表的内容$ SHOW LOGICAL/STRUCTURE显示logical name directory tables和logical name tables之间的关系$DEASSIGN COMS删除lo
VMS 常用命令小注(3)
41-60[@more@]$ COPY FEES.DAT,FEES1.DAT FEES.DAT将fees1.dat文件加到fees.dat文件后面$ COPY CHAOS::DISK2:[PUBLIC]*.* *从主机CHAOS的disk2磁盘的public目录下拷贝所有最新版本文件到当前目录下(使用DECnet)$ COPY *.* CHAOS"SMITH SPG96PRT"::DISK2:[STAFF_BACKUP]将当前目录下所有最新版本的文件拷贝到CHAOS主机DISK2磁盘的STAFF_BACKUP目录下。SMITH à CHAOS主机的账户SPG96PRT à 该账户的密码$ RENAME FEES.DAT;4 [SAVETEXT]RECORDS.DAT将文件FEES.DAT从当前目录移到SAVETEXT目录下,并改名为RECORDS.DAT$ TYPE STAF
VMS 常用命令小注(2)
21-40 个命令[@more@]$ DIRECTORY/SIZE/DATE/VERSIONS=1/PROTECTION AVERAGE显示average所有类型的文件的,信息包括最新版本号,创建日期,文件大小(以block为单位)$ set password设置或修改密码$ ctl+TGREEN::MCCARTHY 13:45:02 EVE CPU=00:00:03.33 PF=778 IO=295 MEM=315显示当前进程的统计信息,包括GREEN -- 主机名MCCARTHY – 用户名13:45:02 – 当前时间EVE – 当前进程current process,CPU=00:00:03.33 – CPU使用率PF=778 -- number of page faultsIO=295 -- level of I/O activityMEM=315 -- memory usageCtl+T默认为disable状
VMS 常用命令小注
熟悉下面这几十个命令,至少可以应付VMS的一般操作了[@more@] $mcr authorize mod ORACLE/password=summer/nopwdexp/interactivemcr authorize修改用户设定的组合命令mod à modifypassword=summer à 将口令改为summernopwdexp à系统不提示修改命令 $mcr authorize show oracle显示oracle用户的环境设置 $dir ORA_DISK001:[000000]显示ora_disk001磁盘内容[000000]表示根目录 $set default ORA_DISK001:[000000]将ora_disk001的根目录设置成当前目录 $set def ora_root:[dbs] $ SET PROTECTION=(S:RWED, O:RWED, G:RE, W:RE)/DEFAULTS
用批处理文件执行备份
下面的批处理文件调用exp,生成文件名为stdtyyyy-mm-dd.dmp的备份文件。可以将此文件加入windows的计划任务中,实现定期自动备份。[@more@]F:student>type stdt_exp.bat@ECHO OFFSET TempDir=c:tempSET ArchiveDir=c:archiveCLSECHO.ECHO Extracting current date . . .ECHO.FOR /f "tokens=1 delims= " %%D in ('echo %DATE:/=%') do SET DATEN=%%DECHO Date Extracted (%DATEN%)ECHO.set FILE=stdt%DATEN%.dmpset USERID=stdt/stdtset LOGFILE=stdt%DATEN%.logexp %USERID% file=%FILE% log=%LOGFILE%怎么感觉写批处理文件
shell加到crontab里的问题(三)
shell脚本加入到crontab中还发现一个问题,相对路经不起作用。不知道真的是这样还是自己犯了什么错。如果真的这样的话对程序的可移植性影响太大了。[@more@]refresh_table中有脚本:FILE_NAME=../sql/$FILE_NAME手动执行时没问题,可以找到相应的文件。可是由cron调用时,就出错:File ../sql/eden_flat_ord_cmpt_fr.sql does NOT exist.Please specify an existed SQL file.将脚本改成 FILE_NAME=/erdb/sql/$FILE_NAME,即指定绝对路经才行。是不是由cron调用时,脚本的位置会被认为在根目录下,或者其他什么目录下,而不是脚本真正存在的
shell加到crontab里的问题(二)
这个问题有点特殊,花了我近一个礼拜的时间才解决。简言之,就是加入到crontab中的shell脚本,执行时前面会自动加上sh命令。这样对于用bash, csh等shell写的脚本,如果使用了默认的sh不支持的特殊功能,则将其加入crontab中时,调用的脚本前要强制加上/usr/bin/bash等指定所用shell的语句。[@more@]问题:有三个shell脚本,refresh_all, refresh_schema, refresh_table,其中refresh_all调用refresh_schema,refresh_schema调用refresh_table。手动执行$refresh_all时,程序能正常执行,且结果正确。将其加入crontab:33 06 * * 1,2,3,4,5
shell加到crontab里的问题(一)
shell脚本加到crontab里,总会碰到一点这样那样的问题。这次也一样。把经历的错误都记下来,免得下次再犯[@more@]手动运行正常的脚本,加到crontab里后发现过了指定时间,还象没运行过一样。后来想到是环境变量的原因。1。建议客户在root用户下增加一个小文件refresh,内容:su - opserdb -c "/erdb/bin/refresh_all"然后将refresh加入cron中。 客户不采纳2。那只好在refresh_all中加入环境变量ORACLE_SID=perdb &
一个有点深度的shell BUG调试
这个bug花了我一整天的功夫,最后还是在别人帮助下解决了。虽然费这么多时间和当初轻视它有关,这个错误本身也有点奇怪了。[@more@]为了说明问题,新写了一个测试程序数据库里有表aa, SQL> desc aa Name Type Nullable Default Comments ---- ------------ -------- ------- -------- COL1 VARCHAR2(10) Y SQL> select * from aa; COL1 ---------- b a shell脚本内容:/export/home/deverdb/p482/scripts>cat test1 #!/usr/bin/bash DB_CHAR=`sqlplus -s edentest/edentest@perdb<SET HEAD OFF SET TERM OFF SET FEED OFF SEL
从数据库返回多条纪录赋值给shell变量
这个shell比较有趣,虽然并没有什么新的技巧。它的意义在于让我认识到对于数据库里的多条纪录,可以将值分别付给shell变量,并且分别处理。[@more@]表中的数据:SQL> select * from aa; COL1---------- 1 2 3shell脚本:/export/home/deverdb/p482/scripts>cat test1#!/usr/bin/bashfor i in `sqlplus -s edentest/edentest@perdb< &nbs
自动更新数据库数据的shell
和以前自动ftp,load data的那个shell相比,没有多大长进。只有两点新东西[@more@]1)从数据库检索数据,赋值给shell变量(注意 -s 参数)LOG_ROWS=`sqlplus -s $USERNAME/$PASSWORD@$DATABASE< SET FEED OFF SET TERM OFF SET HEAD OFF SELECT count(
Learning AWK by examples (2)
求阶乘。学习要点:1. for循环2. 输出格式 printf([format_expression],arguments) printf的格式符: c -- ASCII character d -- Decimal integer e -- Floating point format ([-]d.precisionE[+-]dd) f -- Floating point format([-]ddd.precision) g -- e or f conversion, which is shortest, with trailing zeros removed o -- Unsigned octal value s -- String x -- Unsigned hexadecimal number % -- Literal %3. Input loop(输入循环),一直到用户
Learning AWK by examples (1)
前一阵子突然某天无聊,翻出o'reilly的那本《sed & awk》,突然觉得以前没看过一样,以前做的笔记也看起来那么肤浅。于是这几天有空又在捉摸那本书。不过这几天又在培训Oracle APP了,不知道这本书能不能看完。里面的例子真是不错,就抄一些下来吧,加一些注释,日后也可以做个参考。各位如果有兴趣一起学习,那请放心,粘贴的脚本都经过测试,不会有错。[@more@]该例子显示当前目录下的所有文件,目录和目录的子目录,并统计文件数和字节数。要点:1. NF等系统变量2. Regular Expression(正则表达式)的模式匹配$ cat lssum.awkls -lR|
shell写的控制菜单
写了上面的自动倒入数据的脚本后,根据需要又写了这个菜单界面,方便用户使用。写这个shell的时候参照了一个高人的例子,放在这里只为了方便自己日后用到时可以参考一下[@more@]#!/bin/kshpop_profile(){sqlplus -s zjenn/zjenn>>/dev/null<<EOF execute p_analytic.con2profile; exit;EOF}pop_behavior(){sqlplus -s zjenn/zjenn>>/dev/null<<EOF execute p_analytic.con2behavior; exit;EOF}pop_putch(){sqlplus -s zjenn/zjenn>>/dev/null<<EOF execute p_analytic