shell的提高练习(一)

  (1)在使用linux编写shell脚本之前,我们得先查看下系统支持的shell,可以通过 cat /etc/shells,可以查看所支持的shell。并且通过echo $SHELL查看当前使用的是哪个shell。如下是本人当前系统支持的shell:

  
  因为当前使用的是/bin/bash,那么在脚本文件头应该如下:

  #!/bin/bash

  (2)当编写完一个脚本,保存并命名为aa.sh。让这个脚本运行起来有如下的几种:

    第一: /bin/bash aa.sh
    第二: source aa.sh
      第三: 更改 aa.sh 的权限得有可执行权限 chmod +x aa.sh ; 接着输入 ./ aa.sh,如下图所示:

    


二      脚本的提高练习题

    (1)每隔两秒打印出系统的负载均衡     

    #!/bin/bash
    while true
    do
      uptime
      sleep 2
    done

   (2)求两个数之和   

      #!/bin/bash
      a=50
      b=20
      c=$(($a+$b))
      echo "$a+$b=$c"

   (3)求1到100的和

      #!/bin/bash      

      i=1
      sum=0
      while [ $i -le 100 ]
      do
        sum=$(($sum+$i))
        let i++
      done
      echo "1+2+3....+99+100=$sum"

   (4) 将一目录下所有的文件的扩展名改为bak

      #!/bin/bash    

      var2=.bak
      for filename in `ls -a`
      do
        if [ -f $filename ];then
          var=${filename%.*} #这里是过滤掉文件的后缀名 ” .txt “ 或者 “ .c“

         mv $filename $var$var2

        fi
      done

      注意:执行完这个脚本,会把当前运行的脚本的后缀名也改成了” .bak “
   (5) 编译当前目录下的所有.c文件 

      #! /bin/bash
      for myfile in `ls *.c`
      do
        var=${myfile%.*}
        g++ "$myfile" -o "$var"
        sleep 2 #休息2

      done > compile 2>&1    #将错误的信息打印到compile文件中,并且错误提示不会出现在控制台

    (6) 打印当前目录下,root可以使用可执行文件数,处理结果: root's bins:
      注意:由于linux系统的可执行文件不能单独通过文件后缀名来表示,所以只能通过ls -l 来查看文件属性中是否有可执行的权限
      #! /bin/bash
      var=$( find ./ -type f | xargs ls -l | sed -n '/-..x/p' | wc -l) # sed -n ,要不然wc -l 的时候,结果会多出一倍出来
      echo "root bins: $var"

    (7) 打印当前sshd的端口和进程id,处理结果: sshd Port&&pid: 22 5412     

      #! /bin/bash

      netstat -apn | grep sshd | sed -n 's/.*:::\([0-9]*\)\ .* \ \([0-9]*\)\/sshd/\1 \2/p'

    (8)输出本机创建1000个目录所用的时间,处理结果:

      real 0m3.367s
      user 0m0.066s
      sys 0m1.925s

      代码如下:
      #!/bin/bash
      time( mkdir f{1..1000} )
    (9)打印本机交换分区大小
      #!/bin/bash

      free -m | sed -n '/Swap/p' | awk '{ print $2}'

     或者如下:  

      #!bin/bash    

      echo -n "Swap:"
      free -m|grep "Swap"|awk '{print $2}'

     (10)文本分析,取出/etc/password中shell出现的次数

      第一种方法结果:
      4 /bin/bash
      1 /bin/sync
      1 /sbin/halt
      31 /sbin/nologin
      1 /sbin/shutdown

      第二种方法结果:
      /bin/sync 1
      /bin/bash 1
      /sbin/nologin 30
      /sbin/halt 1
      /sbin/shutdown 1

      代码如下:
      #!/bin/bash
      cat /etc/passwd | awk -F: '{if ($7!="") print $7}' | sort | uniq -c #sort是排序,uniq是统计重复的行
   (11)写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录。      

      #! /bin/bash
      echo -n "当前的日期:"
      date +%Y-%m-%d
      echo -n "当前的时间:"
      date +%H:%M:%S
      echo -n "用户名:"
      whoami
      echo -n "当前工作目录:"
      pwd

   (12)编写shell脚本获取本机的网络地址。      

      #!/bin/bash
      IP=`ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | sed 's/ Bcast.*$//g'`
      NETMASK=`ifconfig eth0 | grep 'inet '| sed 's/^.*Mask://g'`
      echo "$IP"
      exit 0

    (13)将当前文件目录下大于10K的文件拷贝到/tmp     

      #! /bin/bash
      for filename in `find ./ -size +1k -type f -print` ;
      do
        mv "$filename" /tmp
      done
      echo "copy done"
      ls -l /tmp

    (14)文件移动拷贝,有m1.txt m2.txt m3.txt m4.txt,分别创建出对应的目录,m1 m2 m3 m4 并把文件移动到对应的目录下。     

      #!/bin/bash

      touch m1.txt m2.txt m3.txt m4.txt

      I=1

      while [ $I -le 4 ]; do

      mkdir m$I
      mv m$I.txt m$I
      I=$((I+1))

      done

    (15)显示当前用记登陆了多长的时间   

      #!/bin/bash
      uptime | awk -F "," '{print $1}' |sed 's/^.*up//g'

    (16)统计IP访问:要求分析apache访问日志,找出访问页面数量在前100位的IP数。日志大小在78M左右。以下是apache的访问日志节选

        202.101.129.218 - - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0;         Windows NT 5.1)"

      代码如下:      

      #! /bin/bash
      # $1 为要测试的日志文件
      awk '{print $1}' $1 | sort | uniq -c | sort -k1nr | head -n3

     (17)设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限                           为:读、写、执行;文件所有者所在组的权限为:读、执行。
      代码如下:      

        #!/bin/bash
        echo "create /usrdata"
        mkdir /usrdata
        if [ $? -eq 0 ]; then
          i=1
          while [ $i -le 5 ]; do
            mkdir -p /usrdata/user$i
            chmod 754 /usrdata/user$i
            let i++
          done
        else
          echo "bye"
          exit 1
        fi
        exit 0

    (18)设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30,并设置密码为对应的stdxx。
      代码如下:
      #!/bin/bash

      groupadd class1
      for i in {9901..9930}; do
        xx=`echo $i | sed 's/99//g'`
        useradd -g class1 -s /bin/bash -d /home/std$xx -m std$xx
        echo -e "std$xx\nstd$xx" | passwd std$xx
        echo -e "user std$xx password is std$xx" >> /root/newuser.txt
      done

      #执行脚本时先切换到超级用户
     (19)编写shell程序,实现自动删除30个账号的功能。账号名为std01至std30。     

      #!/bin/bash
      for i in {9901..9930}; do
        xx=`echo $i | sed 's/99//g'`
        userdel -r std$xx
      done

      #执行脚本时先切换到超级用户
     (20)设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名,为如下形式yymmdd_etc,yy为年,mm为月,                            dd为日。Shell程序fileback存放在/usr/bin目录下    

      #!/bin/bash
      filename=`date +%y%m%d`_etc.tar.gz
      cd /etc/
      tar -zcvf $filename *
      mv $filename /root/bak/

      # vim /etc/crontab 加入
      # * * 1 * * root ./23.sh &
      # 加入定时管理模块

      (21)对于一个用户日志文件,每行记录了一个用户查询串,长度为1-255字节,共几千万行,请排出查询最多的前100条。 日志可以自己构造。
        日志的格式如下(对应的日志文件名为testdata.txt):

        
        代码如下:
        #! /bin/bash

        # show top 10

        file=$1
        awk '{print $1}' testdata.txt | sort | uniq -c | sort -k1nr | head -n10 #$1表示测试的文件名

      (22)编写自己的ubuntu环境安装脚本
        代码如下:       

        #! /bin/bash
        sudo apt-get update
        sudo apt-get intall aptitude -y
        sudo apt-get intall tree
        sudo apt-get intall vim -y
        sudo echo "sudo cp vimrc /etc/vim/vimrc"
        sudo cp vimrc /etc/vim/vimrc

        sudo apt-get intall stardict -y
        sudo echo "sudo cp dic /usr/share/stardict -r"
        sudo cp dic /usr/share/stardict -r

        sudo apt-get intall g++ -y
        sudo apt-get intall vaftpd -y
        sudo apt-get intall lftp -y
        sudo apt-get intall nfs-kernel-server -y

 

posted @ 2021-02-03 02:53  田大叔  阅读(146)  评论(0)    收藏  举报