第 1 章 Linux 文件与目录结构
Linux 系统中一切皆文件。
- /bin:存放最经常使用的命令
- /sbin:存放系统管理员使用的系统管理程序
- /home:存放普通用户的用户主目录
- /root:系统管理员的用户主目录
- /lib:库文件目录,包含了所有对系统有用的库文件
- /etc:所有系统管理所需的配置文件和子目录
- /usr:用户的应用程序和文件都放在这个目录下
- /opt:额外安装软件所在的目录(mysql、redis、zookeeper 等都放在这)
- /tmp:存放临时文件
- /var:将经常被修改的日志文件放在这个目录
- /boot:启动 Linux 时使用的核心文件
第 2 章 Vim 编辑器
| 语法 | 功能 |
|---|---|
| :wq | 保存退出 |
| :q / :q! | 不保存退出 / 不保存强制退出 |
| :set nu | 显示行号 |
| /要查找的词 | n 向下查找,N 向上查找 |
| :%s///g | 将所有的旧内容 old 替换为新内容 new |
| u | 撤销上一步 |
| G | 跳转到页尾 |
| shift+6(^)/ shift+4 ($) | 移动到行头/行尾 |
第 3 章 系统配置
3.1 修改网络 IP 地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改为静态 IP:
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="87b05f6b-2410-4424-95cb-7ca87158e993"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.239.100
GATEWAY=192.168.239.2
DNS1=192.168.239.2
编辑结束保存退出,重启网络服务:
systemctl restart network
# 查看 IP
ip a
3.2 三种网络连接模式
- 桥接模式:虚拟机直接连接外部网络,主机起到网桥的作用。该模式下,虚拟机可以直接访问外网,并且对外网可见
- NAT 模式:虚拟机和主机共享一个专用网络,并通过虚拟网络转换(NAT)设备对 IP 进行转换。虚拟机通过共享主机 IP 可以访问外网,但外网无法访问虚拟机
- 主机模式:虚拟机和主机共享一个专用网络,但无法访问外网
3.3 主机名
# 查看主机名
hostname
# 修改主机名
hostnamectl set-hostname <hostname>
修改 hosts 映射文件:
vim /etc/hosts
3.4 服务
查看所有服务:
cd /usr/lib/systemd/system
ls
查看服务开机启动状态:
systemctl list-unit-files
3.5 关机重启
将数据由内存同步到硬盘中:
sync
重启:
reboot
第 4 章 文件目录类
4.1 切换目录
cd <directory-name> # 切换目录
cd # 切换到根目录
cd - # 切换到所处的上一个目录
cd .. # 切换到当前目录的上一级目录
./ # 当前目录
../ # 上一级目录
~/ # 主目录
4.2 创建目录
mkdir <directory-name> # 创建目录
mkdir -p <directory>/<directory>/... # 创建多级目录
4.3 查找文件
ls | grep .cfg # 查找当前目录下后缀是 .cfg 的文件
find /<directory> -name <file-name> # 根据名称查找目录下的文件
find /<directory> -name "*.txt" # 查找目录下以 txt 结尾的文件
4.4 查看文件
cat -n <file-name> # 查看文件内容
tail -n 2 <file-name> # 查看一个文件的最后两行
tail -f <file-name> # 显示文件最新追加的内容,监视文件变化
wc <file-name> # 显示文件的行数、单词数、字节数
4.5 删除目录中所有内容
rm -rf <directory-name>/
4.6 修改文件权限
我们可以使用 ll 命令来显示一个文件的属性以及文件所属的用户和组:
第一个字符代表这个文件是目录还是文件:- 代表文件,d 代表目录:
chmod 644 <file-name> # 修改文件权限为属主可读写,其他人只可读
chmod 777 <file-name> # 修改文件权限为所有人可读可写可执行
chmod +x <file-name> # 修改文件权限为可执行文件
| r | 可读权限,八进制为 4 |
|---|---|
| w | 可写权限,八进制为 2 |
| x | 可执行权限,八进制为 1 |
| - | 没有对应权限,八进制为 0 |
4.7 > 输出重定向和 >> 追加
# 将 context 内容写到文件中(覆盖原有内容)
echo <context> > <file-name>
# 将 context 内容追加到文件中(不覆盖原有内容)
echo <context> >> <file-name>
4.8 tar 打包解压
# 解压到当前目录
tar -zxvf XXX.tar.gz
# 解压到指定目录 /opt 下
tar -zxvf XXX.tar.gz -C /opt
4.9 管道操作符 |
将前一个命令的输出作为后一个命令的输入:
第 5 章 进程管理类
5.1 网络端口号
netstat –nltp | grep <port> # 查看某端口号是否被占用
5.2 查看进程
ps -ef # 显示所有进程信息
ps -ef | grep <pid> # 显示进程号为 pid 的进程信息
ps -ef | grep <process-name> # 显示某进程的信息
5.3 删除进程
kill -9 <pid>
5.4 实时监控系统进程状态
top # 查看所有进程信息
top -p <pid> # 仅查看指定 pid 的进程信息
命令显示的内容:
- 第一行:任务队列消息,包括系统当前时间,已运行时间,当前登录用户数量以及平均负载
- 第二行:进程数量信息:包括运行进程、睡眠进程、停止进程和僵尸进程数量
- 第三行: CPU 信息:us 是用户空间占用 CPU 的百分比;sy 是内核空间占用 CPU 的百分比;id 是空闲 CPU 百分比;wa 是 IO 等待占用 CPU 的百分比
- 第四行:物理内存信息
- 第五行:交换分区信息
- 第七行以下:各进程(任务)的状态监控
PR — 进程优先级
NI — nice 值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存大小,单位 kb
RES — 进程使用的物理内存大小,单位 kb
SHR — 共享内存大小,单位 kb
S —进程状态,R 是运行状态,S 是睡眠状态
%CPU — CPU 时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的 CPU 时间总计,单位 1/100 秒
COMMAND — 进程名称
第 6 章 Shell 编程
Centos 默认的解析器是 bash:
6.1 脚本的常用执行方式
第一种:输入脚本路径,脚本必须具有 +x 权限(最常用):
chmod +x <XXX.sh>
./<XXX.sh> <参数列表>
该执行方式是在当前 shell 中打开一个子 shell 来执行脚本内容,脚本结束后子 shell 关闭,回到父 shell 中。
第二种:在脚本的路径前加上 source:
source <XXX.sh> <参数列表>
该执行方式使脚本内容在当前 shell 里执行,而无需打开子 shell。这也是为什么我们每次要修改完 /etc/profile 文件以后,需要 source 一下的原因。
6.2 变量
6.2.1 全局环境变量
常用环境变量有 PWD、USER 等,查看变量值命令为:
echo $HOME
6.2.2 变量定义
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 变量默认类型都是字符串类型,无法直接进行数值运算
A=5
6.2.3 变量使用
使用一个定义过的变量,尽量将变量名用 {} 括起来,再在前面加 $ 。以下是一些特殊变量:
- 0 代表该脚本名称,9 代表第一到第九个参数
- $#:获取脚本输入参数总个数
- $*:获取脚本所有输入参数,把所有的参数看成一个整体
- $@:获取脚本所有输入参数,把每个参数区分开
- $?:表示最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值非 0,则证明上一个命令执行不正确
6.2.4 字符串变量
字符串变量建议使用双引号括起来,双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
获取字符串长度:
string="abcd"
echo ${#string}
提取子字符串:
string="alibaba"
# 输出索引 1-5 的字符串(Java 输出索引 1-4)
echo ${string:1:5}
6.2.5 数组变量
只支持一维数组,没有限定数组大小。定义数组:
array_name=(val1 val2 ...)
读取数组:
${数组名[下标]}
# 获取所有元素
${数组名[@]}
# 获取数组长度
${#数组名[@]}
6.3 运算符
使用 expr 和 来进行运算,注意表达式和运算符之间必须要有空格:
val=`expr 1 + 1`
echo $val
条件表达式要放在方括号内,并且两边都要有空格:
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "a 不等于 b"
fi
条件判断运算符:
| -eq /-ne | 等于 /不等于 |
|---|---|
| -lt / -gt | 小于 / 大于 |
| -le / -ge | 小于等于 / 大于等于 |
| ! / -o / -a | 非 / 或 /与运算 |
| -z str / $str | 字符串变量 $str 长度为 0 / 不为 0 / 不为空返回 true |
6.4 流程控制(⭐)
6.4.1 if
单分支:
if [ 条件判断式 ]
then
程序
fi
多分支:
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项: [ 条件判断式 ] 的中括号和条件判断式之间必须有空格;if 后要有空格
6.4.2 case 语句
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
省略其他分支 ...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
;; 表示命令序列结束,相当于 java 中的 break。*)表示默认模式,相当于 java 中的 default。
6.4.3 for 循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值1 值2 值3…
do
程序
done
6.4.4 while 循环
while [ 条件判断式 ]
do
程序
done