shell编程案例

  • 格式:doc
  • 大小:52.50 KB
  • 文档页数:17

1.查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数。 #!/bin/bash count=0 for file in `find ./ -size +512000k` do count=`expr $count + 1` echo $file >> new done echo "$count" 2.在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。 #!/bin/bash count=0 for file in `find /tmp -name "abc*"` do head -n1 $file>>new count=`expr $count+1 ` if [ $count -gt 100 ];then break fi done 3.把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。 grep -vf a b | cat > c grep -vf a b | wc -l 4.判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下 read -p "input a file:" file if [ -c $file -o -b $file ];then cp $file /dev/ fi 5.每隔10分钟监控一次,监控/usr下如果大于5G,发邮件给管理员 #!/bin/bash while true do n=`du -s /usr|cut -f1` if [ $n -gt 1 ];then mail -s "greater"295322935@qq.comfi sleep 600 done 6.从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的第5个字段 grep -E "WARNING|FATAL" a.log |grep -v "IGNOR" |cut -f5 -d':' 7.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash if [ $# = 2 ];then num3=`expr $1 - $2 ` else read -p "input a number:" num1 read -p "input another number:" num2 num3=`expr $num1 - $num2 ` fi echo $num3 8.把某个目录下的文件扩展名改为bat,再以时间为文件名压缩打包存放到某个目录。 #!/bin/bash if test $# -eq 1 -a -d $1 ;then for file in `ls $1` do mv $file $file.bat done filename=date+%y%m%d tar -cjvf $filename.tar.bz2 else echo "input dir" read dir for file in `ls $dir` do mv $file $file.bat done filename=date+%y%m%d tar -cjvf $filename.tar.bz2 fi 9.判断一个数是不是完数。打印出1-1000之间的完数。 完数就是约数的和等于自身2倍的数。(6,28,496) (1) #!/bin/bash sub() { i=1; sum=0; while [ $i -le $num ] do let "m=num%i" if [ $m -eq 0 ] then let "sum=sum+i" fi let "i=i+1" done let "a=2*num" if [ $a -eq $sum ] then echo $num fi } num=1 while [ $num -le 1000 ] do sub let "num = num+1" done (2) #!/bin/bash for((i=1;i<=1000;i++)) do sum=0 for((j=1;j<=i;j++)) do m=`expr $i % $j` if [ $m -eq 0 ];then sum=`expr $sum + $j` fi done y=`expr $i \* 2 ` if [ $y -eq $sum ];then echo $i fi done 10.在某个文件夹下查找含有指定字符串的文件 #!/bin/bash for file in `ls $2` do f=`grep -l $1 $2$file` echo $f done 调用方法:./tst 000 bash#在文件夹bash中查找含有“000”的文件。 11.添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。 groupadd class1 for((i=0;i<=30;i++)) do if [ $i -lt 10 ];then no="0$i" else no="$i" fi echo "stu$no" useradd -g class1 stu$no passwd -d stu$no chage -d 0 stu$no done 12.实现自动删除50个账号的功能。账号名为stud1至stud50 #!/bin/bash for((i=0;i<=50;i++)) do userdel -r stu$i done 13.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。 #!/bin/bash mkdir /userdata cd /userdata for((i=1;i<=50;i++)) do mkdir user$i chmod 754 user$i done 14.一个文件内容全部是类似 【202.205.151.21】--【23:59:22】-“HTTP GET”-“Mozila” ... 写一个SHELL命令找出最多的10个IP awk -F "--" '{print $1}' shit | sort | uniq -c | sort -r | sed -n '1,10p' 个人cat $1 |cut -c2-15|sort|uniq 15./tmp路径下有800个文件 文件名的格式是:filename_YYYYMMDD_序列号(从001到999).dat, 例如:filename_20040108_089.dat。现在想把这些文件改名,新文件名的格式是:filename_TODAY(当前日期)_序列号(从500开始,到达999之后从001开始).dat,例如: 把filename_20040108_089.dat改为filename_20041222_589.dat,注意新文件名的序列号的顺序需要和原来的一致,即要做排序处理。 #!/usr/bin/bash DEST_FILE_PART2="_`date '+%Y%m%d'`_" EXT_NAME=".dat" SRC_FILE_LIST=`find /tmp -name "*_*_*$EXT_NAME" -print` for each in $SRC_FILE_LIST; do DEST_FILE_PART1=`echo $each | awk -F"_" '{print $1}'` OLD_NUM=`echo $each | awk -F"_" '{print $3}' | awk -F"." '{print $1}'` DEST_FILE_PART3=`expr $OLD_NUM + 500` [ $DEST_FILE_PART3 -gt 999 ] && DEST_FILE_PART3=`expr $OLD_NUM - 499` && DEST_FILE_PART3=`printf %03d $DEST_FILE_PART3` DEST_FILE=$DEST_FILE_PART1$DEST_FILE_PART2$DEST_FILE_PART3$EXT_NAME echo "mv $each to $DEST_FILE" mv $each $DEST_FILE done 我的解法: #!/bin/bash new_file=$(date +20%y%m%d); for file in $(ls ~/bash) do i=$(echo "$file" | sed 's/.*_[0-9]*_\([0-9]*\).dat/\1/') #取出序列号 i=$(echo $i | sed 's/^0*\([0-9]*\)/\1/') #去掉序列号前面可能的 ‘0’, let "ii=i+500" if [ $ii -gt 999 ] then let "ii=ii-999" fi