shell命令
     clear 清屏
     find path -name filename
     #find
     目录   ls
         绝对路径        /path01/path02/...
         相对路径        ./        /path01/path02/...
         退回上级目录        ../
         当前用户的根路径    ~
         查看当前路径      pwd
         查看当前子路径列表    ls 简易列表
                             ll    详细列表
                             ls -la 所有列表(隐藏路径)
        切换路径        cd    oath
         创建路径        mkdir path01 path02
                         mkdir -p path01/path02 path02     (-p递归创建)
         删除路劲        rm -[r]d path (删除空路径)        -r递归删除
         修改路径        cp [-r] src dest    复制            -r递归复制
                         mv src dest     移动    (同目录下修改路径名的功能)
     文件
        查看        cat     查看文件所有内容
                     more    分页查看    enter翻行,space翻页
                     less    分页查看
                     head -n    查看前n行
                     tail -n    查看后n行
                     wc         查看文件统计信息
         删除        rm -[r]f file 删除文件   -r[*递归删除,一次性删除目录及内的所有资源]
         修改文件名    mv file path    移动文件
                     mv file file1    重命名文件
                     cp file path    复制文件
         创建        touch file
         编辑        vi[m] file 如果存在直接打开编辑,如果不存在创建打开
                     命令行模式    默认进入/esc
                         /搜索内容
                         shift+z+z => :wq!保存并退出
                         :w 保存
                         :q    退出
                         :q!    强制退出
                         o:插入新行
                         i:在光标位置插入
                         gg:回到文件头
                         shift +g 回到文件尾
                         [n]dd 删除当前光标所在行开始的n行
                     编辑模式
     输出        echo
     日期
         date        回去系统当前日期
         date +%F    年-月-日 2021-12-20
         date +%C     世纪
         date +%Y    四位年
         date +%y    两位年
         date +%m    月
         date +%d    日
         date +%H    时
         date +%M    分
         date +%S    秒
         m=`date +%m`; q=$(((m-1)/3+1)) 季度
         date +%U    年周(周日为第一天)
         date +%W    年周(周一为第一天)
         date +%j    年日
         date +%w    周日(周一:0~周日:6)
         date +%s[%M%N]    [毫|纳]秒
         获取系统当前时间戳:%s秒:1637555292  %s%M毫秒:163755529728 %s%M纳秒
         日期时间计算
         date -d '$datetime ±n TimeUnit' +%F
        时间戳时间计算(先转化格式,再计算)
         dt=`date -d @timestamp +%F` 长整数(秒)格式化
         date "$dt ±n TimeUnit" +%F
    用户、分组、权限
             权限:
             r read
             w write
             x execute
             用户
             U    User
             G    Group
             O    Others
             查看用户信息:
             cat /etc/passwd
             #---------------------------------------------------------------------
             USERNAME,PASSWORD,USERID,GROUPID,GROUPNAME,USER_MAINPATH,命令集
             # ----------------------------------------------------------------------
             root:x:0:0:root:/root:/bin/bash
             shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
             sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
             heney:x:1000:1000:heney:/home/heney:/bin/bash
         查看用户密码
         cat /etc/shadow
             #---------------------------------------------------------------------
             USERNAME | USERNAME ,PASSWORD
             #----------------------------------------------------------------------
         查看分组信息
         cat /etc/group
         #------------------------------------------------------
             GROUPNAME,PASSWORD,GROUPID
         #---------------------------------------------------------------
         root:$6$tMQ55bpBDyJU559r$RYLbbak9s.Idqy3dii4qhA6uYb1gXAIFOAZV4W9yfUjilX9lYAORq6158fHchAI5zSmzGOSMnGz.FJYvIpciG.::0:99999:7:::
         sync:*:18353:0:99999:7:::
         shutdown:*:18353:0:99999:7:::
         sshd:!!:18973::::::
         mysql:!!:18974::::::
        切换当前登录用户
         su USERNAME
        创建用户
         useradd kb16
         useradd -d 主目录 -m -g 组名 用户名
         -d DIR #指定新建用户的主目录,若未指定默认自动创建主目录/home/用户名
         -m        #如果主目录不存在则创建,只能创建一级目录
         -g GNAME #指定用户所属主组名,若未指定默认创建同名组,并将自己归于该组内
         -G GN1,GN2...#指定用户所属附加组名列表
         usermod -d 主目录 -g 组名 用户名
         userdel [-r] USERNAME
             -r 删除主目录
        passwd USERNAME|GROUPNAME #设置用户或分组密码
         passwd -l USERNAME #锁定用户
         passwd -u USERNAME #解锁用户
        #创建用户分组
         groupadd GROUPNAME
         groupmod -g NEW_GID -n NEW_GROUPNAME SRC_GROUPNAME
         groupdel GROUPNAME
        修改权限
         touch b.log
         ll
         #---------------------------------------------
         权限    硬链接数 owner group   创建时间    文件名
         #--------------------------------------------
         [-rw-r--r--] 1    [root root] 0 Dec 22 10:45 b.log
         #-----------------------------------------------
         -rw-r--r--
         -资源类型 -文件    d目录
         rw- u 表示所有者对资源的权限,r表示read,w表示write,第三个`-`(`x`)表示执行权,`-`表示没有执行权
         r-- g 表示组内用户对他的权限
         r-- o 表示其他用户对它的权限
        新建的文件默认权限644 vi/touch *.*
         新建的目录默认权限755     madir *
         .*.*    隐藏文件或目录  可以通过ls-la查看
         *~        临时文件
         rwx 111 7
         rw- 110 6
         r-x 101 5
         r-- 100 4
         -wx 011 3
         -w- 010 2
         --x 001 1
         --- 000 0
         chmod u+x b.log
         chmod g+w b.log
         chmod  732 b.log
              [root  root]
         chown USER:group B.LOG
        管道符 |
         cmd ...|cmd2 ...|...先执行并将结果作为cmd2的输入,依次执行
         cat /etc/passwd|grep kb16
    文本编辑
         sed [-option] 'script' file
         sed [-option] {script|AdressCommand} file1[ file2...]
         -option
             -n    #不显示模式空间内容
             -e     #同时执行多个匹配操作
             -f     #执行文件中的多个AddressCommand操作    *
             -r     #使用扩展正则表达式*
             -i    #直接修改文件    *
         #Address表达式
         s,e|+n|$ #从s行(包含)到(e行|之后的n行|最后一行)
         n        #第n行
         /REGEX/,+2    #从正则匹配行(包含)之后n行
         /REGEXS/,/REGEXE/    #从REGEXS开始至    REGEXE结束
         #Command表达式
         script    操作指令
             d     删除(行)delete* sed -i '/HISTSIZE=1000/d' profile
                                             sed -i '1,9d' profile
             p     显示符合条件的行        print
             a    向下追加新行    append*
             i     向上插入新行    insert*
             c     整行替换
             s     行中替换* sed -i 's/\/opt\/software\/jdk8/\/opt\/jdk8/' profile
             r     行中追加cat pro
        script     行匹配模式
         行号匹配
         n
         1,3
         1,$
        正则匹配
         /SELINUX=enforced/
         /SELINUX=enforced/,/UseDNS=yes/
        操作
             cp /etc/profile ./
             sed -i '/HISTSIZE=1000/d' profile
             sed -i '1,9d' profile
             sed -i '/unset i/i \export JAVA_HOME=/opt/software/jdk8' profile
             sed -i 's/\/opt\/software\/jdk8/\/opt\/jdk8/' profile
             sed -i 's/"//g' ifcfg-ens33
             sed -nr '/IPV/p' ifcfg-ens33
             sed -nr '/^IPV.*no$/p' ifcfg-ens33
             sed -ri '/^IPV.*no$/s/no/yes' ifcfg-ens33
    文件处理
     awk [-option] `script` file
     -option
         -F 外置定义分隔符,指定分隔符(',',' ',';')=> -F ','  (以逗号问分隔符)
         -v 传参        -v var=value
         -f file     脚本文件
     script
         'BEGIN {}/regexp/{}END{}'
         BEGIN {}     类似于过滤器的init()    启动示执行一次
             BEGIN{i=1}    声明变量并初始化
             BEGIN{FS=';'} 内置定义分隔符
             多条语句分号隔开
         {}            类似于过滤器的doFilter() 逐行执行
         END {}        类似于过滤器的destroy()  结束时执行
     分支,循环,跳转语句都存在
    字符串函数
     gensub(regex,replace,noWho,target) 将target字符串中的第noWho个regex匹配内容替换为replace
         awk -F ',' '{v=gensub("5","X",1,$1);print v,$2,$3}' a.log|awk
         awk -F ',' 'BEGIN{V="ABC DEF";print gensub(/(.*?) (.*?)/,"\\2 \\1","g",v)}' =>DEF ABC
     index(src,find)    返回find在src中的位置,不存在返回0
         awk -F ',' 'BEGIN{v="ABC DEF";print index(v,"BC")}' =>2
     length(src)    返回字符串的长度(字符数量)
     awk -F ',' 'BEGIN{v="ABC def";print length(v)}' =>7
     match(src,regex[,arr])
         awk -F ',' 'BEGIN{v="ABC123";print match(v,[0-9]{1,}/)}' =>4
         awk -F ',' 'BEGIN{v="ABC123";print match(v,[0-9]{2,}/)}' =>4
         awk -F ',' 'BEGIN{v="ABC123";print match(v,[0-9]{3,}/)}' =>4
         awk -F ',' 'BEGIN{v="ABC123";print match(v,[0-9]{4,}/)}' =>0
         若regex带分组,则将多个分支一次填入arr
         awk -F ',' 'BEGIN{v="ABC 123";match(v,/(.*?) (.*?)/,arr);print arr[1] arr[2]}' =>ABC 123
     split(src,arr[,FieldSep[,seps]])  一FieldSep将src分成数组,并一次存放于arr中,将分隔符存放于seps中
         awk -F ',' 'BEGIN{v="ABC 123,def;xxx";split(v,arr,/ |,|;/);print arr[1] arr[2] arr[3] arr[4]}' =>ABC 123 def xxx
         awk -F ',' 'BEGIN{v="ABC 123,def;xxx";split(v,arr,/ |,|;/,seps);print seps[1] seps[2] seps[3]}' => , ;
     substr(str,start[,length])    截取字符串
         输入每行ip地址中最后一位
         awk -F ',' '{v=$1;while(index(v,".")>0){v=substr(v,index(v,".")+1)} print v}' a.log
     tolower(str)    转为小写字母
         awk 'BEGIN{V="aBcDeF";print tolower(v)}'=>abcdef
     toupper(str) 转为大写字母
         awk 'BEGIN{V="aBcDeF";print toupper(v)}'=>ABCDEF
         (str""str)    拼接字符串
