前天在群里看到一位读者分享了几个Shell脚本题目的例子。我刚看到。为啥我不写,巩固一下基础知识,如下:1.并发从几台机器获取hostname,并记录返回信息所花费的时间重定向到一个文件hostname.txt,以及机器的CPU信息全部完成后以最短时间输出。#!bin/bash#所以hosts,用空格隔开ALL_HOSTS=(IP地址IP地址)forhostin${ALL_HOSTS[*]}do{start_time=$(date+'%s')ssh$host"hostname"&>/dev/nullsleep2stop_time=$(date+'%s')time_consuming=$((stop_time-start_time))echo"$host:$time_consuming">>hostname.txt}&donewaithost=$(sort-n-k2hostname.txt|head-1|awk-F':''{print$1}')ssh$host"top-b-n1"2.统计/proc目录下Linux进程数信息,输出进程总数,数量运行进程数、停止进程数、休眠进程数、僵尸进程数。将所有僵尸进程输出到zombie.txt杀死所有僵尸进程。#!/bin/bashALL_PROCESS=$(ls/proc/|egrep'[0-9]+')running_count=0stopped_count=0sleeping_count=0zombie_count=0forpidin${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)stopped_count=$((stopped_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+stopped_count+sleeping_count+zombie_count))\nrunning:$running_count\nstoped:$stopped_count\nsleeping:$sleeping_count\nzombie:$zombie_count"3.将当前目录(包括子目录)置于将所有后缀为“.sh”的文件的后缀改为“.shell”,然后删除每个文件的第二行。#!/bin/bashALL_SH_FILE=$(find.-typef-name"*.sh")forfilein${ALL_SH_FILE[*]}dofilename=$(echo$file|awk-F'.sh''{print$1}')new_filename="${filename}.shell"mv"$file""$new_filename"sed-i'2d'"$new_filename"done4.判断/tmp/jstack目录是否存在。如果不存在,则创建一个新目录。如果存在则删除该目录下的所有内容。每小时打印一次inceptorserver的jstack信息,文件命名为jstack_${currenttime}。当目录中的文件超过10个时,删除最旧的文件。#!/bin/bashDIRPATH='/tmp/jstack'CURRENT_TIME=$(date+'%F'-'%H:%M:%S')if[!-d"$DIRPATH"];thenmkdir"$DIRPATH"elserm-rf"$DIRPATH"/*ficd"$DIRPATH"whiletruedosleep3600#这里需要把inceptor改成你的java进程名pid=$(ps-ef|grep'inceptor'|grep-vgrep|awk'{print$2}')jstack$pid>>"jstack_${CURRENT_TIME}"dir_count=$(ls|wc-l)if["$dir_count"-gt10];thenrm-f$(ls-tr|head-1)fidone5。从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.log6。查找80端口请求次数最多的前20个IP地址,判断中间最小的请求次数是否大于500,如果大于500,输出系统活动报告到alert.txt。如果没有,则600s后重试,直到有输出。#!/bin/bashstate="true"而$statedoSMALL_REQUESTS=$(netstat-ant|awk-F'[:]+''/:22/{count[$4]++}END{for(ipincount)printcount[ip]}'|sort-n|head-20|head-1)if["$SMALL_REQUESTS"-gt500];thensar-A>alert.txtstate="false"elsesleep6continuefidone7。将当前目录下大于10K的文件转移到/tmp目录下,然后按照文件大小从大到小的顺序输出文件名。#!/bin/bash#目标目录DIRPATH='/tmp'#查看目录FILEPATH='.'find"$FILEPATH"-size+10k-typef|xargs-imv{}"$DIRPATH"ls-lS"$DIRPATH以上《|awk'{if(NR>1)print$NF}'就是今天分享的7个shell脚本实战案例。希望大家能够通过这些案例学以致用,并结合自己的实际场景进行应用,从而提高工作效率。
