⭐表示重要。

第一章:背景知识

1.1 Linux 系统中一切皆文件

  • 在 Linux 系统中任何东西都是以文件的形式来存储的,这其中不仅包括我们熟悉的文本文件、可执行文件等,还包括硬件设备、虚拟设备、网络连接等等,甚至连目录其实都是一种特殊的文件。

1.2 Linux 的文件系统

  • Linux 系统环境下的文件系统和 Windows 有很大区别。
  • 在 Windows 中,每一个盘符下是一个独立的文件系统,硬盘有多少个分区就有多少个文件系统。

Windows文件系统.png

  • 在 Linux 系统中不管创建了多少个硬盘分区都只有一个文件系统,整个文件系统的根目录是 / ,从 / 出发可以找到 Linux 系统中的所有目录和文件。

Linux文件系统.png

1.3 Linux 系统中的路径

  • 绝对路径:以 / 根目录开始逐层查找文件和目录。
  1. /etc/sysconfig/network-scripts
  1. /tmp/vmware-root/vmware-db.pl.2267
  • 相对路径:以当前目录或上一级目录为基准逐层查找文件和目录。
  1. ./ # 当前目录
  1. ../ # 当前目录的上一级目录

./ 如果省略不写,也表示当前目录。

  • / 表示的是最顶层、最上面的那个根目录,不是当前目录

根目录和当前目录的区别.png

  • 除非你现在所在的位置就是根目录那里,否则 /./ 完全是两码事。

1.4 用户的家目录

  • Linux 是一个多用户系统,每个登录到系统的用户都需要有一个自己专属的目录保存自己私有的文件。
  • 系统看到了这个需求,所以每创建一个用户,系统就会在 /home 目录下创建一个和用户同名的目录作为这个用户的家目录,比如:创建一个名为 tom 的用户,它的家目录就是 /home/tom
  • 可以使用 ~ 代表用户的家目录。
  • 如果是系统的超级管理员 rootroot 用户的家目录是 /root 目录。

1.5 文件扩展名不敏感

  • 在 windows 系统中,操作系统会负责根据文件扩展名识别文件类型,然后再根据文件类型匹配打开这种文件的应用程序,让用户不必记住大量的对应关系,用哪个直接打开就可以了。
  • 但是,Linux 是一个命令行操作系统,虽然现在也有了图形化界面,但是还是以命令行为主。
  • Linux 系统中通常使用命令去打开文件,而这个命令是否和文件匹配,就需要运行命令的人自己注意。

1.6 一级目录简介

目录名 是否重要 作用
/bin bin是binary的缩写,这个目录存放着最经常使用的命令。
/boot 这里存放的是启动Linux时用到的引导程序文件。
/dev device(设备)的缩写,该目录下存放的是Linux的外部设备。
/etc 存放系统和第三方应用程序的配置文件。
/home 存放普通用户家目录。
/lib 和 /lib64 系统开机所需要最基本的动态连接共享库。
/media 挂载Linux系统会自动识别的设备,例如U盘、光驱等。
/mnt 专门用于挂载操作的目录。
/opt 存放安装第三方应用程序时使用的压缩包文件。
/proc 这个目录是一个虚拟的目录,它是系统内存的映射。
/root 超级管理员root用户的家目录。
/run 存放进程产生的临时文件,关机重启后会消失。
/sbin s是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
/srv service缩写,该目录存放一些服务启动之后需要提取的数据。
/sys 该目录下安装了2.6内核中新出现的一个文件系统sysfs。
/tmp 存放临时文件。
/usr 应用程序的默认安装目录,类似于Windows下的program files目录。
/var 存放经常变化的内容,例如日志文件。

第二章:文件和目录相关命令(⭐)

2.1 快捷键

  • 命令行环境下快捷键: | 按键 | 作用 | | —- | —- | | Ctrl + l | 清屏 | | Ctrl + c | 强制终止程序 | | Ctrl + Insert | 复制 | | Shift + Insert | 粘贴 | | Ctrl + s | 锁屏 | | Ctrl + q | 解除锁屏 | | tab | 自动补全 |
  • 清屏:
  1. Ctrl + l

清屏.gif

  • 强制终止程序:
  1. Ctrl + c

强行终止程序.gif

  • 复制:
  1. Ctrl + Insert
  • 粘贴:
  1. Shift + Insert

复制和粘贴.gif

  • 锁屏:
  1. Ctrl + s
  • 解除锁屏:
  1. Ctrl + q

锁屏和解除锁屏.gif

  • 自动补全:
  1. tab

tab自动补全.gif

2.2 mkdir

  • 命令:
  1. mkdir [-pv] 新目录的路径
  • 参数 -pv 表示创建多层目录。
  • 作用:创建目录。

  • 示例:创建单层目录

