瞎扯时间

人的惰性真的很难去戒掉,每天工作下班回家后,只想瘫倒在床上,玩玩手游,刷刷抖音,甚至看看无聊至极的“爽文”,对于学习、看书啥的,完全提不起兴趣,也许正是因为如此,我才显得这么平庸而无趣吧。
    现在,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脚本 | 截取包名

    之前写 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. 总结-Linux

    linux基本操作 系统设置 创建用户 useradd -d /home/liaolongjun -m liaolongjun 设置密码 passwd liaolongjun 查看主机名 uname ...

  2. Linux服务器tomcat无法通过ip加端口访问

    Linux服务器tomcat无法通过ip加端口访问 防火墙开放端口 # Firewall configuration written by system-config-firewall# Manual ...

  3. 使用ajax分页查询

    controller: /** * 查询所有用户/查找指定用户 * 分页+搜索 * */@RequestMapping("/findClientBySize")@ResponseB ...

  4. 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析 Week6 20165311

    2018-2019 20165311 网络对抗 Exp4 恶意代码分析 2018-2019 20165311 网络对抗 Exp4 恶意代码分析 实验内容 系统运行监控(2分) 恶意软件分析(1.5分) ...

  5. 学习ActiveMQ(八):activemq消息的持久化

    1. 持久化方式介绍前面我们也简单提到了activemq提供的插件式的消息存储,在这里再提一下,主要有以下几种方式: AMQ消息存储-基于文件的存储方式,是activemq开始的版本默认的消息存储方式 ...

  6. delphi 自动获取串口

    delphi 自动获取串口   https://blog.csdn.net/Nevermore_anger/article/details/79012875    版权声明:本文为博主原创文章,未经博 ...

  7. 添加一个Button按钮

    #增加一个Button 1. 在layout下的xml中添加 <Button android:id="@+id/button1" android:layout_width=& ...

  8. new和malloc区别,delete和delete []区别

    面试被问到上述问题,所以特地总结一下: 一.new和malloc的区别. 1.new可以返回指定类型的指针,并且自动分配内存大小:malloc需要计算手动计算分配空间的大小,并且返回值需要强转为实际类 ...

  9. 3n+1猜想——模拟

    package dxb.com; import java.util.Scanner; public class caixiang { public static void main(String[] ...

  10. 制作自己的docker镜像

    制作自己的Docker镜像主要有如下两种方式: 1.使用docker commit 命令来创建镜像 通过docker run命令启动容器 修改docker镜像内容 docker commit提交修改的 ...