zoukankan      html  css  js  c++  java
  • Linux(17):Shell编程(4)

    案例1:批量生成随机字 符 文件名案例

    使用for 循环在 /neo 目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串 neo创建的结果名称示例 如下:

    [root@oldgirl C19]# ls /neo
    apquvdpqbk_neo.html mpyogpsmwj_neo.html txynzwofgg_neo.html
    bmqiwhfpgv_neo.html mtrzobsprf_neo.html vjxmlflawa_neo.html
    jhjdcjnjxc_neo.html qeztkkmewn_neo.html
    jpvirsnjld_neo.html ruscyxwxai_neo.html

    参考如下:

    # 生成随机数的方式:
    echo $RANDOM                          # 随机数的范围: 0~32767
    openssl rand -base64 10                # 10 表示要生成的随机数的长度
    date +%s%N                            # 用时间做随机数
    head /dev/urandom |cksum        
    uuidgen                                # 利用uuid
    cat /proc/sys/kernel/random/uuid
    mkpasswd                             # 需要先安装 expect ; yum install expect -y
        l 总长度
        d 数字个数
        c 小写字母个数
        C 大写字母个数
        s 特殊字符个数
    
    # 示例:
    [root@m01 ~]# mkpasswd -l 20 -d 17 -C 1 -c 1 -s 1
    1194S1242h756%909877
    
        
    # 获取到随机10个小写字母
    [root@m01 ~]# echo "OLDBOY$RANDOM"
    OLDBOY31600
    [root@m01 ~]# echo "OLDBOY$RANDOM"|md5sum
    2b33f154112a2f371beba1600d24f246  -
    [root@m01 ~]# echo "OLDBOY$RANDOM"|md5sum|tr 0-9 a-j
    icfafgebagjaajeieifeifabgfhfeegj  -
    [root@m01 ~]# echo "OLDBOY$RANDOM"|md5sum|tr 0-9 a-j |cut -c 2-11
    afbagebbdf            # 获取到随机10个小写字母
    [root@m01 ~]# 
    
    [root@m01 ~]# mkpasswd -l 10 -d 0 -C 0 -c 10 -s 0        # 获取到随机10个小写字母
    tkbviqfovu
    [root@m01 ~]#
    
    
    echo "OLDBOY$RANDOM"|md5sum|tr 0-9 a-j |cut -c 2-11
        echo "123456" | md5sum                    # 查看一个字符串的md5值
        cat file | tr [0-9] [a-j]                 # 把文件中的数字0-9替换为a-j
        cut -c 2-11                                # -c参数表示 仅显示行中指定范围的字符
    
    # 示例代码:
    [root@m01 cases]# cat case01.sh
    #!/bin/bash
    ##############################################################
    # File Name: case01.sh
    # Version: V1.0
    # Author: neo
    # Organization: anonymous
    # Created Time : 2019-07-04 11:15:30
    # Description:
    ##############################################################
    path=/neo
    [ -d $path ] || mkdir -p $path      # 如果 /neo 目录不存在则创建
    
    for n in {1..10}
    do
        random=`mkpasswd -l 10 -d 0 -C 0 -c 10 -s 0`
        touch $path/${random}_neo.html
    done
    [root@m01 cases]# sh case01.sh
    [root@m01 neo]# ll
    total 0
    -rw-r--r-- 1 root root 0 Jul  4 11:23 hqxdsueipv_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 jpiauceiiy_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 lagtetdxnu_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 ogkstnleki_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 qkljrkpckc_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 rpslndkrjc_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 snvcqbwlko_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 tuwsslvcgn_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 tzxismkjka_neo.html
    -rw-r--r-- 1 root root 0 Jul  4 11:23 wlaroblbvi_neo.html
    [root@m01 neo]# 

    案例2:批量改名特殊案例 

    将以上案例1中结果文件名中的 neo 字符串全部改成 Neomaple,最好用 for 循环实现并且将扩展名html全部改成大写

    参考如下:

    # 方式一:for 循环
    [root@m01 cases]# cat case02.sh
    #!/bin/bash
    for file in `ls /neo/*.html`
    do
        mv $file /${file/neo.html/Neomaple.HTML}
    done
    [root@m01 cases]# 
    
    # 方式二:awk 
    [root@m01 neo]# ls *.html|awk -F "neo.html" '{print "mv",$0,$1"Neomaple.HTML"}'
    mv dbizjjvosl_neo.html dbizjjvosl_Neomaple.HTML
    mv ezoiojifzy_neo.html ezoiojifzy_Neomaple.HTML
    mv fanspikyqs_neo.html fanspikyqs_Neomaple.HTML
    mv hmvkxpoyru_neo.html hmvkxpoyru_Neomaple.HTML
    mv hymssbshwu_neo.html hymssbshwu_Neomaple.HTML
    mv kgavlirhts_neo.html kgavlirhts_Neomaple.HTML
    mv khxcbyrnnt_neo.html khxcbyrnnt_Neomaple.HTML
    mv ntgtztpzsp_neo.html ntgtztpzsp_Neomaple.HTML
    mv pfykhbwgyk_neo.html pfykhbwgyk_Neomaple.HTML
    mv sybwbmnmyh_neo.html sybwbmnmyh_Neomaple.HTML
    [root@m01 neo]# ls *.html|awk -F "neo.html" '{print "mv",$0,$1"Neomaple.HTML"}'|bash
        
    # 方式三:rename
    [root@m01 neo]# rename "neo.html" "Neomaple.HTML" *.html    # 把 neo.html 改成 Neomaple.HTML ;*.html 表示针对 以 html结尾的文件

    案例3:批量创建特殊要求用户案例

    批量创建10个系统帐号 neo01 - neo10 并设置密码(密码为随机数 ,要求字符和数字等混合)

    # 分析:
    1) 生成01~10的序列:
            echo {01..10}
            seq -w 10
    2) 随机数: 
            openssl rand -base64 10
    3) 创建用户和密码:
            useradd neo01                    # 创建用户
            # 设置密码方法1:
            echo 密码 |passwd --stdin 用户名    
            # 设置密码方法2:
            chpasswd 命令
                chpasswd 设置密码时,用户名和密码要遵守这种格式: 用户名:密码
    4) for 循环
    
    # 方式一:
    [root@m01 cases]# cat case03.sh
    #!/bin/bash
    for n in {01..10}
    do
        passwd=`openssl rand -base64 10`    # 要把随机密码保存到变量中
        useradd neo$n
        echo $passwd|passwd --stdin neo$n
        echo -e "neo$n	$passwd" >>/tmp/user.list   # 把密码保存到文件中; echo -e 的作用是 解析 	
    done
    [root@m01 cases]# sh case03.sh
    Changing password for user neo01.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo02.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo03.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo04.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo05.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo06.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo07.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo08.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo09.
    passwd: all authentication tokens updated successfully.
    Changing password for user neo10.
    passwd: all authentication tokens updated successfully.    
    [root@m01 cases]# cat /tmp/user.list 
    neo01    pFvlvG0NXpIvYg==
    neo02    UPRO/U7uTxnJNw==
    neo03    0xkAtO5U70ws5w==
    neo04    wXR+K7fl+8i5wA==
    neo05    7bt6b09wv5dw7Q==
    neo06    AUNPXdRaJ8NUTA==
    neo07    E+JPwENB7KXHUA==
    neo08    1lZylckuf8rNlg==
    neo09    ZD7qVwMfsPMvzg==
    neo10    B3EgYyb/swvDow==
    [root@m01 cases]# su - neo01
    [neo01@m01 ~]$ su - neo02
    Password: 
    [neo02@m01 ~]$ whoami
    neo02
    [neo02@m01 ~]$ 
    
    # 方式二:
    [root@m01 cases]# cat case0302.sh
    #!/bin/bash
    for n in `seq -w 11 15`
    do
        passwd=`openssl rand -base64 10`    # 要把随机密码保存到变量中
        useradd neo$n
        echo "neo$n:$passwd" >>/tmp/chpasswd.log    # 把用户名和密码以 用户名:密码 这种格式保存到 一个文件 chpasswd.log 中
    done
    
    chpasswd </tmp/chpasswd.log     # 把 /tmp/chpasswd.log 这个文件通过输出重定向 给 chpasswd 命令处理,由于 chpasswd.log 中是以 用户名:密码 格式保存的,所以 chpasswd 命令能直接处理
    [root@m01 cases]# sh case0302.sh
    [root@m01 cases]# cat /tmp/chpasswd.log 
    neo11:Ij76k7pbfyByZQ==
    neo12:lmCPKpKoUP/UOg==
    neo13:JNIfuo8wwXgEkA==
    neo14:QkBxlLf6mhQP+g==
    neo15:fbvtdTSu9yTySg==
    [root@m01 cases]# su - neo11
    [neo11@m01 ~]$ su - neo15
    Password: 
    [neo15@m01 ~]$ 
    
    
    # 方式三:
    [root@m01 cases]# cat case0303.sh
    #!/bin/bash
    . /etc/init.d/functions
    
    if [ $UID -ne 0 ]
    then
        action "only root can execute this script" /bin/false
        exit 1
    fi
    
    for n in {12..17}
    do
        passwd=`openssl rand -base64 10`
        if `! grep -w  "neo$n" /etc/passwd &>/dev/null`   # grep -w 表示精确匹配;grep 如果获取到相应结果,则grep命令的执行结果为0(真),反之则执行结果为1(假);if `命令表达式 &>/dev/null` 时是判断 命令表达式的执行结果是否为真(由于只看执行结果,此时加 &>/dev/null,否则 if 字符串 会报错)
        then
            #  表示换行符
            useradd neo$n &>/dev/null && 
            echo $passwd|passwd --stdin neo$n &>/dev/null && 
            echo -e "neo$n	$passwd" >>/tmp/user.list && 
            action "neo$n added successfully" /bin/true
        else
            action "neo$n exists already" /bin/false
        fi
    done
    [root@m01 cases]# sh case0303.sh
    neo12 exists already                                       [FAILED]
    neo13 exists already                                       [FAILED]
    neo14 exists already                                       [FAILED]
    neo15 exists already                                       [FAILED]
    neo16 added successfully                                   [  OK  ]
    neo17 added successfully                                   [  OK  ]
    [root@m01 cases]# 

    案例4: 扫描网络内存活主机案例

    写一个Shell脚本,判断 10.0.0.0/24 网络里,当前在线的IP有哪些

    1) ping 命令
    [root@m01 ~]# ping -c 2 -i 1 -w 3 10.0.0.61
    PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
    64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.079 ms
    64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.052 ms
    
    --- 10.0.0.61 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1005ms
    rtt min/avg/max/mdev = 0.052/0.065/0.079/0.015 ms
    
    ping 命令:
        -c   ping 的次数
        -i   ping 时间间隔(s)
        -w   ping 的总共的时长(s)
    
    2) nmap命令
    nmap -sP 10.0.0.0/24
    
    
    # 方式一: ping
    [root@m01 cases]# cat case0401.sh
    #!/bin/bash
    ##############################################################
    # File Name: case0401.sh
    # Version: V1.0
    # Author: neo
    # Organization: anonymous
    # Created Time : 2019-07-05 00:54:20
    # Description:
    ##############################################################
    for n in {1..254}
    do
        {
        if `ping -c 1 -w 3 10.0.0.$n &>/dev/null`   # ping 通为true
        then
            echo "10.0.0.$n is up"
        else
            echo "10.0.0.$n is down"
        fi
        } &  # {} & 表示 {} 里面的代码并发执行;此处表示批量 ping
    done
    [root@m01 cases]# 
    
    # 方式二: nmap
    [root@m01 ~]# nmap -sP 10.0.0.0/24
    
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-07-05 01:34 CST
    Nmap scan report for 10.0.0.61
    Host is up.
    Nmap scan report for 10.0.0.253
    Host is up (0.0032s latency).
    MAC Address: 00:50:56:C0:00:08 (VMware)
    Nmap scan report for 10.0.0.254
    Host is up (0.00081s latency).
    MAC Address: 00:50:56:EA:79:FB (VMware)
    Nmap done: 256 IP addresses (3 hosts up) scanned in 8.36 seconds
    [root@m01 ~]# nmap -sP 10.0.0.0/24|awk '/Nmap scan report for/{print $NF}'      # $NF 表示的最后一个Field(列),即输出最后一个字段的内容
    10.0.0.61
    10.0.0.253
    10.0.0.254
    [root@m01 ~]# 

    案例5:数据库的备份

    # 案例5.1:MySQL 数据库分库备份
    # 常规方法: 
    mysqldump -B oldboy oldgirl test|gzip >bak.sql.gz        # --databases, -B: 用于备份多个数据库,如果没有该选项,mysqldump把第一个名字参数作为数据库名,后面的作为表名。使用该选项,mysqldum把每个名字都当作为数据库名。
    
    # 分库备份:
    mysqldump -B oldboy |gzip >bak.sql.gz
    mysqldump -B oldgirl |gzip >bak.sql.gz
    mysqldump -B test|gzip >bak.sql.gz
    
    # 相关命令:
    mysqldump -uroot -p123456 db_name table1 table2 |gzip >bak.sql.gz  # mysqldump 命令中只有第一个参数 db_name 是库名,后面跟的所有参数都是表名
    
    # 命令操作如下:
    [root@db01 application]# /application/mysql/bin/mysql -uroot -p123456 -e "show databases;"        # 命令行获取数据库名
    Warning: Using a password on the command line interface can be insecure.
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    | wordpress          |
    +--------------------+
    [root@web01 ~]# /application/mysql/bin/mysql -uroot -p123456 -e "show databases;"|grep -v _schema    # 去掉包含 _schema 的数据库
    Warning: Using a password on the command line interface can be insecure.
    Database
    mysql
    test
    wordpress
    [root@web01 ~]# /application/mysql/bin/mysql -uroot -p123456 -e "show databases;"|grep -v _schema|sed 1d    # 去掉第一行的 Database
    Warning: Using a password on the command line interface can be insecure.
    mysql
    test
    wordpress
    [root@web01 ~]# /application/mysql/bin/mysql -uroot -p123456 -e "show databases;" 2>/dev/null|grep -v _schema|sed 1d    # 2>/dev/null 表示错误信息不输出
    mysql
    test
    wordpress
    [root@web01 ~]# 
    
    
    # 示例代码如下:
    [root@web01 cases]# cat backup-db.sh
    #/bin/bash
    path=/backup
    
    [ -d $path ] || mkdir -p $path
    
    for dbname in `/application/mysql/bin/mysql -uroot -p123456 -e "show databases;" 2>/dev/null |grep -v _schema|sed 1d`
    do
        /application/mysql/bin/mysqldump -uroot -p123456 -B $dbname|gzip  >$path/${dbname}_$(date +%F).sql.gz 2>/dev/null
    done
    [root@web01 cases]# sh backup-db.sh
    Warning: Using a password on the command line interface can be insecure.
    Warning: Using a password on the command line interface can be insecure.
    Warning: Using a password on the command line interface can be insecure.
    [root@web01 cases]# 
    
    [root@web01 backup]# ll
    total 372
    -rw-r--r-- 1 root root 179858 Jul  6 00:48 mysql_2019-07-06.sql.gz
    -rw-r--r-- 1 root root    517 Jul  6 00:48 test_2019-07-06.sql.gz
    -rw-r--r-- 1 root root 193084 Jul  6 00:48 wordpress_2019-07-06.sql.gz
    [root@web01 backup]# 
    
    
    # 案例5.2:MySQL 数据库分库分表备份
    # 相关命令:
    mysqldump oldboy test test1|gzip >bak.sql.gz
        # 1、 oldboy 库名
        # 2、 test、test1 都是表名
    
    [root@db01 ~]# /application/mysql/bin/mysql -uroot -p123456 -e "show tables from wordpress;"    # 命令行获取某个数据库下的表名
    Warning: Using a password on the command line interface can be insecure.
    +-----------------------+
    | Tables_in_wordpress   |
    +-----------------------+
    | wp_commentmeta        |
    | wp_comments           |
    | wp_links              |
    | wp_options            |
    | wp_postmeta           |
    | wp_posts              |
    | wp_term_relationships |
    | wp_term_taxonomy      |
    | wp_termmeta           |
    | wp_terms              |
    | wp_usermeta           |
    | wp_users              |
    +-----------------------+
    [root@web01 ~]# /application/mysql/bin/mysql -uroot -p123456 -e "show tables from wordpress;"|sed 1d
    Warning: Using a password on the command line interface can be insecure.
    wp_commentmeta
    wp_comments
    wp_links
    wp_options
    wp_postmeta
    wp_posts
    wp_term_relationships
    wp_term_taxonomy
    wp_termmeta
    wp_terms
    wp_usermeta
    wp_users
    [root@db01 ~]# 
    
    
    # 示例代码如下:
    [root@web01 cases]# cat backup-db-tb.sh
    #/bin/bash
    path=/backup
    
    [ -d $path ] || mkdir -p $path
    mysql="/application/mysql/bin/mysql -uroot -p123456"
    mysqldump="/application/mysql/bin/mysqldump -uroot -p123456"
    
    for dbname in `$mysql -e "show databases;" 2>/dev/null |grep -v _schema|sed 1d`    # 先获取数据库的名字
    do
        for tname in `$mysql -e "show tables from $dbname;" 2>/dev/null |sed 1d`       # 再获取表名
        do
        if [ $dbname = "mysql" ]
        then
            $mysqldump --skip-lock-tables $dbname $tname|gzip  >$path/${dbname}-${tname}_$(date +%F).sql.gz 2>/dev/null  # 跳过 mysql 这个数据库 中的锁表
        else
                $mysqldump  $dbname $tname|gzip  >$path/${dbname}-${tname}_$(date +%F).sql.gz 2>/dev/null
        fi
        done
    done
    [root@web01 cases]# 

    案例6:ssh免密密钥批量分发文件脚本

    有3台机器,61、7 和 8,采用ssh免密密钥实现从61主机到其它两台机器无密码登陆后,写脚本实现从61主机批量分发任意文件到另外两台机器上任意目录下

    # 先生成、分发密钥:
    [root@m01 ~]# ssh-keygen -t dsa                    # 生成密钥
    Generating public/private dsa key pair.
    Enter file in which to save the key (/root/.ssh/id_dsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_dsa.
    Your public key has been saved in /root/.ssh/id_dsa.pub.
    The key fingerprint is:
    91:05:b6:09:9a:eb:cd:18:3f:b6:cf:b9:dd:ec:ef:fd root@m01
    The key's randomart image is:
    +--[ DSA 1024]----+
    |      . o..      |
    |     o o =       |
    |    o   =        |
    |     .   .       |
    |    o   S        |
    |   . *           |
    |    o *          |
    |     . + o o   . |
    |      ..=...+oo E|
    +-----------------+
    [root@m01 ~]# ll ~/.ssh/
    total 8
    -rw------- 1 root root 668 Jul  6 10:53 id_dsa
    -rw-r--r-- 1 root root 598 Jul  6 10:53 id_dsa.pub
    -rw-r--r-- 1 root root   0 Jul  6 10:13 known_hosts
    [root@m01 ~]# ll ~/.ssh/
    total 8
    -rw------- 1 root root 668 Jul  6 10:53 id_dsa
    -rw-r--r-- 1 root root 598 Jul  6 10:53 id_dsa.pub
    -rw-r--r-- 1 root root   0 Jul  6 10:13 known_hosts
    [root@m01 ~]# for n in 7 8;do ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.$n;done        # 分发公钥: ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.7
    The authenticity of host '172.16.1.7 (172.16.1.7)' can't be established.
    RSA key fingerprint is 22:07:4d:36:3c:5e:eb:46:80:a2:ef:40:45:8c:93:46.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '172.16.1.7' (RSA) to the list of known hosts.
    root@172.16.1.7's password: 
    Now try logging into the machine, with "ssh '172.16.1.7'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    
    The authenticity of host '172.16.1.8 (172.16.1.8)' can't be established.
    RSA key fingerprint is 22:07:4d:36:3c:5e:eb:46:80:a2:ef:40:45:8c:93:46.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '172.16.1.8' (RSA) to the list of known hosts.
    root@172.16.1.8's password: 
    Now try logging into the machine, with "ssh '172.16.1.8'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    
    [root@m01 ~]# for n in 7 8;do echo 172.16.1.$n && ll ~/.ssh/ ;done
    172.16.1.7
    total 12
    -rw------- 1 root root 668 Jul  6 10:53 id_dsa
    -rw-r--r-- 1 root root 598 Jul  6 10:53 id_dsa.pub
    -rw-r--r-- 1 root root 784 Jul  6 11:00 known_hosts
    172.16.1.8
    total 12
    -rw------- 1 root root 668 Jul  6 10:53 id_dsa
    -rw-r--r-- 1 root root 598 Jul  6 10:53 id_dsa.pub
    -rw-r--r-- 1 root root 784 Jul  6 11:00 known_hosts
    [root@m01 ~]#
    
    
    # 示例代码如下:
    [root@m01 cases]# cat case06-distribute-file.sh 
    #!/bin/bash
    ##############################################################
    # File Name: case06-distribute-file.sh
    # Version: V1.0
    # Author: neo
    # Organization: anonymous
    # Created Time : 2019-07-06 11:09:01
    # Description:
    ##############################################################
    . /etc/init.d/functions
    
    if [ $# -ne 2 ]
    then
        echo "Usage:$0 localdir remotedir"
        exit 1
    fi
    
    for n in 7 8 9
    do
        scp -rp $1 172.16.1.$n:$2 &>/dev/null
        if [ $? -eq 0 ]
        then
            action "distribute 172.16.1.$n successfully" /bin/true
        else
            action "distribute 172.16.1.$n failed" /bin/false
        fi
    done
    [root@m01 cases]# sh case06-distribute-file.sh
    Usage:case06-distribute-file.sh localdir remotedir
    [root@m01 cases]# sh case06-distribute-file.sh /neo /neozheng/
    distribute 172.16.1.7 successfully                         [  OK  ]
    distribute 172.16.1.8 successfully                         [  OK  ]
    distribute 172.16.1.9 failed                               [FAILED]            #  失败原因是 9主机没开
    [root@m01 cases]# 

    案例7:破解 RANDOM 随机数案例

    已知下面的字符串是通过 RANDOM 随机数变量 md5sum 后,再截取一部分连续字符串的结果,请破解这些字符串对应的使用 md5sum 处理前的 RANDOM 对应的数字
    21029299
    00205d1c
    a3da1677
    1f6d12dd
    890684b
    
    # 分析:
    1) RANDOM随机数的范围 0~32767,就需要把 0~32767 都用 md5sum 加密  >md5.log
    2) 比较:grep "1f6d12dd" md5.log |wc -l
    
    
    [root@m01 ~]# array=(
    > 21029299
    > 00205d1c
    > a3da1677
    > 1f6d12dd
    > 890684b
    > )
    [root@m01 ~]# echo ${array[*]}
    21029299 00205d1c a3da1677 1f6d12dd 890684b
    [root@m01 ~]# echo ${array[*]}|tr " " "|"
    21029299|00205d1c|a3da1677|1f6d12dd|890684b        # 把 数组中的元素以 “或”符号 | 分隔
    [root@m01 ~]#
        
        
    # 示例代码如下:
    [root@m01 cases]# cat case07-decode-random.sh
    #!/bin/bash
    ##############################################################
    # File Name: case07-decode-random.sh
    # Version: V1.0
    # Author: neo
    # Organization: anonymous
    # Created Time : 2019-07-06 12:54:04
    # Description:
    ##############################################################
    array=(
    21029299
    00205d1c
    a3da1677
    1f6d12dd
    890684b
    )
    
    function Funcmd5(){
        for n in {1..32767}
        do
            echo -e "$n	`echo $n|md5sum`" >>/tmp/md5.log &
        done
    }
    
    function FuncJudge(){
        char=`echo ${array[*]}|tr " " "|"`
        egrep $char /tmp/md5.log
    }
    
    function main(){
        Funcmd5
        FuncJudge
    }
    main
    [root@m01 cases]# sh case07-decode-random.sh
    1346    00205d1cbbeb97738ad5bbdde2a6793d  -
    7041    1f6d12dd61b5c7523f038a7b966413d9  -
    10082    890684ba3685395c782547daf296935f  -
    25345    a3da1677501d9e4700ed867c5f33538a  -
    25667    2102929901ee1aa769d0f479d7d78b05  -
    [root@m01 cases]# 

    案例8:批量检查多个网站地址是否正常

    批量检查多个网站地址是否正常
    要求:
    1、使用 shell 数组方法实现,检测策略尽量模拟用户访问 。
    2、每 10 秒钟做一次所有的检测,无法访问的输出报警。
    3、待检测的地址如下
    http://blog.oldboyedu.com
    http://blog.etiantian.org
    http://oldboy.blog.51cto.com
    http://10.0.0.7
        
    
    # 示例代码如下:
    [root@m01 cases]# cat case08-checkurl.sh
    #!/bin/bash
    ##############################################################
    # File Name: case08-checkurl.sh
    # Version: V1.0
    # Author: neo
    # Organization: anonymous
    # Created Time : 2019-07-06 19:03:48
    # Description:
    ##############################################################
    . /etc/init.d/functions
    
    array=(
    http://blog.oldboyedu.com
    http://blog.etiantian.org
    http://oldboy.blog.51cto.com
    http://10.0.0.7
    )
    
    function CheckUrl(){
        wget -t 2 -T 5 -o /dev/null -q $1
        if [ $? -eq 0 ]
        then
            action "$1 is up" /bin/true
        else
            action "$1 is down" /bin/false
        fi
    }
    
    function HandleCheck(){
        for url in ${array[*]}
        do
            CheckUrl $url
        done
    }
    
    function main(){
        while true
        do
            HandleCheck
            sleep 10
        done
    }
    main
    [root@m01 cases]# sh case08-checkurl.sh
    http://blog.oldboyedu.com is up                            [  OK  ]
    http://blog.etiantian.org is down                          [FAILED]
    http://oldboy.blog.51cto.com is up                         [  OK  ]
    http://10.0.0.7 is down                                    [FAILED]
    ...
    [root@m01 cases]# 

    案例10:开发MySQL服务启动停止脚本

    要求:用函数、case语句和if语句等实现

    # 解答:
        /etc/init.d/mysqld {start|stop|restart}
        
    # 分析:
        1. 启动:
            /bin/bash mysqld_safe --user=mysql &
            
        2. 停止:
            mysqladmin -u用户名 -p密码 shutdown
            killall
            pkill
            kill pid (推荐)
    
    
    # 示例代码如下:
    [root@web01 cases]# cat mysqld.sh
    #!/bin/bash
    # chkconfig: 2345 20 80
    # description: mysql start and stop script
    ##############################################################
    # File Name: mysqld.sh
    # Version: V1.0
    # Author: neo
    # Organization: anonymous
    # Created Time : 2019-07-07 13:44:57
    # Description:
    ##############################################################
    lockfile=/var/lock/subsys/mysqld                                         # 先定义一个锁文件
    mysqld_pid_file_path="/application/mysql/data/${HOSTNAME}.pid"          # 定义 mysql 进程号的路径
    
    . /etc/init.d/functions     
    
    function start(){
        /bin/sh /application/mysql/bin/mysqld_safe --user=mysql &>/dev/null &
        retval=$?                       
        if [ $retval -eq 0 ]
        then
            action "mysql startup ok" /bin/true    
            touch $lockfile                        # 启动成功后,就创建一个锁文件
            return $retval                    
        else
            action "mysql startup failed" /bin/false
            return $retval
        fi
    }
    
    function stop(){
        if test -s $mysqld_pid_file_path                    # -s ---> 判断文件是否存在且不为空
        then
            mysqld_pid=`cat $mysqld_pid_file_path`
            if (kill -0 $mysqld_pid &>/dev/null)      # kill -0 进程号  ---> 判断该进程号对应的服务是否存在;存在则echo $?返回0,不存在返1
            then
                kill $mysqld_pid 
                retval=$?
                if [ $retval -eq 0 ]
                then
                    action "mysql stop ok" /bin/true
                    
    m -f $lockfile           # 停止成功后就删除锁文件
                    return $retval
                else
                    action "mysql stop failed" /bin/false
                    return $retval
                fi
    
            else        # 此种情况是:$mysqld_pid 对应的 mysqld 服务不存在
                action "mysqld service is not running" 
                return 2
            fi
                
        else    # 此种情况是: $mysqld_pid_file_path 对应的路径不存在 
            action "$mysqld_pid_file_path not exist, or mysqld not startup" /bin/false
            return 3
        fi
    }
    
    case "$1" in 
        start)
            start
            retval=$?               # 接收 start 的执行结果并赋值给 retval 作为返回值
            ;;
        stop)
            stop
            retval=$?
            ;;
        restart)
            stop && sleep 1 && start
            retval=$?
            ;;
        *)
            echo "Usage:$0 {start|stop|restart}"
            exit 1
    esac
    exit $retval                    # 把上面的执行结果返回给脚本外面
    [root@web01 cases]#
    
    # mysqld.sh 脚本测试
    [root@web01 cases]# sh mysqld.sh 
    Usage:mysqld.sh {start|stop|restart}
    [root@web01 cases]# sh mysqld.sh start
    mysql startup ok                                           [  OK  ]
    [root@web01 cases]# lsof -i:3306
    COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    mysqld  4084 mysql   16u  IPv6  19781      0t0  TCP *:mysql (LISTEN)
    [root@web01 cases]# sh mysqld.sh restart
    mysql stop ok                                              [  OK  ]
    mysql startup ok                                           [  OK  ]
    [root@web01 cases]# lsof -i:3306
    COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    mysqld  4224 mysql   16u  IPv6  20084      0t0  TCP *:mysql (LISTEN)
    [root@web01 cases]# sh mysqld.sh stop
    mysql stop ok                                              [  OK  ]
    [root@web01 cases]# lsof -i:3306
    [root@web01 cases]# 
    
    # 给自写的 mysqld.sh 脚本 加执行权限
    [root@web01 cases]# cp mysqld.sh /etc/init.d/mysqld_neo
    [root@web01 cases]# ll /etc/init.d/mysqld_neo
    -rw-r--r-- 1 root root 2521 Jul  7 14:29 /etc/init.d/mysqld_neo
    [root@web01 cases]# chmod +x /etc/init.d/mysqld_neo
    [root@web01 cases]# ll /etc/init.d/mysqld_neo
    -rwxr-xr-x 1 root root 2521 Jul  7 14:29 /etc/init.d/mysqld_neo
    [root@web01 cases]# 

    案例11:单词及字母去重排序案例

    用shell处理以下内容
    1、按单词出现频率降序排序
    2、按字母出现频率降序排序
    
    the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation, by oldboy training.
    
    # 按单词出现频率降序排序:
    # 方法一:
    [root@m01 ~]# a="the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation, by oldboy training."
    [root@m01 ~]# echo $a|tr " ,." "
    "|awk '!/^$/{h[$1]++}END{for(word in h) print h[word],word}'|sort -rn
    2 the
    2 support
    2 squid
    2 and
    1 users
    1 training
    1 to
    1 sections
    1 resources
    1 provides
    1 project
    1 Please
    1 oldboy
    1 of
    1 number
    1 more
    1 installations
    1 infomation
    1 implement
    1 for
    1 documentation
    1 design
    1 by
    1 browse
    1 assist
    1 a
    [root@m01 ~]# 
    
    # 方法二:
    [root@m01 ~]# sentence="the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation, by oldboy training."
    [root@m01 ~]# echo $sentence |awk -F "[ ,.]+" '{for(i=1;i<=NF;i++)array[$i]++}END{for(key in array)print array[key],key}'|sort -rn
    2 the
    2 support
    2 squid
    2 and
    1 users
    1 training
    1 to
    1 sections
    1 resources
    1 provides
    1 project
    1 Please
    1 oldboy
    1 of
    1 number
    1 more
    1 installations
    1 infomation
    1 implement
    1 for
    1 documentation
    1 design
    1 by
    1 browse
    1 assist
    1 a
    1 
    [root@m01 ~]#
    
    # 注意: awk 能以 空 作为 分隔符
    
    # 按字母出现频率降序排序:
    # 方法一:
    [root@m01 ~]# sentence="the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation, by oldboy training."
    [root@m01 ~]# echo $sentence |grep -o "[^ ,.]"|awk '{h[$1]++}END{for(char in h) print h[char],char}'|sort -rn
    19 s
    18 o
    17 e
    15 t
    14 n
    14 i
    12 r
    10 a
    8 u
    8 d
    7 p
    6 m
    5 l
    4 c
    4 b
    3 f
    2 y
    2 q
    2 h
    2 g
    1 w
    1 v
    1 P
    1 j
    [root@m01 ~]# 
    
    # grep -o 表示 只输出匹配的内容:
        grep -o "[^ ,.]"  --->  [^] 表示 只输出匹配的选项,所以 该命令的意思是: 排除 空格 逗号 和 点
    
    # 方法二: 
    # 注意: awk 可以用空作为分隔符
    [root@m01 ~]# echo $sentence|sed 's#[ ,.]##g'        # 利用 sed 把 空格 逗号 和 点 替换为 空
    thesquidprojectprovidesanumberofresourcestoassistusersdesignimplementandsupportsquidinstallationsPleasebrowsethedocumentationandsupportsectionsformoreinfomationbyoldboytraining
    [root@m01 ~]# echo $sentence |sed "s#[ ,.]##g"|awk -F "" '{for(i=1;i<=NF;i++)array[$i]++}END{for(key in array)print array[key],key}'
    8 u
    2 h
    1 v
    14 i
    1 w
    1 P
    1 j
    2 y
    5 l
    6 m
    14 n
    10 a
    4 b
    18 o
    4 c
    7 p
    8 d
    2 q
    12 r
    17 e
    3 f
    19 s
    2 g
    15 t
    [root@m01 ~]# 
    
    # awk -F ""  ---> 表示 以空作为分隔符
    # {for(i=1;i<=NF;i++)array[$i]++}  ---> 把 echo $sentence |sed "s#[ ,.]##g" 得到的那个字符串进行 横向处理,即把每个字母作为一列;横向处理字符串从来得到一个数组 array;i 表示第i列
    
    # 最终命令:
    [root@m01 ~]# echo $sentence |sed "s#[ ,.]##g"|awk -F "" '{for(i=1;i<=NF;i++)array[$i]++}END{for(key in array)print array[key],key}'|sort -rn
    19 s
    18 o
    17 e
    15 t
    14 n
    14 i
    12 r
    10 a
    8 u
    8 d
    7 p
    6 m
    5 l
    4 c
    4 b
    3 f
    2 y
    2 q
    2 h
    2 g
    1 w
    1 v
    1 P
    1 j
    [root@m01 ~]# 
  • 相关阅读:
    分分钟搞定Python之排序与列表
    分分钟搞定Python之排序与列表
    联系我
    联系我
    联系我
    联系表单 1_copy
    联系表单 1_copy
    联系表单 1_copy
    联系表单 1
    联系表单 1
  • 原文地址:https://www.cnblogs.com/neozheng/p/11131462.html
Copyright © 2011-2022 走看看