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

前天,在群里看到有一位读者分享了几道 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"
#!/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}'
4月20日晚八点,欢迎来到CSDN悦读时间直播间,与四位大咖一起探索UNIX传奇往事的启示,围观《UNIX传奇》新书发布会!


?6 岁就成“大厂团宠”,这门编程语言竟引 Linux、谷歌、亚马逊共“折腰” !
?苹果春季发布会前瞻,这届“春晚”究竟会发布什么?
?“诺奖摇篮”贝尔实验室:从辉煌到衰败的百年沉浮
?直接学 Vue 3 吧 —— 对话 Vue.js 作者尤雨溪
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675








CSDN
