Linux命令系统总结


1. 如何连接远程服务器?

可以基于ssh命令来使用,具体的命令格式为ssh 用户名@主机ip/主机名

C:\Users\12743>ssh root@192.168.132.128
root@192.168.132.128's password: 
Last login: Fri Apr 14 22:56:13 2023 from 192.168.132.1
[root@localhost ~]# ls

2. 解释一下什么是shell

shell的含义是外壳,那么与之相对应的是内核kernal,这个内核就是操作系统的内核,shell是用来描述操作系统内核的一层工具

shell是一个程序,提供了一个和用户交互的环境,它在GUI上只显示了一个命令提示符,用户从键盘输入命令,所以又称为是命令行环境command line interface(CLI),具体的工作流程是:

shell接收到用户输入的命令,将命令送入到操作系统,然后将结果返回给用户

shell是一个命令解释器,解释用户输入的指令,它支持变量、条件判断、循环结构等,所以用户可以基于这些指令编写shell的小程序,这些shell脚本都通过shell的解释运行,而不通过编译

3. 什么是命令行提示符?

所谓命令行提示符就是提示用户当前正在以什么样的权限,输入什么样的指令,在哪一台机器上的哪个目录下进行操作,比如说通常有:

用户名@主机名 目录名:当前用户类型:输入的命令

~表示当前所在目录为用户的/home目录,root用户的家目录是/root,普通用户的家在/home下

#/$表示所具有的权限,#表示当前的用户权限为root用户,而$表示的是普通用户

输入whoami可以查看当前用户名

输入hostname可以查看当前的主机名

自测

如何查看用户名?:whoami

如何查看主机名?:hostname

~、/、.、..分别指代什么?#是什么含义?$是什么含义?

~:表示当前用户的家目录,通常在home/{用户名},有这样的指令

/:表示当前系统的根目录,是整个文件系统的根目录

#的含义是根用户,具有最高权限

$的含义是普通用户,具有普通参数

4. 什么是短参数?什么是长参数?

所谓短选项就是用一个单独的字母作为标识,通常也是一个选项英语的缩写,比如说

  • -a:表示所有
  • -c:表示命令
  • -f:表示文件
  • -v:表示版本

而长参数的出现是为了适应短参数的不足,这是因为短参数只有一个字母,不够用,而且表达出来的信息不够准确

ls -a(a是英文all的缩写,表示全部)
ls -al(全部文件,列表形式展开)
ls --all(完整参数形式)
ls --reverse --all
ls --all -l

5. 常用快捷键

Ctrl+R:查找使用过的建立,history命令用于列出之前使用过的命令

Ctrl+L清除屏幕

Ctrl+D:关闭shell会话

Ctrl + U:从光标位置剪切到行首;

Ctrl + K:从光标位置剪切到行尾;

Ctrl + W:剪切光标左侧的一个单词

Ctrl + Y:粘贴 Ctrl + U | K | Y 剪切的命令;

Ctrl + A:光标跳到命令行的开头;

Ctrl + E:光标跳到命令行的结尾;

6. Linux文件和目录

文件的组织

/:根目录,表示Linux系统的根目录,所有的文件都挂载到这个目录下

bin:binary文件目录,表示当前可以直接运行的那些指令

boot:包含与linux系统直接启动相关的那些文件

dev:device的缩写,它里面的每一个子目录就是一个设备信息

etc:包含了系统中的配置

home:用户的私人目录,类似于windows下的我的文档的内容,仅有用户可见

media:媒体,可以移动的外设(USB盘、SD卡)插入电脑的时候,Linux可以让我们通过media的子目录来访问这些外设中的内容

mnt:mount的缩写,表示挂载,类似于media,当需要建立联合文件系统的时候,就会在这个目录下挂载文件

opt:可选的应用软件包,用于安装第三方软件和插件

root:超级用户的家目录

sbin:表示系统二进制文件,也就是system bin目录

srv:表示服务,包含一些网络服务启动之后所需要取用的数据

tmp:表示临时的,普通用户和程序临时文件的地方

usr:Unix Software Resource的缩写,表示Unix操作系统的软件资源,usr目录是最庞大的目录之一,安装了大部分用户要调用的程序

var:表示动态的,通常包含程序的数据,比如说log文件

7. 文件和目录基本操作指令

如何查看当前所在目录?

pwd

假设安装了docker,那么用什么指令来查询docker的可执行程序的位置?

which docker

如何浏览目录?有什么常用参数?如果想要按照文件最近一次修改的时间排序要怎么安排?如果要查看文件的inode要怎么安排?

ls命令可以浏览当前目录下的文件,常用的参数有:

-a:查看当前目录下的所有文件

-l:以列表形式查看当前的目录

-h:以人类友好的形式展示出来

-t:以文件的修改时间排序进行显示

-i:显示文件的inode

如何切换目录?

cd ..

如何列举目录信息?

du

如何浏览文件?

cat Dockerfile -n

大文件如何分页显示?

less

如何显示文件的开头几行?

head -n 100

如何显示文件的结尾几行?

tail pom.xml -n 100

如何创建一个文件?

touch 1.txt

如何创建一个目录?多级目录呢?

mkdir -p test01/hellp

如何拷贝文件和目录?如何将当前目录下全部的文件拷贝到folder目录下?

cp src dst
cp .* dst
cp -r src dst

如何拷贝一整个目录?

cp -r src dst

如何重命名文件?如何移动文件?

mv old new

如何删除文件?

rm files

  • -i:询问用户是否删除文件
  • -r:递归删除目录
  • -f:强制删除

如何查看文件

cat 3.txt

