7 个非常实用的 Shell 拿来就用脚本实例!

百家 作者:CSDN 2021-04-19 14:57:52


作者 | 养乐多? ? ? ?责编 | 欧阳姝黎

前天,在群里看到有一位读者分享了几道 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/null
????sleep?2
????stop_time=$(date?+'%s')
????time_consuming=$((stop_time-start_time))
????echo?"$host:?$time_consuming"?>>hostname.txt
}&
done

wait

host=$(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/bash

ALL_PROCESS=$(ls?/proc/?|?egrep?'[0-9]+')

running_count=0
stoped_count=0
sleeping_count=0
zombie_count=0

for?pid?in?${ALL_PROCESS[*]}
do
????test?-f?/proc/$pid/status?&&?state=$(egrep?"State"?/proc/$pid/status?|?awk?'{print?$2}')
????case?"$state"?in
????????R)
????????????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.txt
????????????kill?-9?"$pid"
????????;;
????esac
done


echo?-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/bash


ALL_SH_FILE=$(find?.?-type?f?-name?"*.sh")
for?file?in?${ALL_SH_FILE[*]}
do
????filename=$(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/bash


DIRPATH='/tmp/jstack'
CURRENT_TIME=$(date?+'%F'-'%H:%M:%S')

if?[?!?-d?"$DIRPATH"?];then
????mkdir?"$DIRPATH"
else
????rm?-rf?"$DIRPATH"/*
fi

cd?"$DIRPATH"

while?true
do
????sleep?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?];then
???????rm?-f?$(ls?-tr?|?head?-1)
????fi
done

5、从 test.log 中截取当天的所有 gc 信息日志,并统计 gc 时间的平均值和时长最长的时间。

#!/bin/bash

awk?'{print?$2}'?hive-server2.log?|?tr?-d?':'?|?awk?'{sum+=$1}?END?{print?"avg:?",?sum/NR}'?>>capture_hive_log.log
awk?'{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/bash


state="true"

while?$state
do
????SMALL_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?];then
????????sar?-A?>?alert.txt
????????state="false"
????else
????????sleep?6
????????continue
????fi
done????

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 脚本案例。
希望大家能通过这些案例能够学以致用,结合自身的实际场景进行运用,从而提高自己的工作效率。

4月20日晚八点,欢迎来到CSDN悦读时间直播间,与四位大咖一起探索UNIX传奇往事的启示,围观《UNIX传奇》新书发布会!


?6 岁就成“大厂团宠”,这门编程语言竟引 Linux、谷歌、亚马逊共“折腰” !

?苹果春季发布会前瞻,这届“春晚”究竟会发布什么?

?“诺奖摇篮”贝尔实验室:从辉煌到衰败的百年沉浮

?直接学 Vue 3 吧 —— 对话 Vue.js 作者尤雨溪

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接