mkdir aaa

创建单层目录.gif

  • 示例:创建多层目录
mkdir -pv bbb/ccc

创建多层目录.gif

2.3 cd

  • 命令:
cd 目标目录路径
  • 作用:切换目录。

  • 示例:使用绝对路径

cd /etc/sysconfig

切换目录使用绝对路径.gif

  • 示例:使用相对路径
cd aaa

切换目录使用相对路径.gif

  • 示例:切换到家目录
cd ~
cd

切换到家目录.gif

2.4 ls

  • 命令:
ls [-l][-A][-R] 文件或目录的路径
  • 参数 -l 以详细信息形式显示资源。
  • 参数 -A 显示目录内容时把隐藏资源也显示出来。
  • 参数 -R 递归查看目录内容。
  • 命令的参数既可以单独使用也可以组合使用。同时 ls -l 可以简写为 ll
  • 作用:列出目录中的内容,这里所说的目录可以是当前目录也可以是其他目录(需要指定路径)。

  • 示例:

ll

ls示例1.gif

  • 示例:
ls -A
ll -A

ls示例2.gif

  • 示例:
ll -R aaa

ls示例3.gif

2.5 pwd

  • 命令:
pwd
  • 作用:打印当前所在的目录。

  • 示例:

pwd

pwd示例.gif

2.6 touch

  • 命令:
touch 新建文件的路径
  • 作用:创建空文件。

  • 示例:

touch hello.java

touch示例.gif

2.7 cp

  • 复制文件命令:
cp 被复制的文件的路径 目标目录的路径
  • 复制目录命令:
cp -r 被复制的目录的路径 目标目录的路径
  • 参数 -r 等同于 -R

  • 示例:

cp hello.java aaa

复制文件示例.gif

  • 示例:
cp -R aaa bbb

复制目录示例.gif

2.8 mv

  • 命令:
mv 被移动的文件或目录的路径 目标目录
  • 将目录或文件在当前位置移动可以起到重命名的作用。
  • 示例:
mv aaa bbb

mv示例.gif

2.9 rm

  • 删除文件命令:
rm 被删除文件的路径
  • 强制删除文件命令:
rm -f 被删除文件的路径
  • 递归删除目录:
rm -r 被删除的目录的路径
  • 强制删除目录:
rm -rf 被删除的目录的路径
  • 示例:
rm hello.java

rm删除文件示例.gif

  • 示例:
rm -f hello.java

rm强制删除文件.gif

  • 示例:
rm -f aaa

rm删除目录示例.gif

  • 示例:
rm -rf aaa

rm强制删除目录示例.gif

2.10 vim

2.10.1 简介

  • 命令:
vim
  • 作用:在命令行环境下编辑文本文件。

注意:在命令行模式下没有鼠标,所以刚开始会觉得非常不习惯,但是慢慢熟练之后会发现,不用鼠标全部用键盘的操作效率也很高。

2.10.2 三种模式

  • 一般模式:通过按键控制 vim 工作。
  • 编辑模式:可以自由输入。
  • 指令模式:通过执行指令完成一些特殊的操作。

vim的三种模式.png

2.10.3 基本操作

  • ① 打开一个文件(即使文本不存在,也没关系,vim知道我们打算新建一个文件):
vim content.txt

vim打开一个文件.gif

  • ② 进入编辑模式(方式很多种,现在先使用一种方法,按一下 i 键):
i

vim进入编辑模式.gif

注意:按键的时候,屏幕上是不显示 i 的,但是左下角会显示插入(中文环境)或 Insert(英文环境)。

  • 随意输入一些内容:
PHP 是世界上最好的语言

vim进入编辑模式后随意输入内容.gif

  • 按 Esc 键回到一般模式:
Esc

按 Esc 回到一般模式.gif

  • ③ 显示行号:在一般模式,输入英文冒号(:),然后输入 set nu 就可以显示行号了。
:set nu

显示行号.gif

  • ④ 保存已修改的内容(执行完 :set nu 指令后,vim 又回到一般模式,使用 :w 指令可以保存文件):
:w

保存已修改的内容.gif

  • ⑤ 退出(使用 :q 指令就可以退出 vim 了):
:q

退出.gif

  • ⑥ 保存退出:
:wq

保存退出.gif

  • ⑦ 不保存退出:
:q!

不保存退出.gif

2.10.4 看

  • ① 上下左右移动光标。
  • 方法一:很容易上手的操作方式,但是距离基准键位较远,熟练使用之后敲击键盘的速度大幅度提升。

上下左右移动光标方法一.png

上下左右移动光标方法一的示例.gif

  • 方法二:就在基准键上。

上下左右移动光标方法二.png

上下左右移动光标方法二的示例.gif

  • ② 前往指定行:
  • 第一行:
gg
1 + shift + g

前往第一行.gif

  • 最后一行:
shift + g

前往最后一行.gif

  • 指定行号(n 表示行号):
n + shift + g

前往指定行.gif

2.10.5 改

  • 这里我们说的是在一般模式下通过按键来编辑文件,并不是进入编辑模式。 | 按键 | 效果 | | —- | —- | | dd | 删除光标所在的行 | | d5d | 从光标所在行开始,向下连续删除5行(包括光标所在行) | | u | 撤销刚才的操作 | | Ctrl + r | 重做刚才撤销的操作 | | yy | 复制光标所在的行 | | p | 将当前复制的行粘贴到光标所在位置的下一行 | | y5y | 从光标所在行开始,向下连续复制5行(包括光标所在行) | | r | 替换光标所在位置的一个字符。第一步:按一下 r 键 第二步:输入新的字符 |

2.10.6 编

  • 这里我们要看看有哪些方法可以进入编辑模式。 | 按键 | 大小写说明 | 光标动作 | | —- | —- | —- | | i | 小写 | 不动,就在 当前位置
    ,开始输入 | | I | 大写 | 移动到 行的开头
    ,开始输入 | | a | 小写 | 光标 向后移动一格
    ,然后开始输入 | | A | 大写 | 光标移动到 行的末尾
    ,然后开始输入 | | o | 小写 | 先在光标所在行的 下面插入空行
    ,然后把光标移动到空行的开头,再开始输入 |

2.10.7 搜

  • ① 初始状态:

vim搜索的初始状态.gif

  • ② 进入指令模式(专门用于搜索关键词的指令模式):
/

vim搜索进入指令模式.gif

  • ③ 输入关键词:
java

vim搜索输入关键词.gif

  • ④ 回车执行搜索(关键词匹配到的内容会高亮显示):

vim搜索回车执行搜索.gif

  • ⑤ 遍历匹配内容(在匹配到搜索结果后,可以逐个遍历各个匹配内容):
# 向下找
n
# 向上找
shift + n

vim搜索遍历匹配内容.gif

  • ⑥ 取消高亮显示:
:noh

vim搜索取消高亮显示.gif

2.10.8 替

  • ① 准备文件内容:
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?
Oh,hello tom!Do you think this is a good time for me to say hello to Lily?

vim替换准备文件内容.gif

  • ② 执行替换:
:%s/hello/hi
  • 命令解释:

vim执行替换的命令解释.png

vim替换执行替换.gif

注意:这时我们看到每一行只有第一个匹配的内容被替换了,后面的没有被替换。这是因为对正则表达式来说,它是以行为单位查找匹配的内容。每一行只要找到第一个匹配那么就可以判断这一行就是匹配的,没有必要继续向后查找了。如果我们需要将一行中的每一个匹配都替换,可以在指令后加 /g

  • ③ 全部替换:
:%s/hello/hi/g

vim替换全部替换.gif

2.11 cat

  • 命令:
cat 文件的路径
  • 作用:显示文件全部内容。
  • 适用场景:较短小的文件。

  • 示例:

cat示例.gif

2.12 less

  • 命令:
less 文件路径
  • 作用:分屏查看文件内容。 | 按键 | 效果 | | —- | —- | | 空格 | 向下滚动一屏 | | b | 向上滚动一屏 | | 回车 | 向下滚动一行 | | q | 退出 | | /关键词 | 搜索 n向下找 N向上找 | | = | 显示详细的文件信息 |
  • 示例:
less content.txt

less示例.gif

2.13 tail

  • 命令:
tail -n 5 文件的路径
  • 作用:显示文件末尾的5行。
  • 命令:
tail -F 文件的路径
  • 作用:实时查看文件末尾新增的内容。

  • 示例:

tail -n 5 content.txt

tail示例1.gif

  • 示例:
tail -F content.txt

tail示例2.gif

2.14 find

  • 命令:
 find 查找范围 参数 表达式
  • 示例:
find /root -name "*.txt"

find示例.gif

2.15 locate

2.15.1 简介

  • locate(中文翻译为:定位) 命令同样用来查询文件或目录,但是它是基于索引查询,速度快很多。

2.15.2 索引

  • 建立索引可以极大的提高查询的速度,为什么会有这么显著的效果呢?
  • 字典举例。
    • 没有索引:从正文第一页开始翻,在每一页中检查有没有自己想要找的字。在最差的情况下需要逐页翻到字典的最后一页,这样做速度非常慢。
    • 基于索引:字典正文前的检字表就是正文内容的索引。先从检字表里快速的找到那个字,虽然没有这个字的详细信息,但是有这个字所在的页码,我们可以根据这个页码就可以直接到正文中直接翻到那一页,这样速度就非常快。