最常用的就是cat指令,注意,如果文件很大的话,cat命令的输出结果会在终端上输出,可以多次按ctrl+c终止,如何查看文件的大小?

du -h file#查看文件的大小
cat file

cat在打开大文件的时候,会一次性地显示所有的内容,为了避免安全问题,因此对于那些比较大的文件,就可以使用less命令打开某个文件,类似于vim,less可以在输入/进入到一个查找的模式,然后按n(N)向下或者向上查询

如何滚动查看日志:查看nginx的滚动日志

tail -f access.log

tail命令可以静态地查看某个文件的最后n行,head命令可以查看文件的头n行,但是head没有滚动的功能tail -n 100 access.log || head -n 100 access.log || tail -f access.log

统计功能,通常来说sortuniq经常配对使用,sort可以使用-t指定分隔符,使用-k指定要排序的列

统计PV(Page View):用户访问一个页面就是一次PV,比如大多数的博客平台,点击一次页面,阅读量就+1

如何统计一个PV,那么要怎么做呢?

awk -F"|" '{print $3}' access.log | sort | uniq -c | sort -nk1 -r | head -n10

awk:linux中的重要工具

-F:间隔符,表示说以|作为间隔符

然后,使用sort对日期进行排序,然后使用uniq -c进行统计,于是按天分组的PV就出来了

awk '{print substr($4,2,11)}' access.log | sort | uniq -c

在使用uniq -c去重之前要先用sort进行排序,因为uniq去重的原理就是比较相同的行,然后出去第二行和该行的后续副本

grep:用来对内容进行过滤,带上--color参数,可以在支持的中断打印彩色,参数n则输出具体的行数,可以用来快速定位,查看nginx日志POST的请求

如果要看某个异常前后相关的内容,就使用ABC参数,这是几个单词的缩写

A:after内容后n行

B:before内容前n行

c:count内容前后n行

diff:命令可以用来比较两个文件的差异

8. 什么是链接?怎么来使用链接?

首先要理解Linux下文件是怎么存储的

Linux文件系统会为每个文件分配两个数据结构

  • 索引节点(index node)
  • 目录项

他们主要用来记录文件的元信息和目录层次结构,下面来详细解释一下这两个数据结构

索引节点:也就是inode,用来记录文件的元信息,比如说inode编号,文件大小,数据在磁盘的位置等等,因此通过inode中的信息来找到文件中的内容,索引节点是文件的唯一标识,他们之间是一一对应的,也同样会被存储在磁盘中,所以索引节点通常占用磁盘空间

目录项,用来记录文件的名字,索引节点指针以及和其他目录项的层级关联关系,多个目录项关联起来,就会形成一个目录结构,但是和索引节点不同的是,目录项是由内核维护的一个数据结构,并不存放在磁盘中,而是缓存在内存中,由于索引节点唯一标识一个文件,而目录项记录着文件的名字,那么一个文件可以有多个别名,也就是说可以存在一种情况:

多个目录项中的索引节点指向同一个文件,要注意的是,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件中保存的是子目录或者文件

目录项和目录是什么关系?

目录是一个文件,持久化在磁盘中,而目录项是一个数据结构,缓存在内存中

如果查询目录频繁从磁盘读,那么效率就会很低,所以内核会将已经读取过的目录用目录项这个数据结构缓存在内存中,下次再次读取到相同的目录的时候,只需要从内存读取就可以了,大大提高了文件系统的效率

那么目录项这个数据结构不只是表示目录,也是可以表示文件的

关键:文件数据是如何存储在磁盘的呢?

磁盘读写的最小单位是扇区,扇区的大小只有512B,如果每次只读写一个扇区的话,那么读写的效率就会非常低

因此文件系统将多个扇区划分成了一个逻辑块,每次读写的最小单位就是逻辑块,Linux中的逻辑块大小为4KB,也就是一次读写8个扇区,这就大大提高了磁盘的效率

如上图所示,当一个目录项含有多个文件的时候,这个目录项就存储了这些文件的关系,比如说目录之间存在子目录和父目录的关系,通过双向指针来确定,要注意,Linux中一切都是文件,文件是数据的载体,因此每一个目录项就对应一个索引节点指针,这个索引节点指针指向了磁盘中存储数据的具体区域。

有时候我们希望给某个文件取个别名,那么在Linux中可以使用硬连接和软连接的方式来实现,他们是比较特殊的文件,但是实现方式是不相同的。

什么是硬链接?:硬链接是多个目录项中索引节点指向同一个文件,也就是指向同一个inode,但是inode是不可能跨越文件系统的,每个文件系统都有各自的inode的数据结构和列表,也就是说每个文件系统都是维护各自的inode列表,因此硬链接无法跨越文件系统,由于多个目录项都是指向同一个inode,那么只有在删除文件的所有硬链接以及源文件的时候,系统才会彻底删除这个文件

什么是软链接?:软链接相当于重新创建一个文件,这个文件具有独立的inode,但是这个文件的内容是另外一个文件的路径,所以当访问软链接的时候,这时候就相当于访问到了另外一个文件,所以软链接是可以跨越文件系统的,甚至目标文件被删除了,链接文件还是存在的,只不过指向的文件找不到了而已

如图所示,硬链接的生成本质就是生成一个新的目录项,然后这个目录项指向已经存在的inode

软链接的生成本质就是生成一个新的文件,只不过这个这个文件会存储连接的文件的名称,然后根据文件的名称找到目录项,然后再根据目录项的内容读取相应的inode

