超强总结,用心分享丨大数据超神之路(四):shell脚本

1、Shell是一种编程语言,该语言底层是C语言
2、Shell是一种解释型语言,和python类似
3、shell以后主要用于脚本编写,通过脚本实现自动化部署和调度
4、Shell是语言的统称,在Shell下面又细分了很多不同的Shell语言,默认用的Base Shell
5、Shell脚本文件的后缀是.sh,不过也可以不写
6、shell一定得不一定有解释器,默认的解释器# !/bin/bash

第1章 shell的变量以及常见符号

1.1 shell的变量

shell不同于其它语言需要先声明变量
shell的变量直接使用,eg:a=15
调用变量的话 $或者a 或者 ${a}
$? #判断上一条命令执行的是否成功
$0 #返回脚本的文件名称
$1-$9 #返回对应的参数值
$* #返回所有的参数值是什么
$# #返回参数的个数和

1.2 常见的几个符号

> #会覆盖原有的内容
>> #不会覆盖原有的内容
; #执行多条命令
| #管道符
&& #前面的命令执行成功,后面的才可以执行
|| #前面的命令执行失败,后面的才可以执行
"" #会输出变量值
'' #输出本身
`` #输出命令结果 eg:a=`date`;echo $a
2>/dev/null #错误输出到无底洞
1>/dev/null #正确输出到无底洞

1.3 常见的条件判断

文件(夹)或者路径:
-e 目标是否存在(exist)
-d 是否为路径(directory)
-f 是否为文件(file)
-r 是否有读取权限(read)
-w 是否有写入权限(write)
-x 是否有执行权限(excute)
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-lt 小于(lesser than)
-ge 大于或者等于(greater or equal)
-le 小于或者等于(lesser or equal)
[ 9 -gt 8 ] && echo '大于'
[ -x 123.txt ] && echo '有执行权限'
[ -e foer.sh ] || touch foer.sh #判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh文
件

第2章 处理海量数据的grep、cut、awk、sed 命令

2.1 grep命令

   grep应用场景:通常对数据进行 行的提取

语法:grep [选项]...[内容]...[file]
-v #对内容进行取反提取
-n #对提取的内容显示行号
-w #精确匹配
-i #忽略大小写
^ #匹配开头行首
-E #正则匹配

2.2 cut命令

   cut应用场景:通常对数据进行列的提取

语法:cut [选项]...[file]
-d #指定分割符
-f #指定截取区域
-c #以字符为单位进行分割
注意:不加-d选项,默认为制表符,不是空格
/bin/bash #代表可以登录的用户
/sbin/nologin #代表不可以登录的用户
-d与-f
eg:
以':'为分隔符,截取出/etc/passwd的第一列跟第三列
cut -d ':' -f 1,3 /etc/passwd
eg:
以':'为分隔符,截取出/etc/passwd的第一列到第三列
cut -d ':' -f 1-3 /etc/passwd
eg:
以':'为分隔符,截取出/etc/passwd的第二列到最后一列
cut -d ':' -f 2- /etc/passwd
-c
eg:
截取/etc/passwd文件从第二个字符到第九个字符
cut -c 2-9 /etc/passwd
eg:比如领导想叫你截取linux上面所有可登陆普通用户
grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v root

2.3 awk命令

   awk的简介:其实一门编程语言,支持条件判断,数组,循环等功能,与grep,sed被称为linux三剑客之所以叫AWK是因为取其三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的
首字符
   awk的应用场景:通常对数据进行列的提取

awk '条件 {执行动作}'文件名
awk '条件1 {执行动作} 条件2 {执行动作} ...' 文件名
或awk [选项] '条件1 {执行动作} 条件2 {执行动作} ...' 文件名

2.4 sed命令

   sed的应用场景:主要对数据进行处理(选取,新增,替换,删除,搜索)

sed语法:sed [选项][动作] 文件名
常见的选项与参数:
-n #把匹配到的行输出打印到屏幕
p #以行为单位进行查询,通常与-n一起使用
eg:df -h | sed -n '2p'
d #删除
eg: sed '2d' df.txt
a #在行的下面插入新的内容
eg: sed '2a 1234567890' df.txt
i #在行的上面插入新的内容
eg: sed '2i 1234567890' df.txt
c #替换
eg: sed '2c 1234567890' df.txt
s/要被取代的内容/新的字符串/g #指定内容进行替换
eg: sed 's/0%/100%/g' df.txt
-i #对源文件进行修改(高危操作,慎用,用之前需要备份源文件)
搜索:在文件中搜索内容
eg:cat -n df.txt | sed -n '/100%/p'
-e #表示可以执行多条动作
eg:cat -n df.txt | sed -n -e 's/100%/100%-----100%/g' -e '/100%-----100%/p'

第3章 shell函数

3.1 函数