检字表.png

  • 去一幢大楼找房间举例:肯定是先在一楼看看楼层介绍信息,找到房间号直接去,而不是一个房间一个房间的去找。

去一幢大楼找房间.png

2.15.3 locate 命令的原理

locate 命令的原理.png

  • 系统启动的时候会将每一个目录、每一个文件的完整路径保存到索引库中,使用 locate 命令搜索关键词时,就使用关键词查询索引库,将匹配的路径字符串返回。
  • 但是,新建的文件或目录不会被系统将路径存入索引库中,那么使用 locate 命令就搜索不到,此时使用 updatedb 命令更新一下索引库即可。

2.15.4 操作演示

  • 示例:使用 locate 命令搜索文件
locate boot.log

locate示例1.gif

  • 示例:新建文件后,使用 locate 命令搜索
touch hello.java
locate hello.java

locate示例2.gif

  • 示例:更新索引库后,使用 locate 命令搜索
updatedb
locate hello.java

locate示例3.gif

2.16 grep

  • 命令:
grep 参数 查找内容 文件路径
  • 参数 -v 表示返回不匹配的行。
  • 参数 -n 表示显示行号。
  • 查找内容可以是正则表达式。
  • 作用:将文件内容中匹配的行返回。

  • 示例:

grep Java content.txt

grep示例1.gif

grep 命令的关键词匹配和 vim 中的关键词搜索的区别:

  • ① vim 需要打开文件进入到 vim 自己的界面中,而 grep 不需要。
  • ② grep 命令显示搜索结果时可以将匹配行抽取出来显示,而 vim 是在全部文件中将关键词高亮显示。
  • ③ grep 命令可以同时搜索多个文件。
  • ④ grep 命令还有其它更加丰富的用法。
  • 示例:返回匹配的行并显示行号。
grep -n Java content.txt

grep示例2.gif

  • 示例:显示不匹配的行并显示行号
grep -nv Java content.txt

grep示例3.gif

2.17 pipe(管道,不是命令)

2.17.1 简介

  • 管道不是命令,而是一个符号 |
  • 用法:
命令 A | 命令 B
  • 作用:将命令 A 的输出作为命令 B 的输入。

2.17.2 操作演示

  • ① 需求:列出当前目录下的所有文件。
  • ② 如果使用 ll 命令,会将文件和目录都显示出来
ll

管道命令示例1.png

  • ③ 文件的目录的特征是,文件以 - 开头,目录以 d 开头,那么可以安装特征编写正则表达式
# 匹配以 - 开头的行
^-
  • ④ 使用管道列出当前目录下的所有文件
ll | grep ^-

管道命令示例2.png

  • ⑤ 统计当前目录下的文件的数量(wc -l 命令可以统计文本数据的行数)
ll | grep ^- | wc -l

管道命令示例3.png

2.18 tar

2.18.1 简介

  • 在 Linux 系统中,很多程序的安装包都是以 tar 包的形式提供下载的,比如:Tomcat

tar 命令简介.png

2.18.2 tar 解压命令

  • 命令:
tar -zxvf tar包的路径 -C 需要解压的目录路径
  • 参数作用说明: | 参数名称 | 作用 | | —- | —- | | -z | 用 gzip 对存档压缩或解压 | | -x | 解压 | | -v | 详细显示处理的文件 | | -f | 指定存档或设备 (缺省为 /dev/rmt0) |

注意:默认解压到当前目录下,如果当前目录中有同名目录或文件会直接覆盖,没有任何提示。

  • 示例:
tar -zxvf apache-tomcat-8.5.73.tar.gz

tar 命令示例.gif

第三章:进程相关命令(⭐)

3.1 ps

3.1.1 简介

  • 命令:
ps [-ef]
  • 参数 -e (entire,表示全部)指显示系统中全部的进程信息。
  • 参数 -f (full-formate)表示完整格式。
  • 作用:查看系统中运行的进程。

  • 示例:

ps -ef

ps 示例1.gif

3.1.2 进程信息中各列数据说明

列名 含义
UID 进程的用户信息
PID 进程id。由系统分配,不会重复。
PPID 父进程的id。父进程和子进程的关系是:父进程启动了子进程。
CMD 当前进程所对应的程序。
C 用整数表示的CPU使用率
STIME 进程启动时间
TTY 进程所在终端。所谓终端就是用户输入命令的操作界面。
TIME 进程所占用的CPU时间

3.1.3 父进程和子进程之间的关系

  • 简单来说,父进程和子进程的关系是:父进程启动了子进程,可以使用 pstree 命令查看整个进程数。

  • 示例:

pstree

ps 示例2.png

3.1.4 和其它命令配合使用

  • ① 分屏查看进程信息:全部进程的信息太多了,一屏无法全部显示,所以我们希望可以分屏显示并由我们来控制翻页。为了达到这个目标,我们可以使用管道符号将 ps -ef 命令的输出数据传送给 less 命令。

  • 示例:

ps -ef | less

ps 示例3.gif

  • ② 精确查询一个具体进程信息:我们通过 Xshell 远程连接 Linux 系统,靠的是 sshd 这个服务。这个服务如果正在运行中,那么一定会有这个服务对应的进程。所以下面我们来查询一下 sshd 这个命令的进程。

  • 示例:

ps -ef | grep -i sshd | grep -v grep

ps 示例4.png

3.2 kill

3.2.1 简介

  • 命令:
kill -9 进程id
  • 作用:杀死进程。
  • 说明:kill 命令本质上是给进程发送信号。

3.2.2 操作演示

  • ① 打开火狐浏览器。

打开火狐浏览器.png

  • ② 查看火狐浏览器的进程 id :
ps -ef | grep -i firefox | grep -v grep

查看火狐浏览器的进程 id.png

  • ③ 使用kill命令结束火狐浏览器进程:
kill -9 5059

使用kill命令结束火狐浏览器进程.gif

3.3 top

  • 命令:
top
  • 作用:实时查看系统运行情况和健康状态。
  • 命令与参数: | 命令名 | 更新时间间隔(秒) | 不显示任何闲置或者僵死进程 | 通过进程id监控单一进程 | | —- | —- | —- | —- | | top | -d 间隔秒数 | -i | -p 进程id |

  • 操作控制: | 按键 | 功能 | | —- | —- | | P | 默认值,根据CPU使用率排序 | | M | 以内存的使用率排序 | | N | 以PID排序 | | d | 设置数据刷新的时间间隔,单位是秒 | | q | 退出 |

  • 示例:指定间隔秒数,默认为 3 秒
top -d 2

top 示例1.gif

  • 示例:不显示僵尸进程
top -i

top 示例2.gif

  • 示例:监控单一线程
top -p 1189

top 示例3.gif

  • 示例:操作控制

top 示例4.gif

  • 示例:查询结果字段解释

top 查询结果字段解释.png

  • 第一行信息为任务队列信息: | 内容举例 | 说明 | | —- | —- | | 14:12:01 | 系统当前时间 | | up 6:04 | 系统的运行时间,前面例子表示本机已经运行6小时4分钟 | | 2 users | 当前登录了2个用户 | | load average:0.00, 0.02, 0.05 | 系统在之前1分钟,5分钟,15分钟的平均负载。 一般认为小于1时,负载较小。如果大于1,系统已经超出负荷。 |
  • 第二行为进程信息: | 内容举例 | 说明 | | —- | —- | | Tasks: 210 total | 系统中的进程总数 | | 1 running | 正在运行的进程数 | | 209 sleeping | 睡眠的进程 | | 0 stopped | 正在停止的进程 | | 0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
  • 第三行为 CPU 信息: | 内容举例 | 说明 | | —- | —- | | Cpu(s):3.0%us | 用户空间占用的CPU百分比,us对应user | | 3.0%sy | 内核空间占用的CPU百分比,sy对应system | | 0.0%ni | 改变过优先级的进程占用的CPU百分比,ni对应niced | | 93.9%id | 空闲CPU的CPU百分比 | | 0.1%wa | 等待输入/输出的进程的占用CPU百分比,wa对应IO wait | | 0.0%hi | 硬中断请求服务占用的CPU百分比,hi对应hardware IRQ | | 0.0%si | 软中断请求服务占用的CPU百分比,si对应software IRQ | | 0.0%st | st(Steal time)虚拟时间百分比,也叫被hypervisor偷走的时间。 就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比。 |
  • 第四行为物理内存信息: | 内容举例 | 说明 | | —- | —- | | 3861295 total | 物理内存的总量,单位KB | | 1037800 free | 空闲的物理内存数量 | | 943564 used | 已经使用的物理内存数量 | | 1879928 buff/cache | 作为缓冲的内存数量 |
  • 使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是还未纳入内核管控范围的数量。
  • 纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存还给 free ,因此 Linux 系统运行过程中 free 内存会越来越少,但不影响系统运行。因为这表示更多的空闲内存被内核管理了。
  • 第五行为交换分区(swap)信息: | 内容举例 | 说明 | | —- | —- | | 3145724 total | 交换分区(虚拟内存)的总大小 | | 3145724 free | 空闲交换分区的大小 | | 0 used | 已经使用的交互分区的大小 | | 2649008 avail Mem | 在不交换的情况下,对启动新应用程序可用内存的估计 |

交换分区是一个非常值得关注的地方,如果 swap 区的 used 数值持续发生变化那么说明在内核和交换分区之间正在持续发生数据交换,这表示内存不够用了——必须不断把内存中的数据保存到硬盘上。