比如说,当我访问symlink1的时候,它首先会去查找inode2在磁盘上存储的数据是/home/xiaolin,根据这个名字,再去查找/home/xiaolin所对应的目录项,然后根据这个目录项中的inode中的内容,去读取相应的inode,假设文件被删除,那么就是根据/home/xiaolin找目录项的这一点出问题了,最终导致无法访问文件

ln file1 file2

这条指令的含义为创建一个连接,file2=>file1的inode

ln -s(sort) file1 file2

这条指令的含义为,创建一条连接file2=>file1,然后当你打开file2的时候就可以看到这个文件中的内容是file1的路径了

9. 用户与权限的管理

Linux是一个多用户的操作系统,在Linux中,理论上来说,可以创建无限多个用户,但是这些用户被划分到不同的群组里面,有一个用户叫做root,是超级用户

Linux中每个用户都属于一个特定的群组,如果不设定用户的群组,就会默认创建一个和它的用户名一样的群组,然后将这个用户划归到这个群组

如何添加用户名以及修改密码?

useradd userId
passwd userId

如何删除用户?

userdel userId #只会删除用户名,不会从/home中删除对应的文件夹
userdel userId -r #会同时删除/home下的对应文件夹

如何新增一个群组?

groupadd groupId

如何删除一个群组?

groupdel groupId

如何查看用户所在的群组?

groups root

如何修改用户的账户?

usermod
# -l 对用户重命名
# -g 修改用户所在的群组

如何修改文件的群组?

chgrp gourpId fileName

如何改变文件的所有者?

chown root fileName #将其他用户创建的这个文件转让给root
chown root:root fileName#将用户的创建者设置为root,并且设置组为root
chown root:root fileName -R#递归地改变这个目录下的所有文件

10. 文件的权限管理?

如何修改文件的权限?

chmod -R 704 /home/lion

递归地修改文件访问权限

dr-xr-xr-x.  2 root root 28672 42 19:26 bin
drwxr-xr-x.  2 root root     6 411 2018 etc
drwxr-xr-x.  2 root root     6 411 2018 games
drwxr-xr-x. 44 root root  8192 314 21:07 include
dr-xr-xr-x. 28 root root  4096 314 21:07 lib
dr-xr-xr-x. 42 root root 24576 41 17:51 lib64
drwxr-xr-x. 25 root root  4096 41 17:51 libexec
drwxr-xr-x. 29 root root  4096 43 20:26 local
dr-xr-xr-x.  2 root root 16384 41 21:23 sbin
drwxr-xr-x. 88 root root  4096 41 17:51 share
drwxr-xr-x.  4 root root    34 87 2022 src
lrwxrwxrwx.  1 root root    10 87 2022 tmp -> ../var/tmp

drwxr-xr-x为例,这个表示文件或者目录的权限

d:表示目录,就是表示说这是一个目录,普通文件是-,软链接文件是l,目录文件是d

r:read表示可读

w:write表示可写,一般具有写的权限,就有删除的权限

x:execute表示文件可以执行

**-**:表示没有相应的权限

记住格式:文件属性 所有者 群组用户 其他用户

文件属性:如果是d,那么就代表是目录,如果是-,那么就代表是文件,如果是l,代表是软链接文件

所有者:可读可写可执行就是rwx,没有权限的话就是—

drwxr-xr-x:它是一个目录文件,所有者可读可写可执行,群组用户可读可执行,是其他用户可执行

数字分配权限:

r:4

w:2

x:1

chmod 640 hello.c
# 6 = 4+2所有者可读可写,不可执行
# 4 = 4群组用户可读
# 0 = 0,其他用户不可读不可写不可执行
chgrp groupId filename

11. 查找文件

如何根据名字快速查找文件/目录所在位置?

可以使用第三方工具locate,通过locate 1.txt

find指令怎么使用?

find <何处> <何物> <做什么>

何处:指定在哪个目录中查找,此目录的所有子目录都会被查询

何物:查找什么,可以根据文件的名字来查找,也可以根据其大小查询,还可以根据最近访问时间来查询

做什么:找到文件后,可以执行后续的处理,如果不指定这个参数,find只会显示找到的文件

给出文件名,如何查找?

  • 情况1:当前目录
find . -name "install.txt"
  • 情况2:根目录
find / -name "install.txt"
  • 情况3:使用通配符
find / -name "*install*"

如何根据文件大小查找?

可以通过-size参数,其中符号需要注意:

+:大小超过指定数值

-:大小小于指定数值

none:大小等于指定数值

find /var -size +10M	--> /var 目录下查找文件大小超过 10M 的文件

如何根据文件最近访问时间查找?要寻找七天内访问过的txt文件要怎么做?

find /usr/local -name  "*install*" -atime -7

如何只查看当前目录下的目录/文件?

find . -name "file" -type f
find . -name "file" -type d

12. grep是什么?

全局搜索一个正则表达式,并且打印到屏幕中,简单来说就是在文件中查找关键字,并显示关键字所在的行

grep file a.txt

常用参数:

  • -i:忽略大小写
  • -n:显示行号
  • -v:只显示文本不在的那些行
  • -r:递归查找,查找目录中的文件

13. sort是什么?

对文件的行进行排序,sort filename

-o:将排序后的文件写入到新文件中

-r:倒序排序

-R:随机排序

-n:对数字进行排序,默认就是将数字识别成字符串,如果是按照字符串排序的话,那么138会排到25的前面,如果添加了-n数字排序的话,那么25就会在138的前面

14. wc是什么?

word count的缩写,用于文件的统计,可以用来统计单词的数目、行数、字符数、字节数等

-l:统计行数

-w:统计单词数

-c:统计字节数

-m:统计字节数

grep warning a.txt | wc -w 

