• shell系统管理


    背景知识

      对于 Linux 系统管理员来说,没有比 shell 脚本编程更有用处的了。通常,Linux 系统管理员每天需要完成无数项任务,从监视系统磁盘空间和系统用户到备份重要文件。Shell 脚本可以让系统管理员的工作变得非常轻松!使用简单的 shell 脚本就可以自动化执行所有基本的系统管理任务。

      管理计算机是个复杂的工作,具体来说系统管理员要做以下几方面的工作:
      ①设置整个计算机系统,包括硬件和软件,如安装硬件设备、安装操作系统和应用软件、为用户创建账户、分配系统资源等。
      ②做适时的备份及需要时的恢复。
      ③操作系统、应用软件、系统网络的升级以及日常维护。
      ④为用户提供常规支持。
      在这些管理工作中, 如果能合理使用 shell 工具将使管理工作变得简洁有效,从而能极大地提高管理效率。

    1、查看当前目录的父目录

    #!/bin/bash
    
    a=$(pwd)
    echo ${a%/*}

    2:将当前目录下所有文件按大小排序并将结果写入文本文件中 

    #!/bin/bash
    
    # awk 'NR!=1表示去除第一行'
    ls -l | awk 'NR!=1' |sort -n -k5>jishu #awk'NR!=1'把第一行的总用量去掉 sort -k5把第五列排序 cat jishu

    3在当前目录下创建一个test_mkdir目录,在新建目录中创建一个文件test_file

    #!/bin/bash
    
    read -p "please input test_mkdir:" dir
    if test -e $dir;then
        echo "dir is exist"
        exit
    elif test "$dir" != "test_mkdir";then
        echo "please input correct dir name"
        rm -rf $dir
    else
        mkdir $dir && cd $dir && touch test_file
    fi

    4:读取文件的每一行(while 

    #!/bin/bash
    
    read -p  "please input your file : " file
    cat $file | while read line 
    do
        echo $line
    done

     

    5:读取文件的每一行(for,并将小写字母转为大写字母。

    #!/bin/bash
    
    read -p "input filename :" file
    for line in $(cat $file) #$(cat $file)得到file的内容
    do
        upper=$(echo $line|tr '[a-z]' '[A-Z]') #得到每一行并转化为大写
        echo $upper   #输出
    done

    6:给定目录下文件/var/log/boot.log,提取该文件的目录名、文件名、扩展名

    #!/bin/bash
    
    a="/var/log/boot.log"
    echo "目录名是:${a%/*}"
    echo "文件名是:${a##*/}"
    echo "扩展名是:${a##*.}"
    
    # */ 表示/前面所有的内容
    # /* 表示/后面所有的内容
    # *. 表示.前面所有的内容
    # .* 表示.后面所有的内容

    7:将/var/log目录归档压缩到~/backup目录中

    #!/bin/bash
    
    mkdir backup
    ls /var/log        
    tar -czvf ~/backup/log.tar.gz /var/log     

    ps:tar常用命令选项

    -c:创建 .tar 格式的包文件

    -x:解开.tar格式的包文件

    -v:输出详细信息

    -z:调用gzip程序进行压缩或解压

    -C:解包时指定释放的目标文件夹

    -j:调用bzip2程序进行压缩或解压

    -f:表示使用归档文件

    -p:打包时保留原始文件及目录的权限

    -t:列表查看包内的文件

     

    8:将上一任务的log.tar.gz解压到/tmp中,并删除log.tar.gz文件

    #!/bin/bash
    
    ls /var/log
    tar -xzvf ~/backup/log.tar.gz -C /tmp
    rm /home/wj/backup/log.tar.gz 

    9:列出CPU占用率前五个的进程名、CPU占用率

    #!/bin/bash
    
    ps -aux | awk '{print $3,$11}' | sort -nr -k 1 | head -5

    10:设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名从stu1stu30

    #!/bin/bash
    
    i=1
    groupadd class1                  
    while [ $i -le 30 ]           
    do
          USERNAME=stu${i} 
          useradd -G class1 $USERNAME
          i=$(($i+1))    
    done

    11:编写shell程序,实现自动删除5个账号的功能。账号名为stu1stu5

    #!/bin/bash
    
    i=1
    while [ $i -le 5 ]
    do
      userdel -r stud${i}
      i=$(($i+1 ))
    done

    12:在/userdata目录下建立5个目录,即user1user5

    #!/bin/bash
    
    i=1
    while test $i -le 5
    do
      mkdir -p  /userdata/user"$i"
      i=$(($i+1))
    done

     

    13:设置上一个任务所建立的5个目录(user1user5)的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行

    #!/bin/bash
    
    i=1
    while test $i -le 5 
    do
        sudo chmod 754 /userdata/user"$i"
        i=$(($i+1))
    done

    14:获得环境变量PATH下所有目录包含的文件个数

    #!/bin/bash
    
    mypath=$(echo $PATH | sed 's/://g')
    totalcnt=0
    cnt=0
    for dir in $mypath
      do 
        lst=$(ls $dir)
        cnt=0
          for item in $lst
            do
               cnt=$(($cnt+1))
            done
         echo "$dir :$cnt"
         totalcnt=$(($totalcnt+$cnt))
       done
    echo $totalcnt 

    15:找出/路径里面大小排名前十的文件

    sort默认是升序排列,-k是根据列来排列,-n按数值排序

    #!/bin/bash
    
    ls -Rl / 2>/dev/null|awk '{print $5,$9}'|sort -k1 -nr|head -10
    # ls -Rl后的第一个/是表示从根目录下找 没有表示从当前目录下找
    # 2>/dev/null表示把需要权限的警告放到/dev/null下

    16:将当前目录下大于10K的文件/目录拷贝到/tmp目录下(用du命令)

    du 的英文为:disk usage,含义是磁盘空间使用情况,功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块的情况,如果没有指定目录,则对当前的目录进行统计。

     

    #!/bin/bash
    
    for file in `du -a |awk '$1>10240'` 
    do
        cp $file  /tmp
    done
    ls -l /tmp

     

    17:将当前目录下大于10K的文件/目录拷贝到/tmp目录下(用find命令)

    #!/bin/bash
    
    for file in `find ./ -size +10240`
    do
        cp $file /tmp
    done
    ls -l /tmp

    或者

    #!/bin/bash
    
    for file in `ls -l`
    do
        find . -size +10k
        cp  $file /tmp
    done

    还有一篇shell,明天写,累死了

  • 相关阅读:
    51nod1376 最长递增子序列的数量
    51nod1201 整数划分
    51nod1202 子序列个数
    51nod 博弈论水题
    51nod1052 最大M子段和
    51nod1678 lyk与gcd
    51nod1262 扔球
    BZOJ2763, 最短路
    吃西瓜 最大子矩阵 三维的。 rqnoj93
    noip2015 信息传递 强连通块
  • 原文地址:https://www.cnblogs.com/weijing24/p/4749342.html
Copyright © 2020-2023  润新知