文章目录
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触发