统计a.txt多少个warning

15. uniq是什么?

删除文件中的重复内容,只能够去除重复的行数

  • c:统计重复行数,uniq -c name.txt
  • -d:统计重复的行数,uniq -d name.txt,但不输出重复的次数

16. cut是什么?

剪切文本的一部分

cut -c 2-4 name.txt #剪切每一行的第二到第四个字符

17. 重定向 管道 流

grep warning a.txt | wc -w 

这条命令是从a.txt过滤出那些为warning的单词,然后作为参数传递给wc -w 这个指令进行统计

|:称为是匿名管道,用完了就销毁

mkfifo pileName:命名管道

管道是如何创建的?背后的原理是什么?

所谓管道,其实就是内核中的一串缓存,从管道的一段写入数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据,另外管道传输的数据是无格式的流并且大小受限

在创建管道的底层的时候:

它实际上是创建了两个fd,用来分别描述读取数据的一端和写入数据的一端,但是此时还是在同一个进程里面的,因此这时候就需要通过fork()技术,创建的子进程会复制父进程的fd,这样就做到了两个进程各自有两个fd,两个进程就可以通过各自的fd写入和读取同一个管道文件实现跨进程通信

管道只能够一端写入,另一端读取,所以上面这种情况容易造成混乱,因为父进程和子进程都可以同时写入,也可以同时读出,为了避免这种情况:

父进程关闭读取的fd[0],保留写入的fd[1]

子进程关闭写入的fd[1],只保留读取的fd[0]

那么在shell中执行命令的时候,这些进程都是shell进程创建的子进程,当我们使用|的时候,实际上就是创建了多个子进程,在编写shell的时候,能使用一个管道搞定的事情就不用使用多个管道,这样就减少了创建子进程的开销,对于匿名管道,通信范围是父子进程,因为管道没有实体,不能够通过文件表来访问

对于命名管道,提供了一个类型为管道的文件,在进程里只要使用这个设备文件,就可以相互通信

什么是重定向:>表示重定向到新的文件,如果输出的文件不存在它就会新建一个,如果输出的文件已经存在了,那么就会覆盖,因此这个操作必须要小心,防止覆盖其他重要文件

使用**>>**表示重定向到文件末尾,因此它不像>命令这么危险,因为它是追加到文件的末尾,如果文件不存在,也会被创建

输出重定向2> errors.log是什么意思?当发生了错误的时候,就会将发生的错误写入errors.log文件中

**输出重定向2>>**标准错误输出,追加到文件末尾,和>>类似

输出重定向:标准输出和标准错误输出都重定向到一个地方,比如说下面的指令,都将输出重定向到res.txt

cat a.csg > res.txt 2>>&1

输入重定向<

解释一下下面这两条指令有什么不同?

cat < name.txt
cat name.txt

cat < name.txt:这条指令表示cat命令接收的是name.txt中的内容,cat命令只负责将内容进行打印,打开文件并将文件内容传递给cat的工作就交给终端了,具体的流程是,shell打开name.txt,然后将里面的内容给到cat

cat name.txt则是由cat进程来完成对name.txt文件的打开,打开文件并将文件内容传递给cat

输入重定向<<

sort -n << END 
# 输入这个命令之后,按下回车,终端就进入键盘输入模式,其中END为结束命令(这个可以自定义)

wc -m << END # 统计输入的单词

显示目录大小前十的目录

find / -size +10M | sort -n | head

18. 进程相关指令

w:了解当前系统中有哪些用户登录中

[root@localhost test]# w
 12:04:16 up  5:37,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.132.1    09:39    0.00s  0.34s  0.03s w

User:登录的用户

TTY:登录的终端名称为pts/0

FROM:连接到服务器的IP地址

IDLE:用户多久没有活跃了

JCPU:该终端所有相关的进程使用的CPU时间,每当进程结束就停止计时,开始新的进程的时候就会重新计时

PCPU: CPU执行当前进程所消耗的时间

what:正在执行什么程序

ps:用于显示当前系统的进程,ps命令显示的进程列表不会随时间而更新,是静态的,是运行ps那个时刻的一个快照

[root@localhost test]# ps
   PID TTY          TIME CMD
  5907 pts/0    00:00:00 bash
 13777 pts/0    00:00:00 ps

PID:进程ID

TTY:运行这个进程所在的终端

TIME:进程运行时间

CMD:产生这个进程的程序名,如果在进程列表中看到有好几行都是同样的程序名,那么就说是同样的程序产生了不止一个进程

常用的参数

-ef:列出所有的进程

-efH:以乔木状列举出所有进程

-u:列举出此用户运行的进程

-aux:观察各个进程的CPU和内存使用率

-aux –sort -pcpu:按照CPU降序排列

top:获取进程的动态列表,默认是按照%CPU的使用率来排序的

kill:给一个进程发信号,比如说-9是结束这个进程

19. 进程管理

状态码Running(R):正在运行

Stop(S):表示中断(休眠中,受阻,当某个条件形成后或者接收到信号的信号,则脱离改状态)

D:不可中断,进程不响应系统的异步信号,即使使用kill命令也不能够使其中断

Z:表示僵尸进程,进程已经中终止,但是进程描述符依旧存在, 直到父进程调用wait4()系统函数后将进程释放

T:表示停止,进程在收到SIGTOPSIGSTPSIGINSIGOUT等停止信号后停止运行

前台进程 & 后台进程

默认情况下,用户创建的进程都是前台进程,前台进程从键盘读取数据,然后将处理结果返回到显示器

后台进程的优点是不必等待程序运行结束,就可以输入其他命令,在需要执行的命令后面添加&就表示开启了一个后台进程

