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 回到文件尾 nbsp; [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