概述

读书百遍其义自见,shell脚本也是,只要例子看得多了,自然就知道怎么写了。这里主要整理了20几个例子,因为内容比较多,所以分了几次来做介绍了。下面的实例最好先自己思考怎么去实现,然后再看下实现的方式,答案不是标准的,也存在一些可以继续完善的地方。


1、文件以日期命名,并写入磁盘使用情况

#!/bin/bash 
#################################################
#文件以日期命名,并写入磁盘使用情况
#################################################
d=`date +%Y-%m-%d` ##获取日期
logfile=$d.log ##定义日志文件名
df -h > $logfile ##向文件写入磁盘使用情况


2、统计日志文件中各个IP的访问量

1)、新建日志文件 ,文件名 1.txt

123 -sdfjukhesdjkfghjkldf 
456 -jsdigkhndjfgjd
789 -dsfjkdhfjkhsdjkfhsjk
123 -sdfhfjkhsjklaj
789 -jfgduhdjkfghjkdf
123 -dhsfgjkhsdjkghjkdf

2)脚本2.sh

#!/bin/bash
#################################################
##取文件IP|排序|去重并统计各个IP重复数量|排序
#################################################
awk '{print $1}' 1.txt |sort -n |uniq -c |sort -n


3.计算Linux系统所有进程占用内存之和

#!/bin/bash
#################################################
#计算Linux系统所有进程占用内存之和
#################################################
sum=0
#利用for循环调取每一项进程所使用的内存,并依次求和
for mem in `ps aux |awk '{print $6}' |grep -v 'RSS'`
do
sum=$[$sum+$mem] ##内存求和
done
echo "the usered mem $sum" ##输出结果


4.监控远程机器的存活,发现宕机示警

#!/bin/bash
#################################################
#监控远程机器的存活,发现宕机示警
#################################################
#假设远程机器IP为114.114.114.114
ip=114.114.114.114
d=`date +%Y-%m-%d` ##获取日期
#while循环做循环监控,"while :"为死循环
while :
do
#使用ping命令,取丢包率的数值作为存活的判断依据
n=`ping -c2 $ip 2> /dev/null |grep 'received' |awk -F 'received, |%' '{print $2}'`
n1=`echo $n |sed 's/[0-9]//g'`
#判断取值是否为空
if [ -z "$n" ]
then
echo "error"
exit
#判断取值是否为数字
elif [ -n "$n1" ]
then
echo "error"
exit
#若丢包率不低于20%,则发送告警
elif [ $n -ge 20 ]
then
#这里也可做外发邮件告警
echo "more loss"
else
echo "$d : $ip is OK" > ip_monitor.log
fi
#监控间隔为30秒
sleep 30
done


5.批量修改指定目录下文件名、打包并还原文件名

#!/bin/bash
#################################################
#批量修改指定目录下文件名、打包并还原文件名
#################################################
#将目标文件夹下的所有指定类型文件的文件名查找存在指定文件中
find /home/scripts -type f -name "*.txt" > /home/scripts/txt.list
#通过for循环遍历所有文件,并依次改名
for f in `cat /home/scripts/txt.list`
do
mv $f $f.bak
done
#定义一个时间命名的目录作为打包文件的目录
d=`date +%F`
mkdir /home/scripts/txt_$d
#将所有改名文件依次拷贝到打包文件的目录下
for f in `cat /home/scripts/txt.list`
do
cp $f.bak /home/scripts/txt_$d
done
#进入指定目录下进行打包
cd /home/scripts
tar -czvf txt.tar.gz txt_$d
#还原文件名
for f in `cat /home/scripts/txt.list`
do
mv $f.bak $f
done

注:虽然打包的文件多了一层文件名,但是对于还原文件名变得十分容易


6.判断本机80端口是否监听,如果不存在,则重启服务并发送邮件告警

#!/bin/bash
###########################################################
#判断本机80端口是否监听,如果不存在,则重启服务并发送邮件告警
###########################################################
#判断本机80端口是否监听,并执行相应动作(使用命令行作为判断条件时,命令行正确执行即满足if条件,且用于判定的命令行不需要加反引号)
if netstat -ntpl |grep -q ':80 '
then
exit
else
#这里也可做外发邮件告警
echo "error"
#service nginx restart
fi
#判断是否启动成功,如未成功,则将错误信息通过邮件进行告警
n=`pgrep -l httpd |wc -l` #列出所有httpd进程的pid
if [ $n -eq 0 ]
then
touch /tmp/nginx_start.err
/usr/local/nginx/sbin/nginx start 2> /tmp/nginx_start.err
fi
if [ -s apache_start.err ] #if -s 选项,文件大小非0时为真
then
#这里也可做外发邮件告警
echo "error"
fi

注:持续监控可以采用任务计划或while循环


7.多地备份数据库(本地保留一周、远程保留一月)

#!/bin/bash
###########################################################
#多地备份数据库(本地保留一周、远程保留一月)
#date +%Y # 年份(四位) eg: 2018
#date +%y # 年份后两位 eg: 18
#date +%m # 月 eg: 07
#date +%d # 日 eg: 10
#date +%H # 24小时 eg: 11
#date +%M # 分 eg: 37
#date +%S # 秒 eg: 24
#date +%w # 星期(0-6) 0 表示周日
#date +%F # 完整日期 =%Y-%m-%d
#date +%T # =%H:%M:%S 时间 eg: 10:46:45
###########################################################
d1=date +%w
d2=date +%y-%m-d
bakdir='/backup'
r_bakdir='远程备份的IP地址':'远程备份的目录' #通过ssh同步
rs_bakdir='远程备份的IP地址'::'模块名称' #通过服务同步
#定义接下来的命令涉及到的所有的正确输出记录在正确日志的目录下,所有的错误输出记录在错误日志的目录下
exec 1> '正确日志的目录' 2>'错误日志的目录'
echo "mysql backup begin at `date +"%F %T"`"
#备份到本地机器的文件以星期命名,周期为7天,超出7天后,同名的旧文件会被新文件覆盖
mysqldump -u'指定的用户' -p'指定的密码' '指定的数据库' > $bakdir/$d1.sql
#备份到远程机器的文件以日期命名,周期为31天,超出31天后,同名的旧文件会被新文件覆盖
rsync -az $bakdir/$d1.sql $r_bakdir/$d2.sql
echo "mysql backup end at `date +"%F %T"`"


