shell脚本-工作练习篇

时间:2023-02-19 09:00:48

瞎扯时间

人的惰性真的很难去戒掉,每天工作下班回家后,只想瘫倒在床上,玩玩手游,刷刷抖音,甚至看看无聊至极的“爽文”,对于学习、看书啥的,完全提不起兴趣,也许正是因为如此,我才显得这么平庸而无趣吧。
    现在,Now,正在清明假期,两个室友都出去浪去了,我一个人在租房里,把客厅打扫了一遍,然后就是坚持了运动,算是一点小改变吧,运动也近两周了,每天都还坚持着,只是熬夜这个糟糕的习惯依然没有戒掉,这是下一阶段的目标吧,早睡早起!

还一个目标,多多学习多多写东西,去年底计划要每个月看一本书的,今年基本上没开始,惭愧,四月了,还不开始补就晚了!平时有时间也准备多写写博客,嗯,目标在前方。

正题

最近两天在办公室工作量不大,想到平时在工作中,服务器一般都是Linux操作系统,跟踪 DM 数据库报错、慢等问题,都是把日志文件打包下载到 Win 环境,借助 UE 或者 Notepad++ 来分析,但是日志文件一般都比较大,这么一个过程其实还蛮耗时间的,就想着能不能写写shell脚本来工作,当然,这才刚刚开始,只是一个练习。

第一个脚本,统计操作系统的基础信息,比如操作系统版本、cpu信息等,因为项目很多,每个项目用到的服务器也不少,经常需要统计操作系统的一些信息,这是一个小繁琐的事情,就写了个脚本,其实这个还蛮简单的,就是把平时经常用到的命令打印到一个指定的文件而已,很简单。

#!/bin/bash
# system stats script
# Write this shell script by Light Ink in April . # 清空日志文件
echo "" > L-Ink_sys_stats.log # 标题符
title_char="============================="
echo -e "${title_char} SYSTEM STATS ${title_char}\n" >> L-Ink_sys_stats.log # 打印系统时间
sys_date=`date '+%Y-%m-%d %H:%M:%S'`
echo -e "System Date:${sys_date}\n" >> L-Ink_sys_stats.log # 分割符
cutter_char="------------------------------------------------------------------------"
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log # 统计操作系统版本
echo "[OS version]" >> L-Ink_sys_stats.log
command="`cat /etc/redhat-release`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log # 统计CPU信息
echo "[CPU model]" >> L-Ink_sys_stats.log
command="`cat /proc/cpuinfo | grep name | cut -f2 -d:`"
echo -e "${command}" >> L-Ink_sys_stats.log
echo "[Physical Cpu nums]" >> L-Ink_sys_stats.log
command="`cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l`"
echo -e "${command}" >> L-Ink_sys_stats.log
echo "[Cpu Cores]" >> L-Ink_sys_stats.log
command="`cat /proc/cpuinfo| grep "cpu cores"| uniq`"
if [ ! -n "$command" ];
then
command="NULL"
fi
echo -e "${command}" >> L-Ink_sys_stats.log
echo "[Processor]" >> L-Ink_sys_stats.log
command="`cat /proc/cpuinfo| grep "processor"| wc -l`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo "[CPUINFO]" >> L-Ink_sys_stats.log
command="`cat /proc/cpuinfo`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log # 统计内存信息
echo "[Mem Info]" >> L-Ink_sys_stats.log
command="`cat /proc/meminfo`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log # 磁盘使用情况
echo "[Disk Using Info]" >> L-Ink_sys_stats.log
command="`df -h`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log # 磁盘挂载情况
:<<eof
echo "[Disk Mount Info]" >> L-Ink_sys_stats.logi
command="`fdisk -l`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log
eof echo "[Disk Mount Info]" >> L-Ink_sys_stats.log
sysuser="`echo $USER`"
if [ $sysuser = "root" ]; then
command="`fdisk -l`"
echo -e "${command}\n" >> L-Ink_sys_stats.log
echo -e "${cutter_char}\n" >> L-Ink_sys_stats.log
else
echo -e "(State Disk Info Error)Permission denied!" |tee -a L-Ink_sys_stats.log
echo -e "\n${cutter_char}\n" >> L-Ink_sys_stats.log
fi # IO 统计
echo "[IO]" >> L-Ink_sys_stats.log
command="`iostat -x 3 5`"
echo -e "${command}\n" >> L-Ink_sys_stats.log :<<eof
# 是否继续统计 DM 数据库 想了想,这一块功能不太好做,关闭此功能开发。
flag=
for ((i=;i<;i++))
do
read -p "Check DMDB info?[y/n]" input
if [ $input = "y" -o $input = "Y" ]; then
flag=
echo "To be continue..." >> L-Ink_sys_stats.log
break
elif [ $input = "n" -o $input = "N" ]; then
flag=
break
else
echo "Input Error!"
fi
done if [ $flag -eq ]; then
echo "【Error】Input error more than 3 times!!" |tee -a L-Ink_sys_stats.log
exit
fi
eof echo -e "${title_char} - End - ${title_char}\n" >> L-Ink_sys_stats.log
echo "SYSTEM STATS DONE!"

