前天,在群里看到有一位读者分享了几道 Shell 脚本实例题目,索性看到了,不如来写写巩固下基础知识,如下:
1、 并发从数台机器中获取 hostname,并记录返回信息花费的时长,重定向到一个文件 hostname.txt 中,在全部完成后输出花费时长最短的那台机器的 CPU 信息。
#!bin/bash# 所以主机,以空格分隔ALL_HOSTS=(IP 地址 IP 地址)for host in ${ALL_HOSTS[*]}do{start_time=$(date +\'%s\')ssh $host \"hostname\" &>/dev/nullsleep 2stop_time=$(date +\'%s\')time_consuming=$((stop_time-start_time))echo \"$host: $time_consuming\" >>hostname.txt}&donewaithost=$(sort -n -k 2 hostname.txt | head -1 | awk -F\':\' \'{print $1}\')ssh $host \"top -b -n 1\"
2、 统计 /proc 目类下 Linux 进程相关数量信息,输出总进程数,running 进程数,stoped 进程数,sleeing 进程数,zombie 进程数。
输出所有 zombie 的进程到 zombie.txt 杀死所有 zombie 进程。
#!/bin/bashALL_PROCESS=$(ls /proc/ | egrep \'[0-9]+\')running_count=0stoped_count=0sleeping_count=0zombie_count=0for pid in ${ALL_PROCESS[*]}dotest -f /proc/$pid/status && state=$(egrep \"State\" /proc/$pid/status | awk \'{print $2}\')case \"$state\" inR)running_count=$((running_count+1));;T)stoped_count=$((stoped_count+1));;S)sleeping_count=$((sleeping_count+1));;Z)zombie_count=$((zombie_count+1))echo \"$pid\" >>zombie.txtkill -9 \"$pid\";;esacdoneecho -e \"total: $((running_count+stoped_count+sleeping_count+zombie_count))\\nrunning: $running_count\\nstoped: $stoped_count\\nsleeping: $sleeping_count\\nzombie: $zombie_count\"
3、 把当前目录(包含子目录)下所有后缀为 ".sh" 的文件后缀变更为 ".shell",之后删除每个文件的第二行。
#!/bin/bashALL_SH_FILE=$(find . -type f -name \"*.sh\")for file in ${ALL_SH_FILE[*]}dofilename=$(echo $file | awk -F\'.sh\' \'{print $1}\')new_filename=\"${filename}.shell\"mv \"$file\" \"$new_filename\"sed -i \'2d\' \"$new_filename\"done
4、 判断目录 /tmp/jstack 是否存在,不存在则新建一个目录,若存在则删除目录下所有内容。
每隔 1 小时打印 inceptor server 的 jstack 信息,并以 jstack_{当前时间}命名文件,每当目录下超过 10 个文件后,删除最旧的文件。
#!/bin/bashDIRPATH=\'/tmp/jstack\'CURRENT_TIME=$(date +\'%F\'-\'%H:%M:%S\')if [ ! -d \"$DIRPATH\" ];thenmkdir \"$DIRPATH\"elserm -rf \"$DIRPATH\"/*ficd \"$DIRPATH\"while truedosleep 3600# 这里需要将inceptor改后自己的java进程名称pid=$(ps -ef | grep \'inceptor\' | grep -v grep | awk \'{print $2}\')jstack $pid >> \"jstack_${CURRENT_TIME}\"dir_count=$(ls | wc -l)if [ \"$dir_count\" -gt 10 ];thenrm -f $(ls -tr | head -1)fidone
5、 从 test.log 中截取当天的所有 gc 信息日志,并统计 gc 时间的平均值和时长最长的时间。
#!/bin/bashawk \'{print $2}\' hive-server2.log | tr -d \':\' | awk \'{sum+=$1} END {print \"avg: \", sum/NR}\' >>capture_hive_log.logawk \'{print $2}\' hive-server2.log | tr -d \':\' | awk \'{max = 0} {if ($1+0 > max+0) max=$1} END {print \"Max: \", max}\'>>capture_hive_log.log
6、 查找 80 端口请求数最高的前 20 个 IP 地址,判断中间最小的请求数是否大于 500,如大于 500,则输出系统活动情况报告到 alert.txt,如果没有,则在 600s 后重试,直到有输出为止。
#!/bin/bashstate=\"true\"while $statedoSMALL_REQUESTS=$(netstat -ant | awk -F\'[ :]+\' \'/:22/{count[$4]++} END {for(ip in count) print count[ip]}\' | sort -n | head -20 | head -1)if [ \"$SMALL_REQUESTS\" -gt 500 ];thensar -A > alert.txtstate=\"false\"elsesleep 6continuefidone
7、 将当前目录下大于 10K 的文件转移到 /tmp 目录,再按照文件大小顺序,从大到小输出文件名。
#!/bin/bash# 目标目录DIRPATH=\'/tmp\'# 查看目录FILEPATH=\'.\'find \"$FILEPATH\" -size +10k -type f | xargs -i mv {} \"$DIRPATH\"ls -lS \"$DIRPATH\" | awk \'{if(NR>1) print $NF}\'
以上,就是今天分享的 7 个实用的 Shell 脚本案例。
希望大家能通过这些案例能够学以致用,结合自身的实际场景进行运用,从而提高自己的工作效率。
作者:养乐多 编辑:JackTian
来源:公众号「杰哥的IT之旅」
ID:Jake_Internet
原文链接:7 个非常实用的 Shell 拿来就用脚本实例!