[ function ] funname()
{
    action;
    [return int;]  #这里的return不是用来返回函数的返回值,而是用来返回函数执行完的状态码($?)
}
#----定义1:没有参数,没有返回值-----------
function func1(){
 echo "Hello World"
}

调用函数:
 func1
 
 
#----定义2:有参数,没有返回值-----------
function func2(){
 echo "Hello World--$1--$2"  #这里的$1和$2是向函数传入的参数
 return 1
}

调用函数:
 func2 aaa bbb
 #----定义3:有参数,有返回值-----------

func3(){
 sum=$[$1+$2]
 echo $sum   #shell的函数的返回值必须通过echo返回
}

调用函数:
result=$(func3 10 20)
echo "result=$result"


总结:
 1、如果单独调用函数,则函数内部的echo会直接输出到控制台
  func3
 2、如果想要有返回值,则函数内部一般只写一个echo
 result = $(func3 10 20)

3.2 函数状态码

#----定义3:有参数,有返回值-----------

func3(){
 sum=$[$1+$2]
 echo $sum   #shell的函数的返回值必须通过echo返回
}

调用函数:
result=$(func3 10 20)
echo "result=$result"


总结:
 1、如果单独调用函数,则函数内部的echo会直接输出到控制台
  func3
 2、如果想要有返回值,则函数内部一般只写一个echo
 result = $(func3 10 20)

第4章 案例实战

4.1 巡检内存使用率

#!/bin/bash
# 内存使用率

mem_total=`free -m | sed -n '2p' | awk '{print $2}'`

mem_used=`free -m | sed -n '2p' | awk '{print $3}'`

mem_free=`free -m | sed -n '2p' | awk '{print $4}'`

Percent_mem_used=`echo "scale=2; $mem_used / $mem_total * 100"  | bc`

Percent_mem_free=`echo "scale=2; $mem_free / $mem_total * 100"  | bc`

now_time=`date +"%Y-%m-%d %H:%M:%S 星期%w"`

echo -e "\n"

echo -e "$now_time\n内存的使用率是:$Percent_mem_used%"

echo -e "内存还剩:$Percent_mem_free%未使用"


# 检查负载是否有压力
if [ $mem_used -gt 4096 ]
        then
        echo -e "\033[31;5m告警:\033[0m"
        echo -e "\033[31;5m内存使用率已超过负载能力,目前使用率达到:$Percent_mem_used%\033[0m"
else
        echo '目前内存负载正常'
fi

echo -e "\n"

4.2 备份mysql

#!/bin/bash
#完成数据库的定时备份
#备份的路径
BACKUP=/export/data/db
#当前时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以通过输出变量来调试
#echo ${DATETIME}

echo "---------------------开始备份数据库---------------------"
echo "---------------------备份的路径是$BACKUP/$DATETIME.tar.gz---------------------"
#主机ip地址
HOST=node0
#数据库用户名
DB_USER=root
#数据库密码
DB_PWD=123456
#数据库名
DATABASE=itcast_shop
#创建备份路径
#如果备份的文件夹路径存在的话,就直接使用,否则就创建

[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

#执行mysql的备份数据库的指令

mysqldump -u${DB_USER} -p${DB_PWD} --host=${HOST} ${DATABASE} > ${BACKUP}/${DATETIME}/${DATETIME}.sql

#打包备份文件
cd ${BACKUP}
tar -czvf ${DATETIME}.tar.gz ${DATETIME}
#删除临时目录
rm -rf ${BACKUP}/${DATETIME}
#删除10天前的备份文件
find ${BACKUP} -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "-------------------------备份成功-------------------------"

4.3 Crontab表达式

用法

1、在linux命令行中,敲以下命令
  crontab -e 
  例如:   * * * * * /opt/shell/1.sh  每隔一分钟执行一次1.sh命令

2、在Crontab中每一行就代表一个定时器,如果要删除这个定时器,则只需要删除对应的行即可
3、查看定时器
  cr
  注意事项:
1、Crontab表达式使用五颗星来表示:分时日月周
2、Crontab中日和周不能同时使用,但是可以都为*,这是以日为主
3、样例 
	分(0~59) 
	时(0~23)
	日(0~31,但是你需要考虑你月的天数)
	月(1~12)
	周(0~6 0=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
	
	"* * * * *"         #每隔一分钟触发
	"15 * ? * *"       #每小时的第15分触发
	"15 10 ? * *"      #每天上午10:15触发
	"15 10 * * ?"      #每天上午10:15触发
	"* 14 * * ?"       #在每天下午2点到下午2:59期间的每1分钟触发
	"0/5 14 * * ?"     #在每天下午2点到下午2:55期间的每5分钟触发
	"0/5 14,18 * * ?"  #在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
	"0-5 14 * * ?"     #在每天下午2点到下午2:05期间的每1分钟触发
	"10,44 14 ? 3 WED" #每年三月的星期三的下午2:10和2:44触发
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值