好久没有写 shell ,基本上是个新手,在上手过程中,在 if 判断语法中还吃了小亏, [] 一般不能邻着变量名,要不然就报错,还有经常获取变量的值,忘记加 $ 符,很蠢,需要多写写。
    另外,在这个脚本中,有块注释方法 :<<eof 与 eof ,期间还想着弄一些骚操作,包括自定义异常抛出,但是最后还是觉得没必要,反而太繁琐,命令错误本身就有系统异常,所以就用块注释了。

第二个脚本,是一个需要一些时间不断去完善的脚本,分析 DM 库(达梦数据库) 日志的脚本,目前实现了两个小功能,筛选报错语句和超过1s的慢SQL的功能。

#!/bin/bash
# analysis dmsql logs
# Write this shell script by Light Ink in April .
# v1.
read -p "Please input the log name:" in_logname
arr=($in_logname) echo "--------------------------------"
echo "The Options:"
echo "1.Find Errors"
echo "2.Filter SQLs More Than 100ms"
echo "3.Filter SQLs More Than 1000ms"
echo "4.exit"
echo "--------------------------------"
read -p "Choose one option please:" in_op # 将日志中的错误信息,筛选输出至文本
Find_Errs(){
for element in ${arr[@]}
do
command_01="`cat $element |grep "ERR("`"
echo "====================== log name: "$element" =======================" >> $
echo "${command_01}" >> $
done
} # 将日志中超过100ms的sql语句,筛选输出至文本
Filter_SQL_100ms(){
for element in ${arr[@]}
do
command_02="`cat $element |egrep "[-][-][-]\(ms\)"`"
echo "====================== log name: "$element" =======================" >> $
echo "${command_02}" >> $
done
} # 将日志中超过1000ms的sql语句,筛选输出至文本
Filter_SQL_1000ms(){
for element in ${arr[@]}
do
command_03="`cat $element |egrep "[-][-][-][-]\(ms\)"`"
echo "====================== log name: "$element" =======================" >> $
echo "${command_03}" >> $
done
} # 创建文件夹目录
Create_dir(){
# ls -l 以 d 开头的即文件夹,通过 sed 将多个空格替换为单个空格,再以 cut 分割,取文件名,文件名会以空格为间隔符存到变量中
command_ls="`ls -l|egrep "^d"|sed -e 's/[[:space:]][[:space:]]*/ /g' | cut -d ' ' -f 9`"
dirname=($command_ls)
# 判断目录是否已经存在的标志,0表示不存在
dir_exst_flag=
# 遍历数组,如果存在目录名,即将标志置为1,反之不变
for i in ${dirname[@]}
do
if [ $ == $i ]; then
dir_exst_flag=
fi
done if [ $dir_exst_flag = ]; then
mkdir $
else
return
fi
} currentMon=`date "+%Y%m"`
currentTime=`date "+%Y%m%d%H%M%S"`
if [ $in_op = "" ]; then
dir_name="ERR_SQLS_"$currentMon
Create_dir $dir_name
log_name=errlog_"$currentTime".log
Find_Errs $dir_name/$log_name
elif [ $in_op = "" ]; then
dir_name="More_Than_100ms_SQLs_"$currentMon
Create_dir $dir_name
log_name=more_than_100ms_SQLs_"$currentTime".log
Filter_SQL_100ms $dir_name/$log_name
elif [ $in_op = "" ]; then
dir_name="More_Than_1000ms_SQLs_"$currentMon
Create_dir $dir_name
log_name=more_than_1000ms_SQLs_"$currentTime".log
Filter_SQL_1000ms $dir_name/$log_name
elif [ $in_op = "" ]; then
exit
else
echo "Input Error!"
exit
fi

在这个里面,用到了 shell 中的函数,函数调用不用在 fun 的()中声明变量,直接用 $1 $2 之类的指代传入的第一个、第二个参数,还是蛮方便的。
    另外,作为一个新手,发现确实自己在处理文本信息或者是字符串信息的过程中,还是缺乏很多系统的命令学习,想 sed 等命令就需要再好好学学,其实以前就看过 sed 命令,但是因为长期没实践,自己也没像样的博客或者笔记记载,就跟没学习一样,这一点还需要好好加油。
    重点提示一个遍历元素的方法,dirname=($command_ls) 这样将变量转成数组,当然是有分割符的,因为代码里是空格,属于默认分割符,就没有再设置,后面再详细记载。最后再用 for 来遍历数组内容。

补充

后面代码更新,会另起新的一篇博客,链接记录会在这里,先预存好位置,也提醒自己要更新。

shell脚本-工作练习篇的更多相关文章

  1. shell脚本 入门 —— 符号篇

    shell Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive). Shell还有一种执行命令的方式称 ...

  2. Shell脚本之awk篇

    目录:一.概述二.awk基本语法格式三.awk基本操作四.awk条件及循环语句五.awk函数六.awk演示示例(源自于man手册) 一.概述 1. 产品概述: awk是一种编程语言,用于在linux/ ...

  3. Shell脚本 &vert; 截取包名

    之前写 shell 脚本的几篇文章都是先大致介绍脚本的功能和写法,然后一股脑的给出完整的代码.并没有细致入微的解释脚本中的每一行是如何思考如何编写的. 今天反其道而行之,只介绍一行代码.争取能讲的清楚 ...

  4. shell脚本的使用该熟练起来了,你说呢?(篇四)

    继续前一篇的文章: shell脚本的使用该熟练起来了,你说呢?(篇一) shell脚本的使用该熟练起来了,你说呢?(篇二) shell脚本的使用该熟练起来了,你说呢?(篇三) 文章里面测试的命令脚本文 ...

  5. 博主日常工作中使用的shell脚本分享

    前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...

  6. Linux shell脚本编程基础之练习篇

    shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...

  7. 第二篇:利用shell脚本执行webservice请求——基于soap

    1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

  8. Linux运维之shell脚本进阶篇

    一.if语句的使用 1)语法规则 if [条件] then 指令 fi 或 if [条件];then 指令 fi 提示:分号相当于命令换行,上面两种语法等同特殊写法:if[ -f"$file ...

  9. 大数据系列博客之 --- 深入简出 Shell 脚本语言(提升篇)

    首先声明,此系列shell系列博客分为四篇发布,分别是: 基础篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cn ...

随机推荐

  1. &lbrack;&period;NET&rsqb; WebApi 生成帮助文档及顺便自动创建简单的测试工具

    ==========最终的效果图========== ==========下面开始干活:生成帮助文档========== 一.创建 WebApi 项目 二.找到 HelpPageConfig.cs 并 ...

  2. sql语句executeQuery和executeUpdate之间的区别

    方法一.executeQuery 用于产生单个结果集(ResultSet)的语句,例如 SELECT 语句. 被使用最多的执行 SQL 语句的方法.这个方法被用来执行 SELECT 语句,它几乎是使用 ...

  3. 图解Android - System Service 概论 和 Android GUI 系统

    通过 图解Android - Binder 和 Service 一文中,我们已经分析了Binder 和 Service的工作原理.接下来,我们来简要分析Android 系统里面都有哪些重要的Servi ...

  4. 一本JavaEE的案例书

    案例很好.1.网上书店 2.AJAX网页聊天

  5. C&num;微信公众号开发 -- (二)验证成为开发者

    接下来就是验证成为开发者了.先来看一下验证的界面及需要填写的信息 在接口配置信息中填写需要处理验证信息的页面或者一般性处理文件,这里以aspx页面为例 URl中的格式为:http://XXX.com/ ...

  6. 解决 dyld&colon; Library not loaded&colon;Reason&colon; image not found

    在使用第三方framework时,直接把framework拖到项目中,运行时报错: dyld: Library not loaded: @rpath/ZipZap.framework/ZipZap R ...

  7. 关于android应用闪屏的几种情况

    1.主菜单进入某应用闪屏: 常见是一个空的activity作为launcher属性,实际上它什么事业没干,真正干事情的是从它通过intent启动的activity. 例子: public class ...

  8. 【css技能提升】css高级技巧

    本文是一个帮你提升 CSS 技巧的收藏集. 使用CSS复位 CSS复位可以在不同的浏览器上保持一致的样式风格.您可以使用CSS reset 库Normalize等,也可以使用一个更简化的复位方法: * ...

  9. 基于阻塞队列的生产者消费者C&num;并发设计

    这是从上文的<<图文并茂的生产者消费者应用实例demo>>整理总结出来的,具体就不说了,直接给出代码,注释我已经加了,原来的code请看<<.Net中的并行编程-7 ...

  10. ACM-选人问题&lpar;救济金发放)

    n(n<20)个人站成一圈,逆时针编号为1-n.有两个官员,A从1开始逆时针数,B从n开 始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个 官员停在同一个人上) ...