3.4 netstat

3.4.1 简介

  • 命令:
netstat -anp
  • 作用:查看网络状态。 | 参数名 | 作用 | | —- | —- | | -a | 显示所有正在或不在侦听的套接字。 | | -n | 显示数字形式地址而不是去解析主机、端口或用户名。 | | -p | 显示套接字所属进程的 PID 和名称。 |

3.4.2 说明

  • netstat 命令显示的网络状态信息包含两部分内容:
  • ① 本机和外部的连接状态信息。

本机和外部的连接状态信息.png

  • ② 本机系统内部进程间通信信息。

本机系统内部进程间通信信息.png

3.4.3 和其它命令配合使用

  • ① 分屏查看:
netstat -anp | less

netstat 示例1.gif

  • ② 根据进程名查看网络状态:
netstat -anp | grep sshd

netstat 示例2.gif

  • ③ 根据端口号查看网络状态:
netstat -anp | grep :22

netstat 示例3.gif

第四章:辅助命令(⭐)

4.1 history

  • 命令:
history
  • 作用:查看命令历史。

  • 示例:

history

history 示例.gif

技巧:将命令运行的结果写入文件

  • 覆盖写:命令 > 文件路径。
  • 追加写:命令 >> 文件路径。

注意:/dev/null,被称为 Linux 的黑洞,因为不管写入多少数据到这个文件,数据都会被销毁。

4.2 echo

4.2.1 简介

  • 命令:
echo xxx
  • 作用:将数据输出到 standard output(标准输出),echo 主要用来打印环境变量的值。

4.2.2 关于standard output

  • 如果说将一条数据打印到标准输出,那么就可以说:打印到命令行窗口。
  • 对于 Java 代码:
System.out.println("Hello World!");
  • 上面这行 Java 代码将字符串打印到了控制台,而如果我们我们把这段 Java 程序拿到 Linux 系统来执行,那么它就打印到 standard output 了。

4.2.3 输出环境变量

  • ① Linux 中引用环境变量:在 Linux 中通过 $ 来引用环境变量
$PATH
  • ② 使用 echo 输出环境变量:
echo $PATH

使用 echo 输出环境变量.png

4.3 help(不是命令,是一系列命令的集合)

4.3.1 简介

  • 在我们学习一个新的命令时,Linux 系统自带的 官方命令手册 就是非常权威的参考文档。
  • man 命令和 info 命令都可以调出一个命令对应的文档。区别在于 man 命令阅读体验略好,info 命令文档内容更完整。

4.3.2 man

  • 命令:
man 要查询的命令
  • 控制方式: | 按键 | 说明 | | —- | —- | | 空格 | 向下滚动一屏 | | 回车 | 向下滚动一行 | | b | 向上滚动一屏 | | q | 退出 | | /关键词 | 搜索关键词 n向下找 N向上找 |
  • 示例:
man date

man 的示例.gif

4.3.3 info

  • 命令:
info 要查询的命令
  • 控制方式: | 按键 | 说明 | | —- | —- | | Up | Move up one line | | Down | Move down one line | | DEL | Scroll backward one screenful | | SPC | Scroll forward one screenful | | PgUp | Scroll backward in this window | | PgDn | Scroll forward in this window |
  • 示例:
info ls

info 示例.gif

4.3.4 补充

  • 大部分命令都有 —help 参数,也起到参考文档作用。
  • 示例:
ls --help

--help 示例.gif

4.4 关机重启

4.4.1 意识

  • 服务器 不要轻易关机! 执行关机或重启操作前一定要问自己下面的问题:
    • 我现在操作的具体是哪一台服务器?
    • 这台服务器是否是生产服务器?
    • 这台服务器可能有哪些人登录?
    • 我关机或重启后对其他人是否有影响?
    • 这台服务器关机或重启是否会导致其他服务器无法正常工作?
    • 我现在的操作是否必须通过关机或重启来实现?
    • ……
  • 一旦错误的关闭或重启了服务器,有可能会给公司造成无法弥补的损失。如果后果严重是有可能承担 法律责任 的。

4.4.2 相关命令

命令 作用
sync 将内存数据保存到硬盘上
poweroff 关机
reboot 重启

4.5 backslash(\,不是命令)

  • 符号:
\
  • 作用:如果一个命令特别长,那么可以使用反斜杠表示到下一行继续输入。

  • 示例:

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

4.6 curl

  • 命令:
curl [-X] [GET|POST...] 资源的URL地址
  • 作用:通过命令给服务器发送请求。
  • 官方文档:curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP , HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.
  • 从文档中我们可以看到 curl 命令支持的通信协议非常丰富,其中我们最常用的还是 HTTP 协议。如果有需要 curl 可以通过参数详细设置请求消息头。
  • 示例:
curl www.baidu.com

curl 示例1.gif

  • 示例:
curl -X GET www.baidu.com

curl 示例2.gif

4.7 nohup

4.7.1 提出问题

  • 我们将一个 SpringBoot 工程导出为 jar 包,jar 包上传到阿里云 ECS 服务器上,使用 java -jar xxx-xxx-xxx.jar 命令启动这个 SpringBoot 程序,此时我们本地的 Xshell 客户端必须一直开着,一旦 Xshell 客户端关闭,java -jar xxx-xxx-xxx.jar 进程就会结束,SpringBoot 程序也就访问不了。

grep 提出问题1.gif

  • 所以,我们希望启动 SpringBoot 的 jar 包之后,对应的进程可以一直运行,不会因为 Xshell 客户端关闭而被结束。

nohup 提出问题2.png

4.7.2 解决方案之前台、后台运行

  • 默认情况下,Linux 命令都是前台执行的,前台运行的特点就是前面命令不执行完,命令行就一直被前面的命令占用,不能再输入、执行新的命令。
#!/bin/bash
echo "hello before sleep"
sleep 20
echo "hello after sleep"
  • 前台(默认情况)运行上面脚本的效果是:
sh demo.sh

解决方案之前台运行.gif

  • 后台运行上面的脚本的效果是:
sh demo.sh &

解决方案之后台运行.gif

  • 但是以后台方式运行并不能解决前面提出的问题:我们的 shell 客户端(例如:xshell)和服务器断开连接后,SpringBoot 进程会随之结束,这显然不满足我们部署运行项目的初衷。

4.7.3 解决方案后台运行+ nohup

  • nohup 命令就是 no hang up 的缩写,中文翻译为 不挂断 ,指客户端断开连接后,命令启动的进程仍然运行。
  • 使用 nohup 命令启动 SpringBoot 微服务工程的完整写法是:
nohup java -jar spring-boot-demo.jar > springboot.log 2 > &1 &

解决方案后台运行+ nohup.png

4.8 wget

  • 命令:
wget [-P 指定目标目录] 目标文件的在 web 上的地址
  • 示例:
wget -P /opt https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.73/bin/apache-tomcat-8.5.73.tar.gz --no-check-certificate

wget 示例.gif

第五章:字符串处理命令(⭐)

5.1 正则表达式常用符号

符号 含义
^ 匹配字符串开始位置的字符
$ 匹配字符串结束位置的字符
. 匹配任何一个字符
* 匹配前面的字符出现 0 ~ n 次
[a,m,u] 匹配字符 a 或 m 或 u
[a-z] 匹配所有小写字母
[A-Z] 匹配所有大写字母
[a-zA-Z] 匹配所有字母
[0-9] 匹配所有数字
\ 特殊符号转义

5.2 basename

  • 返回路径字符串中的资源(文件或目录本身)部分:
basename /aa/bb/cc/dd
  • 示例:
basename /aa/bb/cc/dd

basename 示例1.png

  • 如果指定了后缀,basename会帮我们把后缀部分也去掉。
basename /aa/bb/cc/dd.txt .txt
  • 示例:
basename /aa/bb/cc/dd.txt .txt

basename 示例2.png

5.3 dirname

  • 返回路径字符串中的目录部分:
dirname /aa/bb/cc/dd
  • 示例:
dirname /aa/bb/cc/dd

dirname 示例1.png

  • 示例:
dirname /aa/bb/cc/dd.txt

dirname 示例2.png

5.4 cut

5.4.1 简介

  • 命令:
cut -d xxx -f n 字符串
  • 参数 -d 指定拆分依据的字符。
  • 参数 -f 指定要提取的列。
  • 作用:根据指定符号拆分字符串并提取,默认根据 \t 拆分。

5.4.2 操作演示

  • ① 准备测试数据:
touch cut.txt
vim cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le
  • ② 切割提取第一列:
cut -d " " -f 1 cut.txt

cut 示例1.gif

  • ③ 切割提取第二列:
cut -d " " -f 2 cut.txt

cut 示例2.gif

  • ④ 切割提取第二列和第三列:
cut -d " " -f 2,3 cut.txt

cut 示例3.gif

  • ⑤ 在 cut.txt 中切出 guan :
cut -d " " -f 1 cut.txt | grep -i guan

cut 示例4.gif

cat cut.txt | grep -i guan | cut -d " " -f 1

cut 示例5.gif

  • ⑥ 选取系统 PATH 变量值,第 2 个 : 开始后的所有路径:
echo $PATH | cut -d : -f 2-

cut 示例6.gif

  • ⑦ 切割 ifconfig 后打印的 IP 地址:
ifconfig | grep netmask | cut -d i -f 2 | cut -d " " -f 2

