• 【博学谷学习记录】超强总结,用心分享丨大数据超神之路(四):shell脚本


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

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

    1.1 shell的变量

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

    1.2 常见的几个符号

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

    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文
    件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    2.1 grep命令

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

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2.3 awk命令

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

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

    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    第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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    第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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    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 "-------------------------备份成功-------------------------"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    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触发
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    【技巧】Ubuntu临时授予用户sudo权限,并在一定时间后自动撤销
    android app渗透测试-Activity、Service
    (下)苹果有开源,但又怎样呢?
    【c++】跟werbtc学容器:unordered_set
    优思学院《质量工程师入门攻略2024》
    基于单片机雨天自动关窗器的设计
    Debezium-增量迁移之 Oracle 迁移所需权限
    浅析函数栈
    【文末送书】计算机网络编程 | epoll详解
    云原生可观测套件:构建无处不在的可观测基础设施
  • 原文地址:https://blog.csdn.net/Mrxuchen/article/details/123012481