01. 定时清空文件内容,定时记录文件大小

  1. #!/bin/bash
  2. ################################################################
  3. #每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内
  4. #容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件
  5. ################################################################
  6. logfile=/tmp/`date +%H-%F`.log
  7. n=`date +%H`
  8. if [ $n -eq 00 ] || [ $n -eq 12 ]
  9. then
  10. #通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作
  11. for i in `find /data/log/ -type f`
  12. do
  13. true > $i
  14. done
  15. else
  16. for i in `find /data/log/ -type f`
  17. do
  18. du -sh $i >> $logfile
  19. done
  20. fi

02. 检测网卡流量,并按规定格式记录在日志中

  1. #!/bin/bash
  2. #######################################################
  3. #检测网卡流量,并按规定格式记录在日志中
  4. #规定一分钟记录一次
  5. #日志格式如下所示:
  6. #2019-08-12 20:40
  7. #ens33 input: 1234bps
  8. #ens33 output: 1235bps
  9. ######################################################3
  10. while :
  11. do
  12. #设置语言为英文,保障输出结果是英文,否则会出现bug
  13. LANG=en
  14. logfile=/tmp/`date +%d`.log
  15. #将下面执行的命令结果输出重定向到logfile日志中
  16. exec >> $logfile
  17. date +"%F %H:%M"
  18. #sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8
  19. sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'
  20. echo "####################"
  21. #因为执行sar命令需要59秒,因此不需要sleep
  22. done

03. 计算文档每行出现的数字个数,并计算整个文档的数字总数

  1. #!/bin/bash
  2. #########################################################
  3. #计算文档每行出现的数字个数,并计算整个文档的数字总数
  4. ########################################################
  5. #使用awk只输出文档行数(截取第一段)
  6. n=`wc -l a.txt|awk '{print $1}'`
  7. sum=0
  8. #文档中每一行可能存在空格,因此不能直接用文档内容进行遍历
  9. for i in `seq 1 $n`
  10. do
  11. #输出的行用变量表示时,需要用双引号
  12. line=`sed -n "$i"p a.txt`
  13. #wc -L选项,统计最长行的长度
  14. n_n=`echo $line|sed s'/[^0-9]//'g|wc -L`
  15. echo $n_n
  16. sum=$[$sum+$n_n]
  17. done
  18. echo "sum:$sum"

04. 连续输入5个100以内的数字,统计和、最小和最大

  1. #!/bin/bash
  2. COUNT=1
  3. SUM=0
  4. MIN=0
  5. MAX=100
  6. while [ $COUNT -le 5 ]; do
  7. read -p "请输入1-10个整数:" INT
  8. if [[ ! $INT =~ ^[0-9]+$ ]]; then
  9. echo "输入必须是整数!"
  10. exit 1
  11. elif [[ $INT -gt 100 ]]; then
  12. echo "输入必须是100以内!"
  13. exit 1
  14. fi
  15. SUM=$(($SUM+$INT))
  16. [ $MIN -lt $INT ] && MIN=$INT
  17. [ $MAX -gt $INT ] && MAX=$INT
  18. let COUNT++
  19. done
  20. echo "SUM: $SUM"
  21. echo "MIN: $MIN"
  22. echo "MAX: $MAX"

05. 用户猜数字

  1. #!/bin/bash
  2. # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了
  3. # 猜小了或猜大了,直至用户猜对脚本结束。# RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
  4. # 使用取余算法将随机数变为 1‐100 的随机数num=$[RANDOM%100+1]echo "$num"
  5. # 使用 read 提示用户猜数字
  6. # 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
  7. # ‐lt(小于),‐le(小于等于)
  8. while :do
  9. read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
  10. if [ $cai -eq $num ]
  11. then
  12. echo "恭喜,猜对了"
  13. exit
  14. elif [ $cai -gt $num ]
  15. then
  16. echo "Oops,猜大了"
  17. else
  18. echo "Oops,猜小了"
  19. fi
  20. done

06. 批量修改文件名

  1. # touch article_{1..3}.html
  2. # ls
  3. article_1.html article_2.html article_3.html
  4. 目的:把article改为bbs
  5. 方法1
  6. for file in $(ls *html); do
  7. mv $file bbs_${file#*_}
  8. # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')
  9. # mv $file $(echo $file |echo bbs_$(cut -d_ -f2)
  10. done
  11. 方法2
  12. for file in $(find . -maxdepth 1 -name "*html"); do
  13. mv $file bbs_${file#*_}
  14. done
  15. 方法3
  16. # rename article bbs *.html

07. 统计当前目录中以.html结尾的文件总大

  1. 方法1
  2. # find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'
  3. 方法2
  4. for size in $(ls -l *.html |awk '{print $5}'); do
  5. sum=$(($sum+$size))
  6. done
  7. echo $sum

08. 扫描主机端口状态

  1. #!/bin/bash
  2. HOST=$1
  3. PORT="22 25 80 8080"
  4. for PORT in $PORT; do
  5. if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
  6. echo "$PORT open"
  7. else
  8. echo "$PORT close"
  9. fi
  10. done

09. 输入数字运行相应命令

  1. #!/bin/bash
  2. ##############################################################
  3. #输入数字运行相应命令
  4. ##############################################################
  5. echo "*cmd menu* 1-date 2-ls 3-who 4-pwd 0-exit "
  6. while :
  7. do
  8. #捕获用户键入值
  9. read -p "please input number :" n
  10. n1=`echo $n|sed s'/[0-9]//'g`
  11. #空输入检测
  12. if [ -z "$n" ]
  13. then
  14. continue
  15. fi
  16. #非数字输入检测
  17. if [ -n "$n1" ]
  18. then
  19. exit 0
  20. fi
  21. break
  22. done
  23. case $n in
  24. 1)
  25. date
  26. ;;
  27. 2)
  28. ls
  29. ;;
  30. 3)
  31. who
  32. ;;
  33. 4)
  34. pwd
  35. ;;
  36. 0)
  37. break
  38. ;;
  39. #输入数字非1-4的提示
  40. *)
  41. echo "please input number is [1-4]"
  42. esac

