案例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 ~]#