• shell脚本


    Shell脚本
    for循环
    cat > a.sh <<EOF
    #!/bin/bash
    export NODE_NAMES=(kube-test1 kube-test2 kube-test3 kube-test4)
    for node_name in ${NODE_NAMES[*]}
    do
      echo ${node_name}
    done
    EOF
    sed
    行上、行下操作
    在匹配行下面插入一行文字
    sed -i '/特定字符串/i 新行字符串' development.yaml
    在匹配行下面插入一行文字
    sed -i '/特定字符串/a 新行字符串' development.yaml
    在匹配行下面插入一行文字
    sed '//usr/bin/java/a /usr/local/jdk1.8.0_171/bin/java' /root/test.development.yaml
    在匹配行下面插入一行文字
    sed '/client/ adefault-character-set = utf8mb4' /etc/my.cnf
    在首行插入一行文字
    sed "1i #!/bin/bash" a.sh
    在最后插入一行文字
    sed -i '$a要插入的文字' development.yaml
    在第3行上面插入文字
    sed '3i hello' /etc/passwd
    在第3行下面插入一行文字
    sed '2ahello' a.txt
    在第3行下面插入两行文字
    sed '2ahello
    hi' a.txt
    在第3行下面插入文字
    sed '3a hello' /etc/passwd
    查找替换功能
    普通查找替换
    sed -i 's/原字符串/新字符串/g' development.yaml
    sed只对第三行查找替换
    sed = /etc/passwd | sed 'N; s/
    / /' | sed '3 s/d/c/g'
    sed只对第14行查找替换
    sed -i '14 s/ens33/eth0/g' /etc/sysconfig/network-scripts/ifcfg-ens33
    sed只对第55行查找替换成空格
    sed -i '55 s/!//g' /etc/sudoers
    sed 替换特殊字符 //web/sing/ 替换成  /website/
    sed -i 's/web/sing/website/g' test1.conf         #转义符放在斜杠的前面
    sed行内整体替换
    sed "2c jenkins=192.168.1.204" c.file
    sed带多个参数使用
    sudo sed -i -n "17c Port 62000" /etc/ssh/sshd_config
    sed替换字符串内所有的空格 
    sed 's/ //g'
    打印功能
    打印第一行至第三行
    sed -n '1,3p' development.yaml
    打印第一行与最后一行
    sed -n '1p;$p' development.yaml
    删除功能
    删除第二行
    sed -i '2d' development.yaml
    删除第一行至第三行
    sed '1,3d' development.yaml
    删除匹配行至最后一行
    sed '/spec/,$d' development.yaml
    删除最后6行
    for i in `seq 1 6`; do sed -i '$d' development.yaml ; done
    删除最后一行
    sed '$d' development.yaml
    删除偶数行
    sed 'n;d' development.yaml
    隔两行删除一行
    sed 'n;n;d' development.yaml
    删除匹配行
    sed '/development/d' development.yaml
    删除特定字符串的行
    sed -i '/字符串/d' development.yaml
    行内操作
    查找name 并在其下添加namespace,a表示在其下一行添加文字
    sed '/name/anamespace' development.yaml
    查找name 并在其上添加namespace,i表示在其下一行添加文字
    sed '/name/inamespace' development.yaml
    查找以development为结尾的行,并在其行尾添加字符串word,$表示结尾标识符,&表示添加
    sed 's/development$/&.v2/' development.yaml
    查找以api开头的行,并在其行首添加nginx:
    sed -e '/api/s/^/&nginx:/' development.yaml
    查找具有特定字符的行,把其中的某个字符进行替换
    sed '/kind/s/Namespace/servece/g' development.yaml
    
    查找具有特定字符的行,把行内所有文字进行替换
    sed  -i '/world/s/hello world/service/g' a.txt 
    多个sed命令
    sed -e 's/development$/&.v2/' -e '/api/s/^/&nginx:/' development.yaml
    awk
    打印硬盘设备名称,默认以空格分割
    df -h | awk '{print $1}'
    以冒号作为分割符
    awk -F '[:]' '{print $1}' development.yaml 或者cat /etc/passwd | awk -F: '{print $NF}'
    以空格作为分隔符
    awk -F ' '  '{print $1}' development.yaml  或者awk   '{print $1}' development.yaml
    以制表符作为分隔符
    awk -F '[	]' '{print $1}' development.yaml
    以分号作为分隔符
    awk -F '[;]' '{print $1}' development.yaml
    以冒号为分割,打印第一列,然后追加到/tmp/log
    awk -F: '{print $1>> "/tmp/awk.log"}' development.yaml
    打印第三行到第五行,NR表示行
    awk 'NR==3,NR==5 {print}' development.yaml
    打印文件所有域
    awk 'NR==3,NR==5 {print $0}' development.yaml
    打印第三行到第五行的第一列和最后一列
    awk -F: 'NR==3,NR==5 {print $1,$NF}' /etc/passwd
    打印最后一列
    cat /etc/passwd | awk -F ':'  '{print $NF}'   或者  cat /etc/passwd | awk -F: '{print $NF}'
    打印字符串长度大于10的行号
    awk 'length($0)>10 {print NR}' development.yaml
    引用shell变量,使用-v或者双引号+单引号
    awk -v STR=hello '{print STR,$NF}' development.yaml
    以冒号为分隔符,打印第一列同时打印前5行
    awk -F: 'NR>=1 && NR<=5 {print $1}' development.yaml 
    cat /etc/passwd | head -5 | awk -F: '{print $1}' development.yaml
    打印第一列和所有行号
    awk -F: '{print NR,$1}' development.yaml
    NR除以2等于0则跳过该行继续执行下一行,打印出来
    awk -F: 'NR%2==0{next} {print NR,$1}' development.yaml
    awk分析nginx的日志状态码 404 503 等次数 统计次数大于20的
    awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'
    awk统计服务器连接状态数
    netstat -an | awk '/tcp/{s[$NF]++}END{for(i in s) print s[i] i}'
    netstat -an | awk '/tcp/{print $NF}' | sort | uniq
    
    
    grep
    grep -c "404" access.log 统计nginx日志中404的行数
    grep -i "404" access.log 不区分大小写 查找404所在的行
    grep -n "404" access.log 打印404的行以及行号
    grep -v "404" access.log 不打印404所在的行
    grep "api[Vv]" development.yaml 以字符api开头,接V或v 的行
    grep "^[^api]" development.yaml 显示输出不是api的行
    grep "[Aa]p" development.yaml 匹配 A或a开头,后接p的行
    grep -c "name" development.yaml 统计name出现的次数
    grep -i "name" development.yaml 不区分大小写,查找name所在的行
    grep -n "name" development.yaml 打印name所在的行和行号
    grep -v "name" development.yaml 不打印name所在的行
    grep "api[Vv]" development.yaml 查找以api开头的,后接V或v的行
    grep "^[^api]" development.yaml 显示出行首不是api的行
    grep "[Aa]pi" development.yaml 匹配A或a开头的行
    grep "[a...e]" development.yaml 匹配a,三个任意字符,紧接e的行
    grep "[a-z][p]i" development.yaml 匹配小写字母,紧接pi的行
    cut
    在 /etc/passwd 中输出第 3-5 列:cat /etc/passwd | cut -d ':' -f 3-5/etc/passwd 中输出第 3到最后一列:cat /etc/passwd | cut -d ':' -f 3-
    shell数组
    数组定义
    一对括号表示是数组,数组元素用“空格”符号分割开。
    a=(1 2 3 4 5)
    数组读取与赋值
    得到长度:
    [chengmo@centos5 ~]$ echo ${#a[@]}
    5
    用${#数组名[@或*]} 可以得到数组长度
    读取:
    [chengmo@centos5 ~]$ echo ${a[2]} 
    3
    [chengmo@centos5 ~]$ echo ${a[*]} 
    1 2 3 4 5
    用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容
    赋值:
    [chengmo@centos5 ~]$ a[1]=100
    [chengmo@centos5 ~]$ echo ${a[*]} 
    1 100 3 4 5
    [chengmo@centos5 ~]$ a[5]=100 
    [chengmo@centos5 ~]$ echo ${a[*]}
    1 100 3 4 5 100
    直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
    删除:
    [chengmo@centos5 ~]$ a=(1 2 3 4 5)
    [chengmo@centos5 ~]$ unset a
    [chengmo@centos5 ~]$ echo ${a[*]}
    [chengmo@centos5 ~]$ a=(1 2 3 4 5)
    [chengmo@centos5 ~]$ unset a[1] 
    [chengmo@centos5 ~]$ echo ${a[*]} 
    1 3 4 5
    [chengmo@centos5 ~]$ echo ${#a[*]}
    4
    直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据
    特殊使用
    分片:
    [chengmo@centos5 ~]$ a=(1 2 3 4 5)
    [chengmo@centos5 ~]$ echo ${a[@]:0:3}
    1 2 3
    [chengmo@centos5 ~]$ echo ${a[@]:1:4}
    2 3 4 5
    [chengmo@centos5 ~]$ c=(${a[@]:1:4})
    [chengmo@centos5 ~]$ echo ${#c[@]}
    4
    [chengmo@centos5 ~]$ echo ${c[*]} 
    2 3 4 5
    直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
    替换:
    [chengmo@centos5 ~]$ a=(1 2 3 4 5) 
    [chengmo@centos5 ~]$ echo ${a[@]/3/100}
    1 2 100 4 5
    [chengmo@centos5 ~]$ echo ${a[@]}
    1 2 3 4 5
    [chengmo@centos5 ~]$ a=(${a[@]/3/100}) 
    [chengmo@centos5 ~]$ echo ${a[@]} 
    1 2 100 4 5
    shell数组编程
    数组是相同数据类型的元素安一定顺序排列的组合,就是把有限个类型相同的变量用一个名字引用,然后用编号区分它们变量的集合
    创建和定义数组
    TEST=(test1 test2 test3)
    数组下标一般从0开始,引用数组方法如下
    echo ${TEST[0]} 引用第一个数组变量
    echo ${TEST[1]} 引用第二个数组变量
    echo ${TEST[@]} 显示该数组所有参数
    
    echo ${#TEST[@]} 显示该数组参数个数
    echo ${#TEST[0]} 显示test1字符长度
    echo ${TEST[@]:0} 打印数组所有值
    echo ${TEST[@]:1} 打印从第二值个开始的所有值
    echo ${TEST[@]:0:2} 打印第一个值和第二个值
    echo ${TEST[@]:1:2} 打印第二个值和第三个值
    数组删除 unset array[0]
    遍历数组
    cat > a.sh <<EOF
    #!/bin/bash
    export NODE_NAMES=(kube-test1 kube-test2 kube-test3 kube-test4)
    for node_name in ${NODE_NAMES[*]}
      do
        echo ${node_name}
      done
    EOF
    脚本实例:
    shell脚本安装python、pip
    首先把pip-18.0.tar.gz 、Python-3.6.5.tgz 安装包放在 /usr/local 下面,按照顺序先安装pip,再安装python。不要先安装或只安装python,否则很容易出错,
    [root@bogon ~]# cat pip-python.sh 
    #!/bin/bash
    func1(){
        #安装依赖包
        yum -y groupinstall "Development tools"
        [ $? -eq 0 ] && yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    }
        
    func2(){
        #安装pip
        yum remove pip -y && cd /usr/local/ && tar -xf pip-18.0.tar.gz && cd pip-18.0/ && python setup.py install
        [ $? -eq 0 ] && echo "安装完成pip"
    }
    func3(){
        #安装python
        cd /usr/local/ && tar -zxvf Python-3.6.5.tgz && mv Python-3.6.5 python3 && cd python3 && ./configure && make && make install
        [ $? -eq 0 ] && mv /usr/bin/python /usr/bin/python.bak
        [ $? -eq 0 ] && ln -s /usr/local/bin/python3 /usr/bin/python && ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
        [ $? -eq 0 ] && whereis pip && /usr/local/bin/pip3.6 install --upgrade pip && /usr/local/bin/pip install paramiko
        [ $? -eq 0 ] && sed -i "1c #!/usr/bin/python2.7" /usr/bin/yum
        [ $? -eq 0 ] && sed -i "1c #!/usr/bin/python2.7" /usr/libexec/urlgrabber-ext-down
        [ $? -eq 0 ] && sed -i "1c #!/usr/bin/python2.7" /usr/sbin/firewalld
        [ $? -eq 0 ] && sed -i "1c #!/usr/bin/python2.7" /usr/sbin/firewalld
      
        [ $? -eq 0 ] && echo "安装完成python"
    }
    #脚本菜单函数
    menu(){
        clear
        echo "# 1. 安装依赖包"
        echo "# 2. 安装pip"
        echo "# 3. 安装python"
        echo "# 4. 退出程序"
    }
    
    #功能选择函数
    choice(){
        read -p "Please choice a menu[1 2 3 4]:" select
    
    }
    #程序开始
    while true
    do
        menu
        choice
        case $select in
        1)
            func1;;
        2)
            func2;;
        3)
            func3;;
        4)
            exit;;
        *)
            echo "choice error"
        esac
    done
  • 相关阅读:
    HDU 4745 Two Rabbits (区间DP)
    HDU 1007 Quoit Design最近点对( 分治法)
    acdream 小晴天老师系列——我有一个数列! (ST算法)
    HDU 3592 World Exhibition (差分约束,spfa,水)
    HDU 5501 The Highest Mark (贪心+DP,经典)
    HDU 5500 Reorder the Books (水题)
    HYSBZ 1010 玩具装箱toy (决策单调DP)
    POJ 3017 Cut the Sequence (单调队列优化DP)
    Vijos P1243 生产产品 (单调队列优化DP)
    PIVOT&UNPIVOT
  • 原文地址:https://www.cnblogs.com/effortsing/p/10406238.html
Copyright © 2020-2023  润新知