10. 创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字,最后需要把每个用户的密码存在指定文件中

  1. #!/bin/bash
  2. ##############################################################
  3. #创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字
  4. #最后需要把每个用户的密码存在指定文件中
  5. #前提条件:安装mkpasswd命令
  6. ##############################################################
  7. #生成10个用户的序列(00-09)
  8. for u in `seq -w 0 09`
  9. do
  10. #创建用户
  11. useradd user_$u
  12. #生成密码
  13. p=`mkpasswd -s 0 -l 10`
  14. #从标准输入中读取密码进行修改(不安全)
  15. echo $p|passwd --stdin user_$u
  16. #常规修改密码
  17. echo -e "$p\n$p"|passwd user_$u
  18. #将创建的用户及对应的密码记录到日志文件中
  19. echo "user_$u $p" >> /tmp/userpassword
  20. done

11. 有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?

  1. 1)第一种方法:
  2. 用户应使用crontab e 命令创建crontab文件。格式如下:
  3. 0 0 * * sun cp r /user/backup /tmp
  4. 2)第二种方法:
  5. 用户先在自己目录下新建文件file,文件内容如下:
  6. 0 * * sun cp r /user/backup /tmp
  7. 然后执行 crontab file 使生效。

12. 批量主机磁盘利用率监控 (格式)

  1. 前提监控端和被监控端SSH免交互登录或者密钥登录。
  2. 写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port
  3. class="">#!/bin/bashHOST_INFO=host.infoforIPin$(awk'/^[^#]/{print $1}'$HOST_INFO);doUSER=$(awk -v ip=$IP'ip==$1{print $2}'$HOST_INFO) PORT=$(awk -v ip=$IP'ip==$1{print $3}'$HOST_INFO) TMP_FILE=/tmp/disk.tmp ssh -p$PORT$USER@$IP'df -h'>$TMP_FILEUSE_RATE_LIST=$(awk'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}'$TMP_FILE)forUSE_RATEin$USE_RATE_LIST;doPART_NAME=${USE_RATE%=*}USE_RATE=${USE_RATE#*=}if[$USE_RATE-ge 80 ];thenecho"Warning: $PART_NAME Partition usage $USE_RATE%!"fidonedone

13. 检查MySQL主从同步状态

  1. class="">#!/bin/bash USER=bakPASSWD=123456IO_SQL_STATUS=$(mysql -u$USER-p$PASSWD-e'show slave status\G'|awk -F:'/Slave_.*_Running/{gsub(": ",":");print $0}')#gsub去除冒号后面的空格foriin$IO_SQL_STATUS;doTHREAD_STATUS_NAME=${i%:*}THREAD_STATUS=${i#*:}if["$THREAD_STATUS"!="Yes"];thenecho"Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!"fidone

14. 删除当前目录下大小为0的文件

  1. #/bin/bash
  2. for filename in `ls`
  3. do
  4. if test -d $filename
  5. then b=0
  6. else
  7. a=$(ls -l $filename | awk '{ print $5 }')
  8. if test $a -eq 0
  9. then rm $filename
  10. fi
  11. fi
  12. done

15. for循环的使用

  1. #/bin/bash
  2. clear
  3. for num in 1 2 3 4 5 6 7 8 9 10
  4. do
  5. echo "$num"
  6. done

16. 从0.sh中读取内容并打印

  1. #/bin/bash
  2. while read line
  3. do
  4. echo $line
  5. done < 0.sh

17. 普通无参数函数

  1. #/bin/bash
  2. p ()
  3. {
  4. echo "hello"
  5. }
  6. p

18. 给函数传递参数

  1. #/bin/bash
  2. p_num ()
  3. {
  4. num=$1
  5. echo $num
  6. }
  7. for n in $@
  8. do
  9. p_num $n
  10. done

19. 创建文件夹(*)

  1. #/bin/bash
  2. while :
  3. do
  4. echo "please input file's name:"
  5. read a
  6. if test -e /root/$a
  7. then
  8. echo "the file is existing Please input new file name:"
  9. else
  10. mkdir $a
  11. echo "you aye sussesful!"
  12. break
  13. fi
  14. done

20. 查找最大文件

  1. #/bin/bash
  2. a=0
  3. for name in *.*
  4. do
  5. b=$(ls -l $name | awk '{print $5}')
  6. if test $b -ge $a
  7. then a=$b
  8. namemax=$name
  9. fi
  10. done
  11. echo "the max file is $namemax"

21. 有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下,该用户应如何做?

  1. 1)第一种方法:
  2. 用户应使用crontab e 命令创建crontab文件。格式如下:
  3. 0 0 * * sun cp r /user/backup /tmp
  4. 2)第二种方法:
  5. 用户先在自己目录下新建文件file,文件内容如下:
  6. 0 * * sun cp r /user/backup /tmp
  7. 然后执行 crontab file 使生效。

1-10 11-13 14-20