shell的提高练习(二)

一    shell的一些特殊的符号

  如下的例子,文件cc.sh的内容如下:

  #!/bin/bash

  echo  $0     #$0表示的是 ” ./cc.sh  “

  echo  $1

  echo  $2

  echo  $3

       echo  $9

  echo  ${10}    

  echo  ${11}     #   这里必须要用上“ {}”,要不然显示的第11个参数是: “  $1”替换这里的“ 1 ”

      以下是  echo  $10   echo  $11的执行结果:

       

 

二:     shell的题目练习

  (23) 求出100以内的质数  

    #!/bin/bash
    i=2
    while [ $i -le 100 ]
    do
      j=2
      while [ $j -lt $i ]
      do
        tmp=$(($i%$j))
        if [ $tmp -eq 0 ]
        then
          break
        fi
        let j++
      done
      if [ $i -eq $j ]
      then
        echo -n " $i "
      fi
      let i++
    done

    注:当求1000以内的话,发现shell的脚本运行就变得很慢的了

  (24)用户清理,清除本机除了当前登陆用户以外的所有用户    

     #!/bin/bash
     a=`echo $0 | sed 's/..\(...\).*/\1/'`
     for i in `w|awk -v b=$a 'NR>2{if($NF !~ b) print $2}'`
       do
      echo $i
      fuser -k /dev/$i
        done

    (25)关闭打开的多个终端 

    #!/bin/bash   

    var=`tty | sed 's/\/dev\///g'`        #取出pts/1,当前的终端不关闭
    con_shell=`echo $SHELL | sed 's/\/bin\///g'`    #取出终端对应的shell,本机的为bash
    for pid in `ps aux|grep $con_shell| awk -v a=$con_shell -v b=$var ' { if($NF == a && $7 != b) print $2}'`
    do
      kill -9 $pid
      sleep 1     #休眠一秒
    done

   (26)查看TCP的连接状态

    #!/bin/bash

    netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

         (27) 查找较多time_wait连接

    netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

     (28)用户指定路径,输出文件大小最大的文件,递归子目录

    解析:$IFS默认是空格,制表符和换行符;

         IFS=$'\n'   使用$获取\n换行符的ASCII码作为IFS的值,因此分隔符就是换行符的了

        代码如下:      

      #!/bin/bash
      oldIFS=$IFS
      IFS=$'\n'
      for item in `du -a $1 |sort -nr `
      do
        getfilename=`echo $item|awk '{print $2} '`
        if [ -f $getfilename ]      # 判断是否为文件
        then
          echo "the max file name is :$getfilename"
        break;
        fi
      done
      IFS=$oldIFS

    (29)遍历一个用户指定输入的文件,并输出这个文件有多少行

      #!/bin/bash     

      num=0
      oldIFS=$IFS
      IFS=$'\n'          #这个必须置为 换行符'\n',要不然循环里面遇到空格也会被认为是一行的,因为这个地方要加上
      for item in `cat $1 `
      do
        let num++
      done
      echo "the file $1 have line numbers are :$num"
      IFS=$oldIFS

    (30)统计机器中网络各连接状态的个数

      #!;/bin/bash

      netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

      解析:$NF表示取每行中最后一个字段的值,

      S为数组,里面的元素就是连接状态;      

      S={LISTEN,TIME_WAIT....}
      S[LISTEN]默认为0,++S[LISTEN]用来记录出现LISTEN的个数

posted @ 2021-02-06 00:56  田大叔  阅读(94)  评论(0)    收藏  举报