• shell --08 例子


    目录

    1.按照时间生成文件2018-05-22.log将每天的磁盘使用状态写入到对应日期的文件

    [root@web01 ceshi]# cat 1.sh 
    #!/bin/bash
    Date=`date +%F`
    dir=/backup
    [ -d $dir ] || mkdir -p $dir
    df -h >${dir}/$Date.log
    

    2. 统计Nginx日志中每个IP的访问量有多少,日志如下:

    [root@web01 ~]# awk '{ip[$1]++} END {for(i in ip){print i,ip[i]}}' access_(1).log |sort -rnk2 |head|column -t
    
    [root@web01 ceshi]# cat 2.sh 
    #!/usr/bin/bash
    declare -A access
    
    while read line
    do
        type=$(echo $line|awk '{print $1}')
        let access[$type]++
    done < /root/driverzeng.com_access.log
    
    for i in ${!access[@]}
    do
        echo " ip是:$i 出现次数是 :${access[$i]}"
    done
    
    

    3.在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件

    ​ 1.批量修改txt为txt.bak

    ​ 2.把所有的.bak文件打包压缩为123.tar.gz

    ​ 3.批量还原文件的名字,及把增加的.bak再删除

    [root@web01 ceshi]# cat 3.sh 
    #!/bin/bash
    dir=/backup
    #1.判断目录是否存在,不存在则创建
    [ -d $dir ] || mkdir -p $dir
    #创建10个文件
    touch $dir/{1..10}.txt
    #批量修改文件名
    find $dir -type f -name "*.txt" >$dir/txt.log
    #2.使用for循环进行修改名
    for i in $(cat $dir/txt.log)
    do
        mv $i $i.bak
    done
    #3.打包压缩
    tar czf $dir/123.tar.gz  $dir/*.bak
    #4.批量还原
    find $dir -type f -name "*.bak" > $dir/bak.log
    for j in $(cat $dir/bak.log)
    do
        mv $j ${j%.*}
    done
    
    

    4.输入两个整数计算这两个整数的相加,相减,相乘,相除,求余的结果

    [root@web01 ceshi]# cat 4.sh 
    #!/bin/bash
    read -p "请输入第一个数字: " num1
    read -p "请输入第二个数字: " num2
    
    echo "$num1 + $num2 = $[$num1+$num2]"
    echo "$num1 - $num2 = $[$num1-$num2]"
    echo "$num1 x $num2 = $[$num1*$num2]"
    echo "$num1 ÷ $num2 = $[$num1/$num2]"
    echo "${num1}和${num2}的余是: $[$num1%$num2]"
    

    5.打印下面这句话中字母数小于5的单词** **I am lizhenya teacher I am 18

    方法一:
    [root@web01 ceshi]#  echo "I am lizhenya teacher I am 18"|xargs -n1|awk '{if(length < 5)print}'
    I
    am
    I
    am
    18
    方法二:
    [root@web01 ceshi]# cat 5.sh 
    #!/bin/bash
    length='I am lizhenya teacher I am 18'
    
    for i in $length
    do
            [ ${#i} -lt 5 ] && echo $i
        done
    

    6. 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10

    [root@web01 ceshi]# cat 6.sh 
    #!/bin/bash
    HISTFILE=~/.bash_history
    set -o history
    history |awk '{print $2}'|sort|uniq -c|sort -rn|head 
    
    

    7. 将下面的条件表达式改写为if条件语句** [ -f /etc/hosts ] && echo !

    [root@web01 ceshi]# cat 7.sh 
    #!/bin/bash
    if [ -f /etc/hosts ];then 
        echo !
    fi
    

    8.写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些**

    方法一:
    [root@web01 ceshi]# cat 8.sh 
    #!/bin/bash
    for i in {1..254}
    do
        {
        ping -W1 -c1 10.0.0.$i &>/dev/null 
        rc=$?
        if [ $rc -eq 0 ];then
            echo -e "33[32m 10.0.0.$i 存在 33[0m"
        else
            echo -e "33[31m 10.0.0.$i 不存在 33[0m"
        fi
    }&
    done
    
    方法二:
    [root@web01 ceshi]# cat 8-2.sh 
    #!/bin/bash
    source /etc/init.d/functions
    
    for i in {1..254}
    do
        {
        ping -W1 -c1 10.0.0.$i &>/dev/null
        if [ $? -eq 0 ];then
        action "IP 10.0.0.$i 通" /bin/true
        else
        action "IP 10.0.0.$i 不通" /bin/false &>/dev/null
        fi
        } &
        sleep 0.01                                                                                                          
    done
    
    

    9.写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常

    [root@web01 ceshi]# cat 9.sh 
    #!/bin/bash
    read -p "请输入网址:  " address
    state=`curl -sI $address | awk 'NR==1{print $2}'`
    if ((state==200));then 
        echo -e  "33[32m $address 网站正常33[0m"
    else
        echo -e  "33[31m $address 无法连接33[0m"
    fi
    
    

    10.用Shell实现,把一个文本文档中只有一个数字的行给打印出来

    [root@web01 ceshi]# cat 10.sh 
    #!/bin/bash
    read -p "请输入要测试的文件: " cc
    aa=`cat $cc|wc -l`
    for i in `seq $aa`                                 
    do
        lenth=`sed -n "$i"p  $cc |sed s#[^0-9]##g|wc -L`
        if [[ $lenth = 1 ]];then
            sed -n "$i"p $cc
        fi
    done
    
    

    11.查看磁盘/当前使用状态,如果使用率超过80%则把结果输出到/var/log/disk.err

    [root@web01 ceshi]# cat 11.sh
    #!/bin/bash
    date=`date +%F`
    use=`df -h|awk 'NR==2{print $(NF-1)}'`
    if [ ${use/\%/} -lt 80 ];then
        echo "${date}磁盘/使用率正常! 使用率为$use"
    else
        echo "${date}磁盘/使用率不正常! 使用率为$use" >>/var/log/disk.err
    fi
    

    12.脚本用read批量创建10个用户,密码统一为123,需要对用户输入是否为数字和输入的名字是否为空做判断

    [root@web01 ceshi]# cat 12.sh 
    #!/usr/bin/bash
    read -p "请输入你要创建的用户前缀: " user
    if [ -z $user ];then
        echo "请输入有效的值.....再见"
        exit
    elif [[ $user =~ ^[0-9]+$ ]];then
        echo "你输入的是数字...再见 "
        exit
    else
        continue
    fi
    
    for i in `seq 10`
    do
        user_name=${user}${i}
        useradd $user${i}
        echo "用户: ${user}${i} 已创建" 
        echo "123" | passwd --stdin $user${i} &>/dev/null
    done
    

    13.使用case语句编写php-fpm启动脚本

    [root@web01 ceshi]# vim  13.sh
    . /etc/rc.d/init.d/functions  
    
    . /etc/sysconfig/network  
    
    [ "$NETWORKING" = "no" ] && exit 0  
    
    phpfpm="/usr/local/php-5.3.10/sbin/php-fpm"  
    prog=$(basename ${phpfpm})  
    
    lockfile=/var/lock/subsys/phpfpm
    
    start() {  art
        [ -x ${phpfpm} ] || exit 5  
        echo -n $"Starting $prog: "  
        daemon ${phpfpm}
        retval=$?  
        echo  
        [ $retval -eq 0 ] && touch $lockfile  
        return $retval  
    }  
    
    stop() {  
        echo -n $"Stopping $prog: "  
        killproc $prog -QUIT  
        retval=$?  
        echo  
        [ $retval -eq 0 ] && rm -f $lockfile  
        return $retval  
    }  
    
    restart() {  
        configtest || return $?  
        stop  
        start  
    }  
    
    reload() {  
        configtest || return $?  
        echo -n $"Reloading $prog: "  
        killproc ${phpfpm} -HUP  
        RETVAL=$?  
        echo  
    }  
    
    force_reload() {  
        restart  
    }  
    
    configtest() {  
        ${phpfpm} -t
    }  
    
    rh_status() {  
        status $prog  
    }  
    
    rh_status_q() {  
        rh_status >/dev/null 2>&1  
    }  
    
    case "$1" in  
        start)  
            rh_status_q && exit 0  
            $1  
            ;;  
        stop)  
            rh_status_q || exit 0  
            $1  
            ;;  
        restart|configtest)  
            $1  
            ;;  
        reload)  
            rh_status_q || exit 7  
            $1  
            ;;  
        status)  
            rh_status  
            ;;  
        *)  
            echo $"Usage: $0 {start|stop|status|restart|reload|configtest}"  
            exit 2  
    esac
    
    

    14.打印一个菜单如下,然后用循环加case语句输出用户输入菜单选项的结果(8分)

    h 显示命令帮助

    f 显示登陆信息

    d 显示磁盘挂载

    m 查看内存使用

    u 查看系统负载

    q 退出程序

    [root@web01 ceshi]# cat 14.sh 
    #!/bin/bash
    menu(){
        cat<<EOF
    ----------------------
           菜单        
    ----------------------
    h  显示命令帮助 
    ----------------------
    f  显示登录的信息  
    ----------------------
    d  显示磁盘挂载 
    ----------------------
    m  查看内存使用  
    ----------------------
    u  查看系统负载
    ----------------------
    q  退出程序     
    ----------------------
    EOF
    }
    menu
    while true  
    do
        read -p "请输入序号来执行对应: "  aaa
        case $aaa in
            h)
                menu
                ;;
            f)
                whoami
                ;;
            d)
                df -h
                ;;
            m)
                free -m
                ;;
            u)
                w
                ;;
            q)
                exit
                ;;
            *)
                echo "傻子,输错了...!"
                ;;
        esac
    done
    

    15.生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果

    [root@web01 ceshi]# cat 15.sh
    #!/bin/bash
    while true
    do 
    	ran=`echo $((RANDOM%100+1))`
    	sum=$(($sum+$ran))
    	if [ $sum -gt 1000 ]
    	then
        echo "结果为 $sum"
    	break
    	fi
    done
    

    16.判断/tmp目录下是否有大于4k的文件,如果有则输出该文件的大小与创建时间

    [root@web01 ceshi]# cat 16.sh 
    #!/bin/bash
    wenjian=`find /tmp -type f -size +4k `
    for i in $wenjian
    do
        if [ -f $i ];then
            echo "$(ls -l $wenjian|awk '{print $5,$6,$7,$8,$NF}')"
        else
            echo "exit"
        fi
    done  
    

    17.检测服务器中重要的文件是否被修改吗如果被修改则报警(使用指纹)

    [root@web01 ceshi]# cat 17.sh 
    #!/binbash
    md5sum /root/file > /root/md5sum
    while true
    do
        md5sum -c /root/md5sum &>/dev/null
        if (( $?==0 ));then 
            echo "文件正常"
            sleep 10
        else 
            echo "文件修改了"
            sleep 10
        fi
    done
    

    18.防止DOS攻击(检测nignx日志若某个IP短时间的PV过大则使用防火墙将其禁掉)

    1.根据日志提取ip和pv数,或者根据网络连接数提ip和pv
    2.判断当pv大于你所能接受的最大值时,把此ip加入防火墙中
    3.可以结合crontab实现每3分钟执行一次
    
    

    19.if 判断分数大于等于90分的为优秀,大于等于70的为良好,大于等于60的为及格否则不及格 数字不能为空 最大分数为100分。

    [root@web01 ceshi]# vim 19.sh 
    #!/bin/bash
    read -p "请输入你的分数: " fs
    if [ $fs -gt 0 -a $fs -lt 60 ];then
        echo "补考"
    elif [ $fs -ge 60 -a $fs -lt 70 ];then
        echo "合格"
    elif [ $fs -ge 70 -a $fs -le 90 ];then
        echo "良好"
    elif [ $fs -ge 90 -a $fs -le 100 ];then
        echo "优秀"
    else
        echo "顽皮"
    fi
    

    20.判断软件包是否安装

    [root@web01 ceshi]# vim 20.sh
    #!/bin/bash
    read -p "输入要查的包 :"  name
    rpm -ql $name>/dev/null
    d=`echo $?`
    if [ $d -eq "0" ];then                                                                           
        echo "存在"
    else
        echo "不存在"
    fi
    
    

    21. 判断文件是否存在

    ```shell
    [root@web01 ceshi]# cat fun.sh 
    #!/bin/bash
    fun(){
        if [ -f $1 ];then
            echo "$1 存在"
        else
            echo "$1 不存在"
        fi
    }
    fun $1
    
    ```
    

    22.函数内如果执行的上一条是函数名,则不会返回函数本身执行的返回值

    [root@web01 ceshi]# cat fun2.sh 
    #!/bin/bash
    fun(){
        echo 50
        return 1
    }
    re=`fun`
    echo "函数的返回值是: $? "
    echo "函数执行的结果是: $re"
    
    

    [root@web01 ceshi]# cat fun3.sh 
    #!/bin/bash
    fun(){
        echo 50
        return 1
    }
    re=`fun`
    name=oldboy
    echo "函数的返回值是: $? "
    echo "函数执行的结果是: $re"
    
    

    23. 从1加到100

    [root@web01 ceshi]# cat sum.sh 
    #!/bin/bash
    i=0
    while [ $i -le 100 ]
    do
        sum=$[i+sum]
        let i++
    done
    echo $sum
    [root@web01 ceshi]# cat sum2.sh 
    #!/bin/bash
    for i in {1..100}
    do
        sum=$[i+sum]
        let i++
    done
    echo $sum
    
    

  • 相关阅读:
    cf B. Sereja and Suffixes
    cf E. Dima and Magic Guitar
    cf D. Dima and Trap Graph
    cf C. Dima and Salad
    最短路径问题(floyd)
    Drainage Ditches(网络流(EK算法))
    图结构练习—BFSDFS—判断可达性(BFS)
    Sorting It All Out(拓扑排序)
    Power Network(最大流(EK算法))
    Labeling Balls(拓扑)
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11836636.html
Copyright © 2020-2023  润新知