cut 示例7.gif

5.5 awk

5.5.1 简介

  • 一个强大的文本分析工具,将文本逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

5.5.2 基本用法

  • 命令:
awk [选项参数] 'pattern{action1} patter2{action2} ...' filename
  • pattern:表示 awk 在数据中查找的内容,就是匹配模式。
  • action:在找到匹配内容时所执行的一系列命令。
  • -F 参数:执行分隔符。
  • awk 命令的内置变量包括: | 变量名 | 说明 | | —- | —- | | FILENAME | 文件名 | | NR | 已读取的记录(行号) | | NF | 浏览记录的域的个数(切割后,列的个数) |

5.5.3 操作演示

  • ① 准备数据:
cp /etc/passwd ./

awk 示例1.gif

  • ② 搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列:
awk -F : '/^root/{print $7}' passwd

awk 示例2.gif

  • ③ 搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 1 列和第 7 列,中间以 ,号隔开:
awk -F : '/^root/{print $1 "," $7}' passwd

awk 示例3.gif

  • ④ 只显示 passwd 的第 1 列和第 7 列,以逗号分割,且在所有行前面添加列名 user,shell 在最后一行添加 heheda,/bin/nidaye
awk -F : 'BEGIN{print "user,shell"}{print $1 "," $7}END{print "heheda,/bin/nidaye"}' passwd

awk 示例4.gif

  • ⑤ 将 passwd 文件中的用户 id 增加数值 1 并输出:
awk -F : '{print $3+1}' passwd

awk 示例5.gif

  • ⑥ 统计 passwd 文件名,每行的行号,每列的列数
awk -F : '{print "文件名:" FILENAME ", 行号:" NR ", 列数:" NF }' passwd

awk 示例6.gif

  • ⑦ 切割 IP :
ifconfig | awk -F ' ' '/netmask/{print $2}'

awk 示例7.gif

  • ⑧ 查询 ifconfig 中空行所在的行号:
ifconfig | awk '/^$/{print NR}'

awk 示例8.gif

5.6 sort

5.6.1 简介

  • 命令:
sort [参数] [文件路径]
  • 参数: | 参数名 | 作用 | | —- | —- | | -n | 依照数值大小排序 | | -r | 相反顺序排序 | | -t | 设置排序时使用的分隔字符 | | -k | 指定需要排序的列 |
  • 作用:将文件或内容进行排序,并将排序结果标准输出。

5.6.3 操作演示

  • ① 准备数据:
touch sort.sh
vim sort.sh
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

sort 示例1.gif

  • ② 根据第 3 列数据进行排序:
sort -t : -nrk 3 sort.sh

sort 示例2.gif

5.7 xargs

5.7.1 情景距离

  • ① 初始化状态:
mkdir test
cd test
touch happy happy01 happy02 happy03 sad01 sad02 sad03

xargs 示例1.gif

  • ② 需求:将所有名称中包含 sad 的资源删除,但是保留 sad02
  • ③ 分步实现:

    • 列出全部资源:

      ls
      

      xargs 示例2.png

    • 列出名称中包含 sad 的资源:

      ls | grep sad
      

      xargs 示例3.png

    • 进一步排除 sad02

      ls | grep sad | grep -v sad02
      

      xargs 示例4.png

    • 此时最终筛选的结果打印到了标准输出:standard output。通过管道符号可以将标准输出转换为标准输入:standard input。但是删除命令 rm 不接受标准输入作为参数,只接受命令行参数

      ls | grep sad | grep -v sad02 | rm
      

      xargs 示例5.png

    • rm 命令前面的管道符号把前面的 stdout 转换为了 stdin 再传输给 rm 命令,这种方式对于有些命令可以,但是有些命令不行。例如:mkdir、ls、rm 等命令都是。

    • 使用 xargs 命令将 stdin 转换为命令行参数:
      ls | grep sad | grep -v sad02 | xargs rm
      
      xargs 示例6.png

5.7.2 结论

  • xargs 命令的作用:将管道符号提供的 stdin 数据转换为后面命令的命令行参数。

第六章:企业面试真题

6.1 京东

6.1.1 面试题1

  • 问:使用 Linux 命令查询 ifconfig 中空行的行号?

  • 答:

ifconfig | awk '/^$/{print NR}'

京东面试题1.png

6.1.2 面试题2

  • 问:
  • 有文件 chengji.txt 内容如下:
张三 40

李四 50

王五 60
  • 使用 Linux 命令计算第二列的和并输出。

  • 答:

awk -F " " '{sum+=$2} END{print sum}' chengji.txt

京东面试题2.png

6.2 新浪

  • 问:对文本中无需的一列数字排序?
9
8
7
6
5
4
3
2
10
1
  • 示例:
sort -n content.txt

新浪面试题.png