启动后台进程,它的缺点是后台线程与终端相关联,一旦关闭终端,进程就自动结束了

nohup

使得进程不受挂断(关闭终端等动作)的影响

nohup cp a.csv b.csv &

bg

使得一个后台暂停运行的进程状态转为后台运行

1. 执行 grep -r "log" / > grep_log 2>&1 命令启动一个前台进程,并且忘记添加 & 符号
2. ctrl + z 使进程状态转为后台暂停
3. 执行 bg 将命令转为后台运行

jobs

显示当前终端后台进程状态

fg

和bg状态类似,将这个进程转为前台执行

守护进程

一个运行起来的程序被称为是进程,在Linux中有些进程是特殊的,它不与任何进程相关联,不论用户的身份如何,都在后台运行,这些进程的父进程是PID=1的进程,PID=1的进程只有在系统关闭的时候才会被销毁,它们在后台一直运行等待分配任务,将这一类进程称为是守护进程daemon

守护进程的名字通常在最后面有一个d,表示是守护进程,比如说有systemdhttpd

systemd

它是一个系统基础组件集合,提供了一个系统和服务管理器,运行为PID=1并负责启动其他程序

systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl reload nginx#重新配置文件
systemctl enable docker#开机自动启动服务
systemctl disable docker#开机不自动启动服务
systemctl list-unit-files --type=service

20. 文件压缩解压

最常用的就是.tar.gz的文件格式了,其实就是经过了tar打包后,再使用gzip进行压缩

tar -cvfz a.tar.gz dir/

tar:创建一个归档

c:create,创建

verbose:细节,-v显示细节

file:文件

tar -cvf
#创建文件并显示细节
tar -tf
#显示归档中的内容,不解开归档
tar -rvf a.tar a.txt
# 追加文件到归档中
tar -xvf
tar --create --verbose -f a.tar test

gzip/gunzip

gazip a.tar#压缩

21. 网络配置

ipconfig# 查看ip相关网络信息
host #ip地址和主机名的转换

22. 文件备份

scp:soruce copy,表示安全拷贝,可以通过网络,把文件从一台电脑拷贝到另外一台电脑上

scp是基于ssh的原理来运行的,ssh会在两台通过网络连接的电脑之间创建一条安全通道的管道,然后scp就基于这条管道安全地拷贝文件

scp file.txt root@192.168.132.128:/root
scp root@192.168.132.128:/root/file.txt /usr/local/file.txt

rsync:命令主要用于远程同步文件,可以同步两个目录, 不管是否处于同一台电脑,可以用于增量备份

rsync -arv Images/ backups/ # 将Images 目录下的所有文件备份到 backups 目录下
rsync -arv Images/ root@192.x.x.x:backups/ # 同步到服务器的backups目录下
  • -a 保留文件的所有信息,包括权限,修改日期等;
  • -r 递归调用,表示子目录的所有文件也都包括;
  • -v 冗余模式,输出详细操作信息。

23. vim

插入模式:文本编辑器模式

命令模式:保存、退出配置等

交互模式:剪切、粘贴、撤销

跳到行首和行末:

  • 行首:在交互模式下,为了将光标定位到第一行的位置,那么就只需要按下数字键0就可以了
  • 行末:交互模式下,按下美元键

w:可以一个单词地移动

复制单词,行:按两次y就将所在行复制到内存中,dd用于剪切光标所在行

y$:复制从光标到所在行末的所有字符

y0:复制光标所在处到行首的所有字符

dd+yy之后,可以使用p来粘贴

跳转到指定行:数字+gg,跳转到最后一行,按下G

查找:在交互模式下输入/{待匹配的字符串},n跳转到下一个字符串,N跳转到上一个字符串

查找并替换

:s/就字符串/新字符串
:s/one/two

24. 日常运维指令

mount:这个命令可以挂载一些外界设备,比如说u盘等

mount /dev/sdb1 /xiaolin

chown:可以用来改变文件所属的用户和所属组,chmod用来改变文件的访问权限

如何给a.sh文件添加执行权限?

chmod a+x 1.sh

表示给当前用户所属组的用户,拥有者,其他用户(all)给一个执行权限

chown:用来改变文件的所属用户和所属组

sercice&&systemctl

systemctl兼容了service命令,比如说启动一个mysql的服务

service mysql restart
systemctl restart mysqld

kill:用来给进程发送信号

25. 系统状态描述

uname:这个指令可以输出当前的内核信息,可以了解到具体的机器信息

ps:这个命令可以看到进程/线程的状态,和top指令内容有一些重叠

ps -ef #查看进程/线程的状态,和top有些内容是重叠的

top:系统状态一览,主要用来查看cpu的使用率,使用内存或者cpu最高的一些进程,使用如下的指令可以查看某个进程中的线程状态

top -H -p pid

free:可以看内存,但是不友好,通过free是可以专门用来查看内存的,它包括有物理内存和虚拟内存swap

df:这个命令可以用来查看系统中磁盘的使用量,来查看磁盘是否达到了上限了,使用了-h参数就可以以友好的方式进行展示

ifconfig:查看ip地址,替代品是ip addr命令

ping:查看机器之间的网络是否是通的

netstat -ant:查找本地的端口的情况,当有查看当前的所有的TCP连接可以使用这个指令

netstat -ant#查看tcp
netstat -anu#查看udp

26. 工作常用指令

export:export可以用来设定一些环境变量,env命令可以看到当前系统中的所有环境变量,比如说有:

PATH是一个执行环境的路径,这样写的就是引入新的环境变量