统计所有订单金额
     awk -F ',' 'BEGIN{v=0} {v+=$3}END{print v}' a.log
     wc a.log
     wc -l a.log
 统计每个ip下产生的订单数量,订单总金额,订单均值
     awk 'BEGIN{FS=","}{a[$1]++;b[$1]+=$3}END{for(e in a) print e,a[e],b[e],b[e]/a[e]}' a.log
统计不同用户在不同的ip下的订单数
     awk -F ',' '{a[$2","$1]++}END{for(k in a) print k,a[k]}' a.log
     awk -F ',' '{a[$2","$1]++}END{for(k in a) print k,a[k]}' a.log|sort    排序
统计订单金额为参数top以上的订单数
     awk -F ',' -v top=700 'BEGIN {c=0}{if($3>top) c++}END{print c}' a.log
    命令集
     cat /etc/shells
     #-------------------------------------------------
     /bin/sh
     /bin/bash*
     /usr/bin/sh
     /usr/bin/bash
    #--------------------------------------------
     表达式
     ``
         #整数计算
         a=`expr 1+2` =>3
         a=`expr 1-2` =>-1
         a=`expr 1\*2` =>2
         a=`expr 1/2` =>0
        #小数计算
         a=`awk -v a=1 -v b=2 'BEGIN{printf "%.2f",a/b}'` =>0.50
        #shell命令结果
         a=`pwd`**
    []
     #关系运算符
     a=$[1>2]    =>0:false **
     a=$[1<2]    =>1:true **
     #整数计算
     a=$[1[+|-|*|/|%]2] =>3|....**
     ((a++)) =>a=4    **
     #数组下标
     arr[index]  **
