shell命令
时间:2023-10-27 09:07:02
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