export PATH=$PATH:/home/jdk/bin

有时候想要知道执行命令的具体路径,就可以使用whereis命令

crontab:本地的job工具

date:用来输出当前的系统时间,可以使用-s参数来指定输出的格式,但是设置时间设计到设置的硬件,所以有另外一个命令叫做hwclock

find . | grep .txt$ | xargs rm -rvf
#删除目录下的所有以txt结尾的文件
#读取输入源,然后逐行处理

27. 网络指令

ssh:建立ssh隧道,如果要知道详细的输出过程,必须用--verbose

scp:scp用来进行文件传输,也可以用来传输目录,也有更加高级的sftp

wget:weget -c 可以直接使用命令行下载文件,支持断点续传

28. 什么是终端?

终端简单来说就是一个进程,一个shell进程,shell它本质上就是一个工作在用户和内核之间的一个进程,通过这个进程,用户在前台输入一个指令,然后经过shell对其中的命令解析,将命令和参数发送到内核,内核处理完毕后,就将结果集返回到shell,shell就将这个结果集渲染到显示屏上

Linux的Path目录是用来干嘛的?

简单来说,当终端执行命令的时候,实际上就是启动了一个进程,然后将用户输入的参数输入到这个进程中,然后进程执行指令后的结果就返回了,那么这个Path目录就是一个导向标,当需要执行指令的时候,就到这个路径下去查找是否有对应的文件,如果有文件的话,那么就执行

pwd是用来判断当前的路径的

29. 文件系统的用户标准

Linux中的文件系统,从一开始就有一个规范标准,有一个专有的缩写名词,FHS(FileSystem Hierarchy Standard),除了一些标准的要求,还有一些使用者之间的约定:

home:私人目录,在其中可以做任何操作,root的家目录是在/root下的,而home目录是存放用户的私人目录的

var:var目录存放的是一些运行中的数据,有必须的,也有非必须的,目录是一些应用程序的默认数据存放的地方

tmp:特殊的临时目录,文件在断电之后就消失了,但是这个目录,所有的用户,都有写入权限,通常用来做文件的交换使用

/proc和/sys目录,是两个神奇的目录,是一个伪文件系统,可以通过修改其中一些文件的状态和内容,来控制程序的行为,修改之后会直接刷新到内存上,主要是用来控制内核的一些行为,如果在调优一些系统参数,和这些文件打交道的时间比较多

/src:通常会把一些web服务的资源放在这里面

/opt:通常也会将一些资源目录放在这里面

/data:使用这个目录来存放一些数据库相关的内容

drwxr-xr-x. 4 root root   162 1020 15:26 db
-rw-r--r--. 1 root root  1079 1020 16:25 docker-compose.yml
drwxr-xr-x. 4 root root    46 1020 16:30 jeecg-boot-base-core
drwxr-xr-x. 4 root root    46 1020 16:30 jeecg-module-demo
drwxr-xr-x. 5 root root    95 1020 15:26 jeecg-module-system
drwxr-xr-x. 7 root root   212 1020 15:26 jeecg-server-cloud
-rw-r--r--. 1 root root 12242 1019 15:01 LICENSE
-rw-r--r--. 1 root root 14334 1019 15:01 pom.xml
-rw-r--r--. 1 root root 22712 1019 15:01 README.md

文件类型:文件权限,依次是(拥有者的执行权限)(组内用户的执行权限)(其他用户的执行权限)

隐藏文件:执行ls -al,这些额外的隐藏文件,都是以.开头,以配置文件居多

Linux中的文件类型有哪些?

-:表示普通文件

d:表示目录文件

l:表示链接文件,是软连接

s:套接字文件

c:字符设备文件,比如说/dev/中的很多文件

b:表示块设备文件,比如说一些磁盘

p:管道文件

可以用file指令来查看文件的具体类型

如何生成连续的数字序列?

seq 10 20 >> hello.txt

>:它表示是说将前面的输出,重定向到其他地方,在这里使用了>>,它依然是重定向的意思,但是表示的含义是在原来的文件的基础上,追加文件内容

如何合并两个文件的内容?

#比如说:
seq 10 20 >> 10.txt
seq 20 30 >> 20.txt
cat 10.txt 20.txt >> 30.txt

查看大文件使用什么指令?

less:cat指令是不适合用来查看大文件的,那么就可以用moreless来查看文件,由于less指令的查看速度会更快一些,因此现在一般都是使用less,它主要的功能就是用来浏览文件内容,并且提供一些快速查找的方式,less是一个交互式的命令,需要使用一些快捷键来控制:

**/**向下搜索

n重复上一个搜索

**?**向上搜索

<space>:向后翻页

b:向前翻页

j:下一行

k下一行

30. 查找文件专题

查找文件的关键指令是find,下面是一些基本的参数以及用法

-name:可以使用通配符的文件名

-size:可以使用大小进行,+就是查找大于指定值的文件,-就是查找小于指定值的文件

-type:根据文件类型进行搜索

-perm:根据文件权限搜索

-mtime:修改时间,以天为单位

-mmin:修改时间,以分钟为单位

-user:属于某个用户的文件

-group:属于某个组的文件

-exec:执行名,建议使用xargs来替代

如何找到当前目录下以.txt结尾的所有文件并且删除?

find <何处> <何物> <做什么>
find . | grep .txt$ | xargs rm -rvf

如何找到/root下,一天前访问的文件?

find /root -atime 1 -type f

查找10分钟内更新过的文件

find /root -cmin 10

找到归属于root用户的文件

find / -user root

找到大于1MB的文件,进行清理

find /root -size +1024k -type f | xargs rm -vf
stat boot
  文件:"boot"
  大小:4096            块:8          IO 块:4096   目录
设备:801h/2049d        Inode:64          硬链接:5
权限:(0555/dr-xr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:boot_t:s0
最近访问:2023-04-18 22:48:30.009926265 +0800
最近更改:2023-04-01 17:06:44.251375460 +0800
最近改动:2023-04-01 17:06:44.251375460 +0800
创建时间:-
stat boot | head -n 7 | tail -n 1
stat boot | grep Modify

字符串匹配

grep -r :递归匹配,包括子目录也去匹配

grep -n:显示匹配的位置,非常有用

grep --color:彩色显示匹配结果

-E:使用正则表达式进行匹配

-v:反向匹配,匹配不包含某个字符的所有行

-I:不区分大小写(单个字符)

-A:内容后n行 -B:内容前n行 -C:内容前后n行

31. 管道

|pipe的意思,他可以将多个命令联系起来,通常来说,命令有这样的方式

;顺序执行,比如说有mkdir a;rmdir a

&&条件执行,比如说有mkdir a && rmdir a

||条件执行,比如说有mkdir a || rmdir a,后面的执行是不执行的

|管道,前面命令的输出,作为命令的输入

关于输入输出错误,linux使用一个数字进行缩写,这在一些脚本中,甚至一些安装文件中会经常用到

  • 0表示标准输入
  • 1表示标准输出
  • 2表示标准错误
cat aaaaa >b #错误信息无法输出到文件
cat aaaa > b 2> &1 #错误信息会被重定向

32. 排序

sort:对选择的内容进行排序,比如说有-k(选择要排序的依据列)-t(指定分隔字符)-n(依照数值大小排序)-r(倒序)

uniq -C:显示每行重复的次数,-U显示仅出现一次的行

管道的实现,是基于fork()来进行实现的,每当我们使用一个管道的时候,这时候就会通过fork()创建父子进程,通过父子进程来共享fd,一般来说会有一对读取和写出的fd,第一个指令的读取fd会关闭,第二个指令的写出fd会关闭,这样的话就实现了第一个指令会通过输出的那个fd对对应的写出的文件进行写出,而第二个指令的读取fd不会关闭,因此就可以读取相应的文件了

33. 练习

如何找到系统中所有的grub.cfg?并且输出他们的行数

find / -name grub.cfg | xargs wc -l

输出系统的group

cat /etc/group | awk -F':' '{print $1}'

输出nginx日志中的ip和每个ip的pv,pv最高的前十

首先要了解正序排序和正序排序是怎么写的

cat 1.txt | sort -n -k1 -r
#根据第一列倒序排序

34. 辅助工具

man:用来显示某个命令的文档信息,比如说有man ls

info:可以认为和man是一样的,虽然有一些能够互补的内容,但是他们在内容中进行提示

--help:很多命令通过参数--help可以提供非常简短的帮组信息

tar:-c(create创建压缩包)-x(解压压缩包)-t(查看压缩包的内容列表)-C(指定要解压的目录)-z(追加gzip压缩)-v(打印细节)

35. Linux的权限体系

添加用户:useradd

useradd zhangsan
useradd lisi
useradd aotu

如何来查看当前的系统有哪些组?

tail -n1 /etc/group

如何查看用户的密码?

cat /etc/shdow

如何删除用户?

userdel -f zhangsan

文件权限体系

一个用户只有一个名称代号,但是可以有多个组

目录权限体系

r:表示允许读取目录中的文件名,但不能够进入这个目录

w:表示允许用户修改目录,可以创建、迁移、删除、更名目录下的文件

x:可以获取目录下的文件列表,以及进入目录,执行cd的命令

36. 如何对磁盘进行操作

分区:使用fdisk,输入n(new)新建分区,再次执行fdisk -l,然后就能够看到一块2gb

格式化:输入mkfs,然后按<TAB>,就可以选择格式为什么格式

挂载:将磁盘的文件挂载到文件系统中,mount /dev/sdb1 /data

交换分区:虚拟内存的实现,由于内存的容量有限,用于缓冲一些数据,swap分区,系统在物理内存不足的时候,也就是当系统物理内存不够用的时候,就将当前主存中的一部分数据交换到磁盘中

使用dd命令进行备份:if代表输入的文件,of代表的是输出的文件,根据Linux的设计理念,这里的文件就是设备

37. Sed指令

sed <参数> <范围> <操作> 目标

-n:是--quiet-slient的意思,表示忽略执行过程的输出,只输出结果即可

-i:使用此参数后,所有改动将在原文件上执行,输出将覆盖原文件

范围:(1,4)表示找到<1,2,3,4>行的内容

  • 5表示选择第五行
  • 2,5:选择第二到第五行
  • 1~2:选择奇数行
  • 2~2选择偶数行
  • 2,offset(+3):和(2,5)的效果是一样的
  • 2,$:从第二行到文件的结尾
sed -n(参数) '1,4(范围) p(操作)' 目标文件

p:对匹配的内容进行打印

d:对匹配的内容进行删除,这时候就去掉-n参数,因为这时候没有输出结果

w:将匹配的内容写入到其他方

如何执行替换?

/sys/,+3选择出现sys字样的行,以及后面的三行

/^sys/,/mem/选择以sys开头的行,和出现mem之间的行数据

比如说上面这个图,具体的含义就是定位到一个行之间,如何就匹配a,将a替换成b,g是替换的形式

g:g可以实现全文替换

p:当使用了-n参数,p仅将输出匹配行内容

w:仅输出那些有变换的行

i:表示忽略大小写

e:表示将输出每一行

38. 系统负载检测

首先这些数据都是从/proc来的,这个目录是一个虚拟目录,存储的是当前内核中的一系列的特殊文件,不仅能够查看一些状态,甚至能够修改一些值来改变系统的行为,这些命令,是对/proc中一系列信息中的解析和友好的展示,这些值,Linux内核都算好了,要注意和docker中获取数据的目录/cgroup是不同的

top指令中的一些关键指标:

load average:Cpu总负载,如果load超过了核数,那么负载过高

wa(wait):它的计算公式是CPU空闲时间/CPU总的时间片,因此通常来说,当iowa很高的时候,就意味着IO对CPU处理效率造成了影响,但是造成这个现象的原因有:

当iowa很高,代表着CPU的吞吐量很高,然后CPU任务的时长是不够多,因此造成了这样的情况

当iowa很高,代表着进程IO占用时间比高,可能是性能瓶颈,至于是否是性能瓶颈,还要看磁盘的读写时间,一般来说一次IO耗时超过了20ms的话,就代表了性能不正常

sy、si、hi、st任何一个超过5%,都会有问题

进程状态长时间处于DZT,提高注意度

cpu不均衡,判断亲和性和优先级问题

网卡导致单CPU过高

网卡需要CPU服务的时候,都会抛出一个中断,中断告诉了CPU发生什么事情,CPU就要停止目前的工作来处理这个中断,其实默认所有的CPU中断处理都集中在cpu上,导致服务器的负载过高,cpu0成了瓶颈

GC引起的CPU过高怎么办?

首先通过jps/ps来查看当前CPU最高的Java进程,然后通过jstack/top -H -p来查找到相应的线程ID,一般来说,在jstack中会显示这个线程是什么线程,如果是GC线程的话,那么就是说JVM内存不够用了,也可能是线程资源泄漏了,比如说你做热插拔,然后资源没有释放,这种情况只能够通过重启来解决了,使用jmap dump一些堆栈

st%占比过高怎么办?

CPU资源不足,只发生在虚拟机上,这个值的计算方式是:%st虚拟CPU等待实际CPU的时间的百分比,就是虚拟机软件分配给其他虚拟机上的任务的实际的CPU时间,这意味着你的虚拟机申请实际的CPU申请不到,导致了这个问题

cpu使用率低,但负载高

cpu id%高,也就是空闲,比如90%。但 load average非常高,比如4核达到10。

分析:load average高,说明其任务已经排队,许多任务正在等待。出现此种情况,可能存在大量不可中断的进程。

使用top或者ps可以看到进程相应的状态。

39. Shell脚本入门指南

Shell编程就是一堆Linux命令的逻辑化处理

#!/bin/bash
echo "hello!"

shell的第一行比较特殊,一般会以#!开始来指定使用shell类型,在linux中,除了bash shell以外,还有很多版本的shell,比如说有zshdash等等

shell变量

  • 自己定义的变量,仅在当前的Shell实例中有用,其他Shell启动的程序不能访问局部变量
  • Linux已定义的环境变量(环境变量,比如说有PATH,HOME等),这类变量可以直接使用,使用env命令可以查看当前所有的环境变量,而set命令既可以查看环境变量,也可以查看自定义变量
  • Shell变量,Shell变量是由程序设置的特殊变量,Shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了Shell的正常运行

PATH:决定了shell将那些目录中寻找命令或者程序

HOME:当前用户的主目录

LOGNAME:当前用户的登录名

HOSTNAME:指主机的名称

SHELL:当前用户Shell类型

LANGUAGE:语言相关的环境变量,多语言可以修改此环境变量

MAIL:当前用户的邮件目录

Shell变量的命名规范

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头,但是可以使用下划线(_)开头。

中间不能有空格,可以使用下划线(_)。

不能使用标点符号。

不能使用 bash 里的关键字(可用 help 命令查看保留关键字

Shell数组

#!/bin/bash
array=(1 2 3 4 5);
#获取数组的长度
length=${#array[*]}
length2=${#array[@]}
#输出数组的长度
echo $length
echo $length2
#遍历数组
for i in ${array[@]};do echo $i;done
unset array

Shell基本运算符

关系运算符只支持数字,不支持字符串,除非是字符串的值是数组

#!/bin/bash
score=90;
maxscoe=100;
if [$score -eq $maxsocre] 
then
	echo "A"
else
	echo "B"
fi

逻辑运算符

#!/bin/bash
a=$((1 && 0))
echo $a

文件相关运算符

#!/bin/bash
#判断文件是否可读
file="/usr/learnshell/test.sh"
if [-r $file]

条件判断语句

#!/bin/bash
a=3;
b=9;
if [$a -eq $b]
then
	echo "a == b"
elif [$a -ge $b]
then
	echo "a>=b"
else 
	echo "a<b"
fi

for循环语句

for loop in 1 2 3 4 5 
do
	echo "the value is: $loop"
done

产生10个随机数

#!/bin/bash
for i in {0..9};
do
	echo $RANDOM;
done

输出从1到5

#!/bin/bash
for((i=1;i<=5;i++));do
	echo $i;
done;

while语句

#!/bin/bash
int=1
while(($int<=5))
do
	echo $int
	let "int++"
done

循环读取键盘的输入

while read FILM
do
	echo $FILM
done

shell函数

#!/bin/bash
hello(){
	echo "hello"
}
hello

有返回值的函数

#!/bin/bash
funcWithRetrun(){
	echo "input"
	read a
	echo "intput"
	read b
	return $(($a+$b))
}
funcWithRetrun

文章作者: 穿山甲
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 穿山甲 !
  目录