[[]]
     =~        **
     a="bc123ab12"
     [[ $a=~ ^abc.* ]] && echo "a" ||echo "b"
     #配合if分支使用
    #创建数组
     arr=(item,...,item)   **
     item=${arr[index]}
     len=${#arr[*]}
     arr[index]=value 下标已存在覆盖,不存在增加
序列
     s=`seq 1 2 10`  **
    #提取变量值
     ${a}                提取变量值**
     ${arr[index]}        提取数组元素**
     ${#arr[*]}            提取数组长度**
${str/[/]from/to/g} 替换(、替换第一处,//替换所有)**
    运算符
         if/while[]
             关系    -gt -ge -lt -le -eq -ne
             逻辑    -a -o !
             字符串    = != -z -n        **
             文件    -e -f -d -r -w -x             **
         (())
             关系    同java一样        **
             逻辑    同java一样        **
    #shell编程
         touch | vi[m] call.sh   #touch call.sh
         chmod u+x call.sh
         call [-option]...
         call -name "heney"
     ----------------------------------------
     #!/bin/bash
     source /etc/profile
     ------------------------------------------------
    变量
     var=value
     let var=value
     unset var
     let var=()
     let var=`seq 1 5`
     #类别
     环境变量
     全局变量
     局部
     分支
     if [ $a -ge 6 -a $b -le 10]  *
     then
         echo "yes"
     else
         echo "no"
     fi
     ----------------------------------------------------------------------------------------
     ----------------------------------------------------------------------------------------
     if((a>6 && b<10))
     then
         echo "yes"
     else
         echo "no"
     fi
     ----------------------------------------------
     read -p "input a number :" var
    if((var>5));then
             echo "hello"
     else
             echo "world"
     fi
     --------------------------------------
     path=$1
     if [ ! -e $path ];then
             echo "$path not exist"
     slif [ -d $path  ];then
             echo "$path is directory"
     else
             echo "$path is file"
             if [ -r $path ];then
                     echo "$path is readable"
             elif [ -w $path ];then
                     echo "$path is writeable"
             elif[ -x $path ];then
                     echo "$path is executable"
             else
                     echo "$path is not available"
             fi
     fi
     -----------------------------------------------------
     if [ $1 -ge 90 ]
     then
             echo "A"
     elif [ $1 -ge 80 ]
     then
             echo "B"
     else
             echo "C"
     fi
     ---------------------------------------------------
     a=$1
     b=$2
     c=$#
    if [ $c==2 $a -ge 10 -o $b -le 5 ];then
             echo "yes"
     else
             echo "no"
     fi
     ---------------------------------------------------------------------------------------------
     --------------------------------------------------------------------------------------------
     ######################################################################################
     case $var in
     v1)
         ...
     ;;
     v2)
         ...
     ;;
     esac
     -------------------------------------------------------------------------------------------------------
     -------------------------------------------------------------------------------------------------------
     case $1 in
     start|START)
             echo "starting..."
     ;;
     stop|STOP)
             echo "stopping..."
     ;;
     *)
             echo "nothing"
     ;;
     esac
     -------------------------------------------------------------------------------------------------------
     --------------------------------------------------------------------------------------------------------
    循环
     array=("aa bb cc")
     for item in ${array[@]}
     do
         echo $item
     done
     #-----------------------------------------
     aa
     bb
     cc
     #====================================
    for  item in `seq 1 2 10`
     do
         echo $item
     done
     #-----------------------
     1
     3
     5
     7
     9
     #----------------------------------
     total=0
     for ((i=1;i<=100;i++))
     do
         echo ((total+=i))
     done
     echo "SUM :$total"
     #----------------------------
     SUM : 5050
     #-------------------------------
     #函数
     function func_name(){
         p1=$1
         p2=$2
         ...
         pc=$#
        echo RESULT
         #return number xxxx
}
    rst =`func_name param1 param2...`   ***
     func_name param1,param2
    #脚本执行方式
     #开启子shell执行
     ./install.sh
     /bash
     -
