Linux
课程大纲
课程链接:【小白入门 通俗易懂】韩顺平 一周学会Linux_哔哩哔哩_bilibili
P3-P85 Linux基础篇
P86-P90 Java定制篇
P91-P107 大数据shell篇
P108-P115 python定制篇
P117-P141 Linux高级篇
P142-P153 面试题
Vi和Vim编辑器
vi和vim各个模式的切换
命令模式 -> 一般/正常模式 vim xxx
一般/正常模式 -> 编辑模式 i 或 a
编辑模式 -> 一般/正常模式 ESC
一般/正常模式 -> 命令模式 : 或 /
命令模式 -> 一般/正常模式 ESC
命令模式 -> 退出 在命令行下 :wq(保存退出) :q(退出) :q!(强制退出)
常用快捷键
-
拷贝当前行 , yy , 拷贝当前行向下的 5 行 5yy,并粘贴(输入 p)。
-
删除当前行 dd , 删除当前行向下的 5 行 5dd
-
在文件中查找某个单词 [命令行下 /关键字 , 回车 查找 , 输入 n 就是查找下一个 ]
-
设置文件的行号,取消文件的行号.[命令行下 : set nu 和 :set nonu]
-
编辑 /etc/profile 文件,在一般模式下, 使用快捷键到该文档的最末行[G]和最首行[gg]
-
在一个文件中输入 “hello” ,在一般模式下, 然后又撤销这个动作 u
-
编辑 /etc/profile 文件,在一般模式下, 并将光标移动到 , 输入 20,再输入 shift+g
开机、重启和用户登录注销
关机、重启指令
把内存的数据同步到磁盘 sync
立该进行关机 shutdown –h now
halt
1分钟后关机 shutdown –h 1
现在重新启动计算机 shutdown –r now
reboot
-
不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中
-
目前的 shutdown/reboot/halt 等命令均已经在关机前进行了 sync
普通用户切换为管理员身份 su - root
注销用户,注:在图形运行级别无效,在运行级别 3 下有效 logout
修改用户密码 passwd 用户名
用户管理
添加用户 useradd 用户名
指定/修改密码 passwd 用户名
删除用户但是要保留家目录 userdel 用户名
删除用户以及用户主目录 userdel -r 用户名
查询用户信息 id 用户名
实用指令
指定运行级别
运行级别说明:
0 :关机
1 :单用户【找回丢失密码】
2:多用户状态没有网络服务
3:多用户状态有网络服务
4:系统未使用保留给用户
5:图形界面
6:系统重启
常用级别:3、5
命令 init 5
查看默认运行级别 systemctl get-default
指定运行级别为多用户 systemctl set-default multi-user.target
指定运行级别为图形界面 systemctl set-default graphical.target
开机流程示意图:
文件目录类
创建一个目录 mkdir /home/dog
创建多级目录 mkdir -p /home/animal/tiger
删除空目录 rmdir /home/dog
删除非空目录 rm -rf /home/animal
创建空文件 touch hello.txt
- -r :递归复制整个文件夹
复制文件 cp hello.txt /home/bbb
复制整个文件夹 cp -r /home/bbb /opt
强制覆盖不提示复制文件夹 \cp -r /home/bbb /opt
- -r :递归删除整个文件夹
- -f : 强制删除不提示
删除文件 rm /home/hello.txt
删除整个文件夹且不带提示 rm -rf /home/bbb
重命名 mv oldNameFile newNameFile
移动文件 mv /temp/movefile /targetFolder
- -n :显示行号
显示文件内容及行号 cat -n /etc/profile
显示文件内容[管道命令] cat -n /etc/profile | more
less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率
查看文件 less /opt/杂文.txt
获取主机名 echo $HOSTNAME
显示文件的开头部分内容(默认前10行) head /etc/profile
显示文件开头5行内容 head -n 5 /etc/profile
显示文件最后部分内容(默认后10行) tail /etc/profile
显示文件最后5行内容 tail -n 5 /etc/profile
实时监控文件变化 tail -f /home/mydate.txt
将 /home 目录下的文件列表 写入到 /home/info.txt 中, 覆盖写入[如果 info.txt 没有,则会创建]
ls -l /home > /home/info.txt
将当前日历信息追加到 /home/mycal 文件中 cal >> /home/mycal
给原文件创建一个软链接 ln -s /root /home/myroot
删除软连接 rm /home/myroot
显示所有的历史命令 history
显示最近使用过的 10 个指令 history 10
执行历史编号为 5 的指令 !5
时间日期类
date 指令
基本语法
-
date
(功能描述:显示当前时间) -
date +%Y
(功能描述:显示当前年份) -
date +%m
(功能描述:显示当前月份) -
date +%d
(功能描述:显示当前是哪一天) -
date "+%Y-%m-%d %H:%M:%S"
(功能描述:显示年月日时分秒)
设置系统当前时间 date -s "2020-11-03 20:02:10"
cal 指令
显示当月日历 cal
显示某年日历 cal 年份
搜索查找类
find 指令
按文件名查找 find / Hello.java
按拥有者查找 find /opt -user nobody
按文件大小查找 find / -size +200M
单位:k,M,G
以人类可读的方式显示当前目录中的文件和目录大小 ls -lh
locate 指令
locate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速
定位给定的文件。
- 创建 locate 数据库
updatedb
- 快速定位文件所在目录
locate Hello.java
which 指令
可以查看某个指令在哪个目录下
查看 ls 指令在哪个目录 which ls
grep 指令
- -n:显示匹配行及行号
- -i:忽略字母大小写
在 hello.txt 文件中,查找 “yes” 所在行
不显示行号 cat /home/hello.txt | grep "yes"
显示行号
cat /home/hello.txt | grep -n "yes"
grep -n "yes" /home/hello.txt
压缩解压类
gzip/gunzip 指令
gzip 用于压缩文件, gunzip 用于解压 (原文件不存在)
gzip 压缩 gzip /home/hello.txt
gunzip 解压缩 gunzip /home/hello.txt.gz
zip/unzip 指令
zip 用于压缩文件, unzip 用于解压,常用于项目打包发布 (原文件存在)
zip:
- -r:递归压缩,即压缩目录
压缩文件/文件夹 zip -r myhome.zip /home/
unzip
- -d<目录> :指定解压后文件的存放目录
解压缩到指定目录 mkdir /opt/tmp
unzip -d /opt/tmp /home/myhome.zip
tar 指令
tar 指令 是打包指令,最后打包后的文件是 .tar.gz 的文件
压缩文件夹 tar -zcvf myhome.tar.gz /home/
压缩多个文件 tar -zcvf pc.tar.gz /home/temp/pig.txt /home/temp/cat.txt
解压到当前目录 tar -zxvf pc.tar.gz
解压到指定目录 tar -zxvf /home/myhome.tar.gz -C /opt/tmp2
组管理和权限管理
组管理
查看文件的所有者 ls –ahl
修改文件所有者 chown tom hello.txt
创建组 monster groupadd monster
删除组 groupdel 组名
将用户放入该组 useradd -g monster fox
修改文件/目录所在组 chgrp fruit orange.txt
改变用户所在组
usermod –g 新组名 用户名
usermod –d 目录名 用户名
改变该用户登录的初始目录 **特别说明:**用户需要又进入新目录的权限
权限管理
权限的基本介绍
ls -l 中显示的内容如下:
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
0-9 位说明
第 0 位确定文件类型(d, - , l , c , b)
l 是链接,相当于 windows 的快捷方式
d 是目录,相当于 windows 的文件夹
c 是字符设备文件,鼠标,键盘
b 是块设备,比如硬盘
第 1-3 位确定所有者(该文件的所有者)拥有该文件的权限。—User
第 4-6 位确定所属组(同用户组的)拥有该文件的权限,—Group
第 7-9 位确定其他用户拥有该文件的权限 —Other
rwx 作用到文件
-
[ r ]代表可读(read): 可以读取,查看
-
[ w ]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
-
[ x ]代表可执行(execute):可以被执行
rwx 作用到目录
-
[ r ]代表可读(read): 可以读取,ls 查看目录内容
-
[ w ]代表可写(write): 可以修改, 对目录内创建+删除+重命名目录
-
[ x ]代表可执行(execute):可以进入该目录
可用数字表示为: r=4,w=2,x=1 因此 rwx=4+2+1=7 , 数字可以进行组合
1 | 文件:硬连接数 或 目录:子目录数 |
root | 用户 |
root | 组 |
1213 | 文件大小(字节),如果是文件夹,显示 4096 字节 |
Feb 2 09:39 | 最后修改日期 |
abc | 文件名 |
修改权限
- 通过 + 、-、= 变更权限
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o 的总和)
-
给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。
chmod u=rwx,g=rx,o=rx abc
-
给 abc 文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w abc
-
给 abc 文件的所有用户添加读的权限
chmod a+r abc
- 通过数字变更权限
r=4,w=2,x=1 -> 1=x,2=w,3=wx,4=r,5=rx,6=rw,7=rwx
将文件权限修改为 rWxr-xr-
:chmod 755 /home/temp/pig.txt
定时任务调度
crond 任务调度
-e | 编辑crontab定时任务 |
-l | 查询crontab任务 |
-r | 删除当前用户所有的crontab任务 |
Linux 磁盘分区、挂载
查询系统整体磁盘使用情况 df -h
统计/opt 文件夹下文件的个数 ls -l /opt | grep "^-" | wc -l
统计/opt 文件夹下目录的个数 ls -l /opt | grep "^d" | wc -l
统计/opt 文件夹下文件的个数,包括子文件夹里的 ls -lR /opt | grep "^-" | wc -l
统计/opt 文件夹下目录的个数,包括子文件夹里的 ls -lR /opt | grep "^d" | wc -l
以树状显示目录结构 tree 目录
- 安装tree
yum install tree
- 以树状显示目录结构
tree /home/
进程管理
- -e 显示所有进程
- -f 全格式
以全格式显示当前所有的进程 ps -ef|grep sshd
信息详解:
-
UID:用户 ID
-
PID:进程 ID
-
PPID:父进程 ID
-
C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表
-
明进程是 I/O 密集型运算,执行优先级会提高
-
STIME:进程启动的时间
-
TTY:完整的终端名称
-
TIME:CPU 时间
-
CMD:启动进程所用的命令和参数
-
-9 :表示强迫进程立即停止
通过进程号杀死/终止进程 kill [选项] 进程号
通过进程名称杀死进程,也支持通配符 killall 进程名称
以树状的形式显示进程的 pid pstree -p
以树状的形式进程的用户 pstree -u
使用 service 指令,查看,关闭,启动 network [
service network status
service network stop
service network start
查看服务名 setup
输入tab可切换至"确定"、“取消”
查看服务 chkconfig --list
通过 chkconfig 命令可以给服务的各个运行级别设置自 启动/关闭
把 network 在 3 运行级别,关闭/开启自启动
chkconfig --level 3 network off
chkconfig --level 3 network on
systemctl 管理指令
基本语法: systemctl [start | stop | restart | status] 服务名
查看服务开机启动状态, grep 可以进行过滤 systemctl list-unit-files [ | grep 服务名]
设置服务开机启动 systemctl enable 服务名
关闭服务开机启动 systemctl disable 服务名
查询某个服务是否是自启动的 systemctl is-enabled 服务名
- 打开端口:
firewall-cmd --permanent --add-port=端口号/协议
-
关闭端口:
firewall-cmd --permanent --remove-port=端口号/协议
-
打开/关闭后重新载入,才能生效 :
firewall-cmd --reload
-
查询端口是否开放:
firewall-cmd --query-port=端口/协议
动态监控进程
top 与 ps 命令很相似。它们都用来显示正在执行的进程。
Top 与 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的的进程
监控 tom 用户
- 输入
top
查看执行的进程 - 输入
u
再输入用户名,即可
结束 tom 登录
- 监控tom用户
- 输入
k
,再输入要结束的进程 ID 号 - 输入
9
强制执行
RPM 与 YUM
查询已安装的 rpm 列表 rpm -qa|grep firefox
Shell 编程
创建一个 Shell 脚本,输出 hello world!
vim hello.sh
#!/bin/bash
echo "hello,world~"
脚本的常用执行方式
- 使用
sh hello.sh
运行脚本 - 输入脚本的绝对路径或相对路径
首先使用命令 ll
查看文件是否有x权限。若无,则使用 chmod u+x hello.sh
增加
使用相对路径 ./hello.sh
或绝对路径 /home/temp/hello.sh
运行脚本
脚本变量
#!/bin/bash
#案例1:定义变量A
A=100
echo A=$A
#案例2:撤销变量A
unset A
echo "A=$A"
#案例3:声明静态的变量B=2,不能unset
readonly B=2
echo "B=$B"
#unset B
#将指令返回的结果赋给变量
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
位置参数变量
$*把所有的参数看成一个整体
$@把每个参数区分对待
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数的个数=$#"
运行脚本 sh position.sh 100 200
显示结果
0=position.sh 1=100 2=200
所有的参数=100 200
100 200
参数的个数=2
预定义变量
#!/bin/bash
echo "当前执行的进程id=$$"
#以后台的方式运行一个脚本,并获取他的进程号
/root/shcode/hello.sh &
echo "最后一次后台方式执行的进程 id=$!"
echo "执行的结果=$?"
运算符
-
“$((运算式))”或“$[运算式]”或者 expr m + n //expression 表达式
-
注意 expr 运算符间要有空格, 如果希望将 expr 的结果赋给某个变量,使用 ``
-
expr m - n
-
expr *, /, %
乘,除,取余
#!/bin/bash
#案例1:计算(2+3)X4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo "res1=$RES1"
#使用第二种方式,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
#使用第三种方式expr
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"
#案例2:请求出命令行的两个参数[整数]的和20 50
SUM=$[$1+$2]
echo "sum=$SUM"
XShell在vim编辑器中无法使用小键盘的解决方法_xshell vim中无法编辑-CSDN博客
条件判断
常用判断条件
-
= 字符串比较
-
两个整数的比较
-lt 小于
-le 小于等于 little equal
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
- 按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
- 按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
#!/bin/bash
#案例1:"ok"是否等于"ok"
#判断语句:使用 =
if [ "ok" = "ok" ]
then
echo "equal"
fi
#案例2:23是否大于等于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then
echo "大于"
fi
#案例3:/root/shcode/aaa.txt 目录中的文件是否存在
#判断语句: 使用 -f
if [ -f /home/shcode/ifdemo.sh ]
then
echo "存在"
fi
if [ xyz ]
then
echo "xyz"
fi
流程控制
- if 判断
#!/bin/bash
#如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
- case 语句
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
- for 循环
基本语法 1
for 变量 in 值 1 值 2 值 3…
do
程序/代码
done
#!/bin/bash
#案例1:打印命令行输入的参数【这里可以看出$*和$@的区别】
#注意$*是把输入的参数,当做一个整体,所以,只会输出一句
for i in "$*"
do
echo "num is $i"
done
echo "============================="
#使用$@来获取输入的参数,注意,这时是分别对待
for j in "$@"
do
echo "num is $j"
done
基本语法 2
for (( 初始值;循环控制条件;变量变化 ))
do
程序/代码
done
SUM=0
for(( i=1;i<=$1;i++ ))
do
SUM=$[ $SUM+$i ]
done
echo "SUM=$SUM"
while 循环
#!/bin/bash
#命令行输入一个数n,统计从1+..+n的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "执行结果SUM=$SUM"
read 读取控制台输入
选项:
-
-p:指定读取值时的提示符;
-
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
#!/bin/bash
#读取控制台输入一个NUM1值
read -p "请输入一个数 NUM1=" NUM1
echo "你输入的NUM1=$NUM1"
#案例2:读取控制台输入一个NUM2值,在10秒内输入。
read -t 10 -p "请10s内输入一个数 NUM2=" NUM2
echo "你输入的NUM2=$NUM2"
函数
- 系统函数
basename 基本语法
功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]
(功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
- 自定义函数
基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
#!/bin/bash
#计算输入两个参数的和(动态的获取), getSum
#定义函数 getSum
function getSum(){
SUM=$[$1+$2]
echo "SUM=$SUM"
}
#输入两个值
read -p "请输入一个数 n1=" n1
read -p "请输入一个数 n2=" n2
#调用自定义函数
getSum $1 $2
Shell 编程综合案例
-
每天凌晨 2:30 备份 数据库 hspedu 到 /data/backup/db
-
备份开始和备份结束能够给出相应的提示信息
-
备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2021-03-12_230201.tar.gz
-
在备份的同时,检查是否有 10 天前备份的数据库文件,如果有就将其删除。
/home/temp/mysql_db_backup.sh
#!/bin/bash
#备份目录
BACKUP=/home/temp/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库的地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=root
#备份的数据库名
DATABASE=mydatabase
#创建备份目录,如果不存在,就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#将文件处理成 tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
#删除10 天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf{} \;
echo "备份数据库${DATABASE}成功~"
设置定时任务 crontab -e
30 2 * * * /home/temp/mysql_db_backup.sh