这些实际上是平时写shell脚本的一个一个片段,主要是记住实现的方式,逻辑通就可以了,下次就知道怎么写了。

shell脚本实例,通向shell脚本大师的必经之路的更多相关文章

  1. 【shell脚本实例】shell脚本统计单词频率、出现次数最多的n个单词

    1. 统计的对象words.txt,每个单词占一行(从简考虑了~) zjd@ubuntu:~/test$ cat word.txt used this count mysql count this u ...

  2. Shell实现多级菜单系统安装维护脚本实例分享

    Shell实现多级菜单系统安装维护脚本实例分享 这篇文章主要介绍了Shell实现多级菜单系统安装维护脚本实例分享,本文脚本用多级菜单实现管理WEB服务器.Mysql服务器.Nginx服器等,需要的朋友 ...

  3. 分享7个shell脚本实例--shell脚本练习必备

    概述 看多shell脚本实例自然就会有shell脚本的编写思路了,所以我一般比较推荐看脚本实例来练习shell脚本.下面分享几个shell脚本实例. 1.监测Nginx访问日志502情况,并做相应动作 ...

  4. shell脚本实例一

    一. 什么是shell 脚本时一种解释性语言: shell脚本保存执行动作: 脚本判定命令的执行条件 脚本来实现动作的批量执行.二.如何创建 vim  test.sh     ##shell脚本一般都 ...

  5. shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...

  6. 【Shell脚本学习8】Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数

    前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: $echo $$ 运 ...

  7. [shell编程]一个简单的脚本

    首先,为什么要学习shell呢?哈哈,当然不是shell能够怎样怎样然后100字. 最近看到一篇博文<开阔自己的视野,勇敢的接触新知识>,读完反思良久.常常感慨自己所会不多,对新知识又有畏 ...

  8. shell脚本分为三类:登录脚本、交互式脚本、非交互式脚本

    shell脚本分为三类:登录脚本.交互式脚本.非交互式脚本 一. 登录脚本类似于windows下的计算机设置中的登录脚本和账户设置下的登录脚本的合集(我是这么理解的哈). 其配置文件的关键词为pref ...

  9. shell for循环+case的脚本(监控程序状态)

    分享一个shell for循环+case的脚本(监控程序状态) 分享一个for循环+case的脚本(监控程序状态并执行相关操作) ,供大家学习参考. 复制代码代码如下: #/bin/bash set ...

  10. 【Shell脚本】运行shell脚本文件的几种方法与区别

    Shell脚本不同的运行方式会对当前Shell设置或者运行结果有所不同. 假设现在有一个脚本名为display_shell_script_args.sh,其内容如下: #!/home/pyf/bin/ ...

随机推荐

  1. mac 上使用 idea 上传项目代码到阿里云git上

    1.Idea 打开需要上传的项目   2.先在本地创建一个git仓库 VCS --> Import into Version Control --> Create Git reposito ...

  2. 使用layui框架根据字段来设置tr行的背景色

    问题来源:最近在写公司项目时使用layui遇见的问题,老板要求根据td字段来设置整行tr的背景色. 解决:一开始数据比较少的时候只是直接在页面根据js动态判断字段然后来更改背景色,结果能够成功,但是后 ...

  3. Tomcat - 控制台乱码

    1.找到${CATALINA_HOME}/conf/logging.properties 2.找到java.util.logging.ConsoleHandler.encoding = UTF-8 修 ...

  4. Android Room 使用案例

    本内容主要介绍 Android 中使用 Room 保存数据到本地数据库的方法.  以下是 Android Room 的官方介绍文档: Room Persistence Library(Room 库的简 ...

  5. Android Jetpack组件之Lifecycles库详解

    Android Jetpack 组件是库的集合,这些库是为了协同工作而构建的,不过也可以单独采用,接下来会一一详细地学习这些库, 下面源码版本是com.android.support:appcompa ...

  6. Vue路由传参的几种方式

    原 Vue路由传参的几种方式 2018年07月28日 23:52:40 广积粮缓称王 阅读数 12613   前言:顾名思义,vue路由传参是指嵌套路由时父路由向子路由传递参数,否则操作无效.传参方式 ...

  7. 某位前辈的Image识图,,有点意思,先留存

    import PIL from PIL import Image def get_bin_table(threshold=155): ''' 获取灰度转二值的映射table 0表示黑色,1表示白色 ' ...

  8. Linux 永久改变系统时间

    Centos系统,必须同时修改系统时间和硬件时间,才可以保证修改有效,单纯的使用date命令修改系统时间,是立即生效,重启后系统还原.具体操作如下: 1.date {查看目前本地的时间}2.hwclo ...

  9. 手写热更新阐述tinker实现原理

    关于热更新如今面试也是基本上都会提及到的,我上一家公司用的是tinker,而这里准备研究的也是它的原理,而关于tinker的原理网上也是一大堆文章进行介绍,为了对它有个更加进一步的认识,所以自己动手来 ...

  10. Gradient Boosting Decision Tree

    GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类.当采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树,残差的意义如公式 ...