read -p "input a number :" var
重定向
 echo "content" >file 覆盖模式
 echo "content" >>file 追加模式
 将a.log 中ip最后一位200以上的数据写入b.log,排序
 >>追加
 #分流
 cat a.log|awk -F ',' '{split($1,a,".");if(a[4]>=200) print $0}'
 #并流
 cat a.log|awk -F ',' '{split($1,a,".");if(a[4]>=200) print $0}'|sort >b.log
 cat a.log|awk -F ',' '{split($1,a,".");if(a[4]<=200 &&a[4]>150) print $0}'|sort >>b.log
 cat a.log|awk -F ',' '{split($1,a,".");if(a[4]>=200) print $0}'|sort >b.log 2>&1
 cat a.log|awk -F ',' '{split($1,a,".");if(a[4]>=200) print $0}'|sort 1>b.log 1>e.log
     文件处理
     系统性能查看
        #创建数组
         arr=(item,...,item)   **
         item=${arr[index]}
         len=${#arr[*]}
shell三元运算符
    #8、软件安装
         系统软件安装
         rpm -qa|grep vim
        yum -y remove vim-common-7.4.629-8.el7_9.x86_64
         yum -y remove vim-enhanced-7.4.629-8.el7_9.x86_64
         yum -y remove vim-filesystem-7.4.629-8.el7_9.x86_64
        yum search vim
         yum -y install vim
         yum -y install vim-minimal.x86_64 : A minimal version of the VIM editor
        绿色安装
         xxx.tar
         xxx.tar.gz
         xxx.tgz
        tar [-option] xxx.tar[.gz] -C dest_path
         -z    .gz
         -x    解压
         -c  压缩
         -v     展示解压或压缩的过程
         -f 固定格式
        RPM安装
             xxx.rpm
             rpm -ivh xxx.rpm
        手工编译安装
             #解压并切换值根目录
             #安装gc依赖
             make
             #配置
             #启动服务
             #起客户端访问
     #9 环境变量
     /etc/profile    shell文件    全局
     /etc/profile.d    目录
     ~/.bashrc    shell文件    当前用户
    #脚本执行方式
     #开启自shell执行
     ./script.sh
     bash script.sh
     #开启
    [root@single ~]# chmod u+x install2.sh
     [root@single ~]# source install2.sh
    编写脚本 删除、解压、配置、验证...
     #--------------------------------------------------------------------------------------
 #JDK安装(先把jdk压缩包拖到download下面)
     tar -zxvf jdk-8u171-linux-x64.tar.gz -C /opt/software/ 解压
     cd /opt/software/
     ls    查看
     mv jdk1.8.0_171/ jdk8     重命名
     ls
    #创建或编辑自定义环境变量shell脚本
     vim /etc/profile.d/my.sh  在这里配环境变量,系统文件不要动
     #--------------------------------------------------------------------
     #jdk 8
     export JAVA_HOME=/opt/software/jdk8
     export PATH=$JAVA_HOME/bin:$PATH
     export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
     #----------------------------------------------------------------------
     #每次添加新的环境变量要激活才能生效
     source /etc/profile
     java -version
 #SCALA安装(先把scala压缩包拖到download下面)
     [root@single jdk8]# tar -zxvf /opt/download/scala-2.12.10.tgz -C /opt/software/
     [root@single jdk8]# cd ../
     [root@single software]# ls
     jdk8  scala-2.12.10
    #创建或编辑自定义环境变量shell脚本
     vim /etc/profile.d/my.sh
     #-----------------------------------------------
     #scala 2.12
     export SCALA_HOME=/opt/software/scala212
     export PATH=$SCALA_HOME/bin:$PATH
     #-------------------------------------
     #每次添加新的环境变量要激活才能生效
     source /etc/profile
     #测试
     scala -version
     #进入客户端
     scala
     scala>...
     #9、MYSQL、JDK、SCALA










