Linux 命令完全手册(1),受益匪浅

第一列返回的是行数,第二列是字数,第三列则是比特数。

我们可以让它只计算行数:

wc -l test.txt

或者只计算字数:

wc -w test.txt

或者只计算比特数:

wc -c test.txt

在 ASCII 字符集中,比特数等于字符数。但对于非 ASCII 字符集,由于一些字符可能占用多个比特,字符的数目可能会不同(这在 Unicode 里有发生过)。

这种情况下使用 -m 参数可以得到正确的数目:

wc -m test.txt

Linux 中的 grep 命令


grep 命令是一个非常有用的工具。假若掌握了它,对日常的编码工作会有很大的帮助。

如果你比较好奇, grep 的全写是 global regular expression print (全局正则表达式打印)。

你可以使用 grep 在文件中进行搜索,或者与管道符配合使用,将输出结果传递到其他命令。

例如,可以用以下命令在 index.md 文件里搜寻 document.getElementById 这一行出现的次数:

grep -n document.getElementById index.md

Screen-Shot-2020-09-04-at-09.42.10

使用 -n 参数可以显示行号:

grep -n document.getElementById index.md

Screen-Shot-2020-09-04-at-09.47.04

一个非常有用的方法是告诉 grep 在相应行的前后各输出 2 行,以提供更多的上下文。这可以用参数 -C 来完成,它可以受取其后的若干行数:

grep -nC 2 document.getElementById index.md

Screen-Shot-2020-09-04-at-09.44.35

搜索默认是区分大小写的。使用参数 -i 可以使其不再区分。

如上所述,你可以使用 grep 来过滤其他命令的输出。我们可以使用以下方法重现前述的功能:

less index.md | grep -n document.getElementById

Screen-Shot-2020-09-04-at-09.43.15

搜索字符串中可以使用正则表达式,这让 grep 变得非常强大。

另一个你可能发现很有用的方法是——使用参数 -v 反转结果,排除与特定字符串匹配的行:

Screen-Shot-2020-09-04-at-09.42.04

Linux 中的 sort 命令


假定你有一份文本文件,里面包含一些狗狗的名字:

Screen-Shot-2020-09-07-at-07.56.28

这串名字并没有进行排序。

而 sort 命令会帮你按照名称顺序排列它们:

Screen-Shot-2020-09-07-at-07.57.08

使用 r 参数倒转排序结果:

Screen-Shot-2020-09-07-at-07.57.28

默认情况下,排序区分大小写,并且遵循英文字母顺序。使用 --ignore-case 参数进行不区分大小写的排序,使用 -n 参数可按数值大小顺序进行排序。

如果文件包含重复的行:

Screen-Shot-2020-09-07-at-07.59.03

你可以使用 -u 参数移除它们:

Screen-Shot-2020-09-07-at-07.59.16

sort 命令不像多数 UNIX 命令那样,只是用于操作文件,它还可以与管道符配合使用。因此你可以将它用在其他命令的输出上。例如,你可以用它排序 ls 命令传回的文件列表:

ls | sort

sort 的功能非常强大,它还支持更多的参数,你可以输入 man sort 来探索:

Screen-Shot-2020-09-07-at-08.01.27

Linux 中的 uniq 命令


uniq 命令可以帮助你排序文本文件中的行。

这些行可以通过文件获取,或用管道符从另一个命令的输出中得到:

uniq dogs.txt

ls | uniq

此处需要考虑一个关键点: uniq 只会检测相邻的重复行。

这意味着你可能会将它与 sort 配合使用:

sort dogs.txt | uniq

sort 命令拥有自己的参数—— -u (unique) 来移除重复的行。但 uniq 更为强大。

默认情况下,它会删除重复的行:

Screen-Shot-2020-09-07-at-08.39.35

你可以告诉它只是显示重复的行,例如,使用 -d 参数:

sort dogs.txt | uniq -d

Screen-Shot-2020-09-07-at-08.36.50

还可以使用 -u 参数,那样就只会显示不重复的行:

Screen-Shot-2020-09-07-at-08.38.50

使用 -c 参数计算每一行的出现次数:

Screen-Shot-2020-09-07-at-08.37.15

使用以下的特殊命令组合:

sort dogs.txt | uniq -c | sort -nr

即可将文件内的行按最常见的频率排序:

Screen-Shot-2020-09-07-at-08.37.49

Linux 中的 diff 命令


diff 是一个非常方便的命令。假定有两个文件,它们包含几乎相同的信息,你没有办法找出区别。

diff 会处理文件,然后告诉你有差异的地方。

假定有两个文件: dogs.txt 和 moredogs.txt。它们的区别是: moredogs.txt 比前者多了一条狗狗的名字:

Screen-Shot-2020-09-07-at-08.55.18

diff dogs.txt moredogs.txt 会告诉你后者多了一行,在第 3 行有 Vanille 这一行:

Screen-Shot-2020-09-07-at-08.56.05

如果你改变两个文件的顺序,它会告诉你后者的第三行丢失了,也就是 Vanille 那一行:

Screen-Shot-2020-09-07-at-08.56.10

使用 -y 参数会逐行对比两个文件:

Screen-Shot-2020-09-07-at-08.57.56

你可能更熟悉 -u 参数,因为在 Git 版本管理系统中,它一样是用来显示不同版本文件差异的:

Screen-Shot-2020-09-07-at-08.58.23

对于目录,比较的方式是一样的。你必须使用 -r 选项来进行递归比较(进入子目录):

Screen-Shot-2020-09-07-at-09.01.07

如果你只对哪个文件存在差异感兴趣,而非关注文件的内容,可以使用 r 和 q 参数:

Screen-Shot-2020-09-07-at-09.01.30

它还支持更多参数,你可以用 man 页面来探索,只需键入 man diff

Screen-Shot-2020-09-07-at-09.02.32

Linux 中的 echo 命令


echo 命令会做一件简单的事情:它将传递给自身的参数打印输出。

以下示例:

echo “hello”

会将 hello 输出到终端。

我们可以将输出追加到文件中:

echo “hello” >> output.txt

我们可以对环境变量进行插值:

echo “The path variable is $PATH”

Screen-Shot-2020-09-03-at-15.44.33

注意,特殊字符需要用反斜杠进行转义。以 $ 为例:

Screen-Shot-2020-09-03-at-15.51.18

这只是个开始。当与 Shell 功能交互时,我们可以用它来做一些很棒的事情。

我们可以输出当前文件夹中的文件:

echo *

我们还可以输出当前文件夹中所有以字母 o 开头的文件:

echo o*

任何有效的 Bash(或者是你使用的其他 Shell)命令和功能可以在此使用。

你可以输出你的主文件夹(home)的路径:

echo ~

Screen-Shot-2020-09-03-at-15.46.36

你还可以执行命令,并且将执行结果打印到标准输出(或者是文件,正如你看到的):

echo $(ls -al)

Screen-Shot-2020-09-03-at-15.48.55

注意,输出在默认情况下不保留空白。如需留白,必须用双引号来包裹命令:

Screen-Shot-2020-09-03-at-15.49.53

你可以用它生成字符串列表,例如指定一个范围:

echo {1…5}

Screen-Shot-2020-09-03-at-15.47.19

Linux 中的 chown 命令


在 Linux 或 macOS 操作系统(或是任一 UNIX 系统)中,每个文件或目录都有所有者

所有者可以对文件做任何事情。它可以决定文件的命运。

使用 chown 命令,所有者(以及 root 用户)也可以将文件所有权转移给另一个用户:

chown <所有者> <文件>

像这样:

chown flavio test.txt

例如,假设有一个为 root 所拥有的文件,作为其他用户,你无法对它进行写入:

Screen-Shot-2020-09-03-at-18.40.49

你可以使用 chown 将文件所有权转移到你:

Screen-Shot-2020-09-03-at-18.40.58

一种需求十分常见:改变目录的所有权,同时遍历修改其中包含的文件、子目录以及子目录中的文件的所有权。

你可以使用 -R 参数来完成:

chown -R <所有者> <文件>

文件和目录不仅属于所有者,同时还属于用户组。使用以下命令,你可以在变更所有者的同时,更改其所属用户组:

chown <所有者>:<用户组> <文件>

举例:

chown flavio:users test.txt

你还可以使用 chgrp 命令,只更改文件的所属用户组:

chgrp <用户组> <文件名>

Linux 中的 chmod 命令


在 Linux 或 macOS 操作系统(或是任一 UNIX 系统)中,每个文件都有三种权限:读取、写入和执行。

进入一个文件夹,并运行 ls -al 命令。

Screen-Shot-2020-09-03-at-18.49.22

你在文件列表每一行见到的,像是 drwxr-xr-x 这样的奇怪字符串,定义了文件或文件夹的权限。

让我们来剖析一下。

第一个字母表示文件的类型:

  • - 表示这是一个常规的文件

  • d 表示这是一个目录

  • l 表示这是一个链接

之后你就有了三组值:

  • 第一组代表文件所有者拥有的权限

  • 第二组代表文件所关联的用户组成员拥有的权限

  • 第三组代表其他人拥有的权限

这些组由三个值组成。rwx 代表特定 角色 拥有读取、写入和执行访问权限。任何被移除的权限会被替换为 - ,因此你可以将不同的值,及其代表的相关权限进行组合:例如 rw-r--r-x 等等。

你可以使用 chmod 命令来改变一个文件的权限。

chmod 有两种用法。其一是使用符号参数,其二是使用数字参数。首先来试试更为直观的符号参数。

终端输入 chmod ,空格,之后加上一个字母:

  • a 表示 all,即全体

  • u 表示 user,即用户

  • g 表示 group,即用户组

  • o 表示 others,即其他人

然后输入 + 或 - 并加上一个或多个权限符号(rwx),来添加或删除任意权限。

键入以上所有命令和参数之后,都要加上文件或文件夹名称。

以下是一些例子:

chmod a+r filename #每个人都可以读取

chmod a+rw filename #每个人都可以读取和写入

chmod o-rwx filename #其他人(非文件所有者,也不在文件所属用户组中的用户)无法读取、写入或执行文件

只需要在 +/- 前添加多个字母,即可将相同的权限批量应用到不同的身份:

chmod og-r filename #其他人,和用户组无法读取文件。

如果你正在编辑一个文件夹,你可以使用 -r(递归)参数将权限应用到该文件夹中的每个文件。

使用数字参数速度更快,但我认为当你不是每天都使用的话,是很难记住它们的。数字在此代表任一角色的权限。这个数字值最大可以是7,它是这样计算的:

  • 拥有执行权限,记为 1

  • 拥有写入权限,记为 2

  • 拥有读取权限,记为 4

这又给我们带来四种组合:

  • 0 代表无权限

  • 1 代表可以执行

  • 2 代表可以写入

  • 3 代表可以写入和执行

  • 4 代表可以读取

  • 5 代表可以读取和执行

  • 6 代表可以读取和写入

  • 7 代表可以读取、执行和写入

我们使用三组数字,来同时设置所有 3 个用户身份的全部权限:

chmod 777 filename

chmod 755 filename

chmod 644 filename

Linux 中的 umask 命令


创建一个文件时,不需要事先决定权限。权限有默认值。

这些默认值可以使用 umask 命令来控制和修改。

不带参数输入 umask ,它会显示当前的 umask 值,本例中为 0022

Screen-Shot-2020-09-04-at-09.04.19

0022 是什么意思? 这是一个代表权限的八进制数值。

另一个常见的数值是 0002.

使用 umask -S 查看更具可读性的注释:

Screen-Shot-2020-09-04-at-09.08.18

在这里,用户(u),也就是文件的所有者,拥有对文件的读取、写入和执行的权限。

和所有者位于同一用户组的用户(g)拥有对文件的读取和执行权限,除此之外的其他用户(o)也一样。

在数字符号中,我们通常会改变最后3位数字。

以下列表给出了这些数字的含义:

  • 0 代表读取、写入与执行

  • 1 代表读取与写入

  • 2 代表读取与执行

  • 3 代表只读

  • 4 代表写入与执行

  • 5 代表仅写入

  • 6 代表仅执行

  • 7 代表没有权限

注意,这里的数字含义与前述 chmod 命令中用到的并不同。

可以用数值格式,为权限掩码设置一个新的值:

umask 002

也可以更改特定角色的权限:

umask g+r

Linux 中的 du 命令


du 命令会计算整个目录的大小:

du

Screen-Shot-2020-09-04-at-08.11.30

这里的 32 是一个单位为字节(Byte)的值。

运行 du * 会单独计算每个文件的大小:

Screen-Shot-2020-09-04-at-08.12.35

你也可以执行 du -m 或 du -g,以兆字节(MB)或千兆字节(GB)为单位显示文件大小。

使用 -h 选项,会显示更为可读的,适应大小的数值:

Screen-Shot-2020-09-04-at-08.14.40

添加 -a 选项同样会输出文件夹中每一个文件的大小:

Screen-Shot-2020-09-04-at-08.20.12

一个方便的做法是按大小对目录进行排序:

du -h | sort -nr

然后通过管道输出到 head ,从而仅获取前 10 个结果:

Screen-Shot-2020-09-04-at-08.22.25

Linux 中的 df 命令


df 命令用来获取磁盘的使用情况信息。

它的基础形式会输出当前挂载的磁盘卷信息:

Screen-Shot-2020-09-08-at-08.40.39

使用 -h 参数 (df -h)会将值以更为可读的方式显示:

Screen-Shot-2020-09-08-at-08.40.50

你也可以指定任一文件或目录名,以获取其所在的特定卷的信息:

Screen-Shot-2020-09-08-at-08.41.27

Linux 中的 basename 命令


假设有一个文件路径,比如 /Users/flavio/test.txt

执行

basename /Users/flavio/test.txt

会返回 text.txt 字符串:

Screen-Shot-2020-09-10-at-08.27.52

如果你在任一指向目录的路径字符串上执行 basename ,你会得到路径的最后一节。在以下例子中,/Users/flavio 是一个目录:

Screen-Shot-2020-09-10-at-08.28.11

Linux 中的 dirname 命令


假设有一个文件路径,比如 /Users/flavio/test.txt

执行

dirname /Users/flavio/test.txt

会返回 /Users/flavio 字符串:

Screen-Shot-2020-09-10-at-08.31.08-1

Linux 中的 ps 命令


电脑每时每刻都在运行大量不同的进程。

你可以用 ps 命令检查它们:

Screen-Shot-2020-09-02-at-12.25.08

这是当前会话中运行的,由用户发起的进程列表。

此处我打开了一些 fish Shell 实例,大多数是在 VS Code 编辑器内部启动的,还运行了一个 Hugo 实例,用来生成网站的开发预览。

这些只是分配给当前用户的命令。要列出所有进程,我们需要给 ps 传递一些参数。

我最常使用的命令是 ps ax

Screen-Shot-2020-09-02-at-12.26.00

a 参数用来同时列出其他用户的进程。x 显示那些未与终端相连的进程(不是由用户通过终端发起的)。

如你所见,较长的命令被截断了。使用 ps axww 继续在新的行上列出命令,而非截断。

Screen-Shot-2020-09-02-at-12.30.22

我们需要输入 w 两次来应用这个设置(这不是笔误)。

你可以配合使用 grep 和管道符来搜索特定的进程,比如像这样:

ps axww | grep “Visual Studio Code”

Screen-Shot-2020-09-02-at-12.33.45

ps 返回的列表达了一些重要信息。

第一个信息是 PID,也就是进程 ID。当你想在另一个命令中引用这个进程时,比如说要杀死它,这是关键的。

然后是 TT,它告诉我们进程所使用的终端 ID。

接下来 STAT 告诉我们进程的状态:

I 代表闲置的进程(睡眠时间超过约 20 秒)

R 代表可运行的进程

S 代表睡眠时间少于 20 秒的进程

T 代表已停止的进程

U 代表处于不间断等待中的进程

Z 代表已死亡的进程(zombie,即僵尸进程)

如果出现一个以上的字母,那么第二个字母代表进一步的、可能非常有技术性的信息。

常见的是 + ,它代表相应进程在终端中处于前台。而 s 代表相应进程是一个 会话领头进程(session leader).

TIME 则告诉我们进程已经运行了多长时间。

Linux 中的 top 命令


top 命令用来显示系统中正在运行的进程的动态实时信息。

如果要了解系统发生了什么,这条命令真的很方便。

它的用法很简单。你只需要输入 top ,终端会完全沉浸到新的视图中:

Screen-Shot-2020-09-03-at-11.39.53

这个进程是持续运行的。要退出,你可以输入字母 q 或按下 ctrl-C

它给出了很多信息:进程数量、有多少进程在运行或休眠、系统负载、CPU 使用率,还有更多信息。

在下方,占用 CPU 和内存资源最多的进程列表不断刷新。

默认情况下,进程按 CPU 使用率排列,正如你在高亮标记的 %CPU 列中看到的那样。

你可以添加一个参数,要求进程列表按内存利用率排列:

top -o mem

Linux 中的 kill 命令


Linux 进程可以接收信号并做出反应。

这是我们与运行中进程打交道的一种方式。

kill 程序可以向任一程序发送多种信号。

虽然这个命令的名字暗示了它的主要功能,但它不只是用来终止程序的。

它的用法是:

kill

默认情况下,它会向指定的进程 ID 发送 TERM 信号。

我们可以使用参数来发送其它信号,包括以下这些:

kill -HUP

kill -INT

kill -KILL

kill -TERM

kill -CONT

kill -STOP

HUP 代表 hang up(挂起)。 如果在终止进程之前,先关闭了启动它的终端窗口,这一信号将被自动发送。

INT 代表 interrupt(干扰),这个信号和在终端中按下 ctrl-C 组合键的作用一样,常常用来终结进程。

KILL 信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止并终结。

TERM 代表 terminate(终结)。这是本命令的默认信号,进程收到它会自主终结。

CONT 代表 continue(继续)。它可以用来恢复一个被停止的进程。

STOP 信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止(但不终结)。

有时你也会见到用数字表示状态的情况,例如 kill -1 <PID>。在这种情况下,

1 对应 HUP

2 对应 INT

9 对应 KILL

15 对应 TERM

18 对应 CONT

15 对应 STOP

Linux 中的 killall 命令


与 kill 命令类似, killall 也向进程发送状态信号,但区别是后者可以同时向多个进程发送信号,而非前者只能向单个进程 ID 发送信号。

这是它的命令语法:

killall

name 也就是进程的名字。例如,假设有多个 top 程序的实例在运行, killall top 命令将完全终结它们。

你可以指定某一个信号,就像使用 kill 命令那样(请向上翻阅 kill 命令的指南以了解更多具体可以发送的信号),例如:

killall -HUP top

Linux 中的 jobs 命令


当我们在 Linux / macOS 中运行命令时,我们可以在末尾加入 & 符号,使其在后台运行。

例如,让 top 命令在后台运行:

top &

这对于需要长时间运行的程序来说很方便。

要返回切入后台的程序,可以使用 fg 命令。如果后台只有一个作业进程,那么直接使用就好;否则要在后面加上作业进程的号码,如: fg 1fg 2 ,以此类推。

要获取作业进程号,我们可以使用 jobs 命令。

假设我们运行了 top &,之后再运行 top -o mem & ,因而我们有两个 top 实例在运行。此时 jobs 命令会这样告诉我们:

Screen-Shot-2020-09-03-at-11.49.42

现在我们可以利用 fg <作业号> 切回任意一个实例。要再次终止程序,可以按下 cmd-Z 。

运行 jobs -l 也会列出每一个作业的进程 ID。

Linux 中的 bg 命令


当命令执行时,你可以按下 ctrl-Z 暂停它。

按下后,命令会即刻停止,并将你带回到 Shell 终端。

你可以恢复命令在后台的执行,这样既可以使命令保持运行,同时又不会妨碍你在终端中做其他工作。

在这一例子中,有 2 个命令停止了:

Screen-Shot-2020-09-03-at-16.06.18

运行 bg 1 即可在后台恢复作业 #1 的执行。

我也可以不带任何参数执行 bg 命令,它会默认选取作业列表中的 #1 项。

Linux 中的 fg 命令


当命令在后台运行时,由于此前你已经在命令末尾加上了 & (例如 top & ,或是使用了 bg 命令将命令放到后台),此时你可以用 fg 命令将其切换回前台。

执行

fg

它将在前台恢复最后被暂停的作业。

你也可以加上作业号,即可指定任一你想在前台恢复的作业,作业号可以使用 jobs 命令获得。

Screen-Shot-2020-09-03-at-16.12.46

执行 fg 2 将恢复作业 #2:

Screen-Shot-2020-09-03-at-16.12.54

Linux 中的 type 命令


命令可分为以下四种类型:

  • 可执行程序

  • Shell 内置程序

  • Shell 功能

  • 命令别名

如果你很想知道或只是很好奇,type 命令可以帮你分清这些。它会告诉你某一命令如何被解析。

输出根据 Shell 的类型而有所不同,这是在 Bash 中的样子:

Screen-Shot-2020-09-03-at-16.32.50

这是在 Zsh 中的样子:

Screen-Shot-2020-09-03-at-16.32.57

这是在 Fish 中的样子:

Screen-Shot-2020-09-03-at-16.33.06

其中一个有趣的现象是:对于别名,它会告诉你某个别名将被解析到何处。例如,在 Bash 和 Zsh 中, ll 显示为一个别名,而在 Fish 中,由于 ll 是默认提供的,所以它会告诉你这是内置的 Shell 功能。

Linux 中的 which 命令


假定你有一个可直接执行的命令,因为它处在 Shell 路径中,但你想知道它的具体位置。

你可以用 which 来做这件事。这个命令会返回指定命令的路径。

Screen-Shot-2020-09-03-at-17.22.47

which 只对存储在磁盘上的可执行文件起作用,对别名或内置 Shell 功能无效。

Linux 中的 nohup 命令


有时你必须在远程机器上运行一个长时间活跃的进程,但之后你需要断开连接。

或者,你只是想防止当本地和服务器之间有任何网络问题时,命令被停止执行。

要让任一命令在登出或关闭服务器会话后继续运行,可以使用 nohup 命令。

执行 nohup <命令> 可以让某个进程在你登出后继续工作。

Linux 中的 xargs 命令


在 UNIX Shell 中,xargs 命令用来将标准输入的数据转换成命令的参数。

换句话说,使用 xargs ,可以将一条命令的输出,用作另一条命令的输入。

下面是你将会用到的语法:

command1 | xargs command2

我们使用管道符(|)将输出传递给 xargs。它将负责运行 command2 命令,使用 command1 的输出作为参数。

我们来做个简单的例子。假设你要删除某个目录下的一些特定文件。这些文件列在一个文本文件中。

我们有三个文件: file1、 file2、 file3

在 todelete.txt 中,我们有一份想要删除的文件列表,在这一例子中是 file1 和 file3

Screen-Shot-2020-09-08-at-07.45.28

我们将通过 xargs 把 cat todelete.txt 的输出引向 rm 命令。

就像这样:

cat todelete.txt | xargs rm

以下是执行结果,我们列出的文件现在已经被删除:

Screen-Shot-2020-09-08-at-07.46.39

它的工作方式是:xargs 会运行 rm 2次,为 cat 返回的每一行运行一次。

这是 xargs 最简单的用法。我们还可以使用以下的一些参数。

在我看来,其中最有用的是 -p(特别是刚开始学习 xargs 时)。使用这个选项将使 xargs 打印出一个确认提示,说明它要采取的行动:

Screen-Shot-2020-09-08-at-08.19.09

-n 选项令 xargs 每次执行若干个迭代,因此你可以用 -p 单独确认它们。这里我们用 -n1 告诉 xargs 一次执行一个迭代:

Screen-Shot-2020-09-08-at-08.32.58

另一个广泛应用的参数是 -I。它可以将输出内容放入占位符,之后你可以用来做各种事。

其中一件事是同时运行多个命令,例如:

command1 | xargs -I % /bin/bash -c ‘command2 %; command3 %’

Screen-Shot-2020-09-08-at-08.35.37

你可以将上方的 % 符号换成其他任何东西——它只是个变量。

Linux 中的 vim 编辑器命令


vim 是一个非常流行的文件编辑器,特别是在程序员中。 它被积极开发且经常更新,且有巨大的社区力量围绕着。甚至还有一个 Vim 会议!

在现代系统中,vi 只是 vim 的一个别名,意思是“改进的 vi”(即 “vi improved”)。

你可以在命令行运行 vi 启动它。

Screenshot-2019-02-10-at-11.44.36

调用时指定一个文件名,你就可以编辑对应的文件:

vi test.txt

Screenshot-2019-02-10-at-11.36.21

你需要了解的是,Vim 有两个主要的模式:

  • 命令(command) 模式,也称为 普通(normal) 模式

  • 插入(insert) 模式

当你启动编辑器时,默认处于命令模式。这时你无法像期望的那样,在基于图形界面的编辑器中输入文本。你需要进入插入模式

可以按下 i 键进入插入模式。当你这样做之后, 在编辑器下方会出现 -- 插入 -- (或 INSERT)字样:

Screenshot-2019-02-10-at-11.47.39

现在你可以开始输入了,用文件内容来填充终端屏幕:

Screenshot-2019-02-10-at-11.48.39

你可以用方向键在文件中移动光标,或者使用 h - j - k - l 四个键。 h-l 代表左和右,j-k 代表上和下。

当完成编辑时,按下 esc 键即可退出插入模式,回到命令模式

Screenshot-2019-02-10-at-11.48.44

此时你可以浏览文件,但无法向其添加内容(要注意按下了哪个键,某些键可能是编辑器的命令)。

现在你可能想知道如何保存文件。可以按下 : (冒号),然后输入 w,即 :w

保存并退出,可以按下 : 然后输入 w 和 q,即 :wq

退出但不保存文件,可以按下 : 然后输入 q 和 !,即 :q!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

i` 启动它。

Screenshot-2019-02-10-at-11.44.36

调用时指定一个文件名,你就可以编辑对应的文件:

vi test.txt

Screenshot-2019-02-10-at-11.36.21

你需要了解的是,Vim 有两个主要的模式:

  • 命令(command) 模式,也称为 普通(normal) 模式

  • 插入(insert) 模式

当你启动编辑器时,默认处于命令模式。这时你无法像期望的那样,在基于图形界面的编辑器中输入文本。你需要进入插入模式

可以按下 i 键进入插入模式。当你这样做之后, 在编辑器下方会出现 -- 插入 -- (或 INSERT)字样:

Screenshot-2019-02-10-at-11.47.39

现在你可以开始输入了,用文件内容来填充终端屏幕:

Screenshot-2019-02-10-at-11.48.39

你可以用方向键在文件中移动光标,或者使用 h - j - k - l 四个键。 h-l 代表左和右,j-k 代表上和下。

当完成编辑时,按下 esc 键即可退出插入模式,回到命令模式

Screenshot-2019-02-10-at-11.48.44

此时你可以浏览文件,但无法向其添加内容(要注意按下了哪个键,某些键可能是编辑器的命令)。

现在你可能想知道如何保存文件。可以按下 : (冒号),然后输入 w,即 :w

保存并退出,可以按下 : 然后输入 w 和 q,即 :wq

退出但不保存文件,可以按下 : 然后输入 q 和 !,即 :q!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-0CjxVPqF-1712508047644)]
[外链图片转存中…(img-6FV6oiIZ-1712508047644)]
[外链图片转存中…(img-Q5sJHIVR-1712508047645)]
[外链图片转存中…(img-HJgvCvMj-1712508047645)]
[外链图片转存中…(img-HP7ivV5s-1712508047645)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-Ra9prdqt-1712508047646)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫学习第十六天--------URLError和HTTPError、cookie登录、Handler处理器

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

多轴机械臂/正逆解/轨迹规划/机器人运动学/Matlab/DH法 学习记录01——数学基础

系列文章目录 本科毕设正在做多轴机械臂相关的内容&#xff0c;这里是一个学习机械臂运动学课程的相关记录。 如有任何问题&#xff0c;可发邮件至layraliufoxmail.com问询。 1. 数学基础 文章目录 系列文章目录一、空间位置、姿态描述二、旋转矩阵&#xff08;Rotation matri…

线程池的方式爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

mysql修改密码提示: Your password does not satisfy the current policy requirements

1、问题概述&#xff1f; 环境说明&#xff1a; Red Hat Enterprise Linux7mysql5.7.10 执行如下语句报错&#xff1a; set password for rootlocalhost password(123456); ERROR 1819 (HY000): Your password does not satisfy the current policy requirements意思就是&a…

摄影杂记二

一、相机操作指南 ⑴按键说明&#xff1a; 除了常规的几个模式&#xff0c;里面就特殊场景可以看一下&#xff0c;有全景&#xff0c;支持摇摄。 lock&#xff1a;多功能锁。可以锁定控制按钮和控制环。在设置中找到多功能锁&#xff0c;可以设置锁定什么。 m-fn&#xff1a;多…

Go数据结构的底层原理(图文详解)

空结构体的底层原理 基本类型的字节数 fmt.Println(unsafe.Sizeof(0)) // 8 fmt.Println(unsafe.Sizeof(uint(0))) // 8 a : 0 b : &a fmt.Println(unsafe.Sizeof(b)) // 8int大小跟随系统字长指针的大小也是系统字长 空结构体 a : struct { }{} b : struct {…

国内ChatGPT大数据模型

在中国&#xff0c;随着人工智能技术的迅猛发展&#xff0c;多个科技公司和研究机构已经开发出了与OpenAI的ChatGPT类似的大型语言模型。这些模型通常基于深度学习技术&#xff0c;尤其是Transformer架构&#xff0c;它们在大量的文本数据上进行训练&#xff0c;以理解和生成自…

每天五分钟掌握深度学习框架pytorch:本专栏说明

专栏大纲 专栏计划更新章节在100章左右&#xff0c;之后还会不断更新&#xff0c;都会配备代码实现。以下是专栏大纲 部分代码实现 代码获取 为了方便用户浏览代码&#xff0c;本专栏将代码同步更新到github中&#xff0c;所有用户可以读完专栏内容和代码解析之后&#xff0c…

Struts2:Action类的写法,推荐使用继承ActionSupport类的方法

文章目录 方法一&#xff1a;Action类是一个POJO类&#xff08;简单的Java类&#xff09;ActionDemo2.javastruts_demo2.xmlstruts.xml运行结果其他strutsz_demo1.xml 方法二&#xff1a;实现一个Action的接口ActionDemo2_2.javastruts_demo2.xml运行结果 推荐&#xff01;&…

SiteSpace 使用方法笔记

目录 介绍下载及安装准备工作知网 CNKI 文献分析数据准备数据转换新建项目图形处理 介绍 CiteSpace 是一个用于可视化和分析科学文献的工具。它可以从科学文献库中提取关键词、作者、机构和引用关系等信息&#xff0c;并将其可视化为图形网络。 一些使用案例 下载及安装 下载…

Redis从入门到精通(九)Redis实战(六)基于Redis队列实现异步秒杀下单

文章目录 前言4.5 分布式锁-Redisson4.5.4 Redission锁重试4.5.5 WatchDog机制4.5.5 MutiLock原理 4.6 秒杀优化4.6.1 优化方案4.6.2 完成秒杀优化 4.7 Redis消息队列4.7.1 基于List实现消息队列4.7.2 基于PubSub的消息队列4.7.3 基于Stream的消息队列4.7.4 基于Stream的消息队…

Golang单元测试和压力测试

一.单元测试 1.1 go test工具 go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似&#xff0c;并不需要学习新的语法&#xff0c;规则和工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的…

零代码编程:用kimichat打造一个最简单的window程序

用kimichat可以非常方便的自动生成程序代码&#xff0c;有些小程序可能会频繁使用&#xff0c;如果每次都在vscode中执行就会很麻烦。常用的Python代码&#xff0c;可以直接做成一个window程序&#xff0c;点击就可以打开使用&#xff0c;方便很多。 首先&#xff0c;把kimich…

Tokenize Anything via Prompting

SAM的延续&#xff0c;把SAM输出的token序列用来进行分类&#xff0c;分割和一个自然语言的decoder处理&#xff0c;但其实现在多模态的图像的tokenizer也几乎都是用VIT来实现的。一开始认为这篇文章可能是关于tokenize的&#xff0c;tokenize还是很重要的&#xff0c;后来看完…

JVM虚拟机(一)介绍、JVM组成、堆、栈、方法区/元空间、直接内存

目录 一、JVM 介绍1.1 为什么要学 JVM&#xff1f;1.2 JVM 是什么&#xff1f; 二、JVM 组成2.1 程序计数器2.2 Java堆1&#xff09;JVM 内存结构2&#xff09;Java 1.7 和 1.8 中堆的区别 2.3 Java虚拟机栈1&#xff09;虚拟机栈 和 栈帧2&#xff09;常见面试题 2.4 方法区/元…

搜索二维矩阵2 合并两个有序链表

240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int i matrix.size() - 1, j 0;while(i > 0 && j < matrix[0].size()){if(matrix[i][j…

基于wsl的Ubuntu20.04上安装桌面环境

在子系统Ubuntu20.04上安装桌面环境 1. 更换软件源 由于Ubuntu默认的软件源在国外&#xff0c;有时候后可能会造成下载软件卡顿&#xff0c;这里我们更换为国内的阿里云源&#xff0c;其他国内源亦可。 双击打开Ubuntu20.04 LTS图标&#xff0c;在命令行中输入 # 备份原来的软…

Java(二)面向对象进阶

目录 面向对象 多态性 向下转型 Object equals() toString() clone() finalize() Static 单例模式 代码块 final 抽象类与抽象方法(或abstract关键字&#xff09; 接口 接口的多态性 接口的默认方法 内部类 成员内部类 局部内部类 枚举类 实现接口的枚举类 …

网络安全流量平台_优缺点分析

FlowShadow&#xff08;流影&#xff09;&#xff0c;Ntm&#xff08;派网&#xff09;&#xff0c;Elastiflow。 Arkimesuricata&#xff0c;QNSMsuricata&#xff0c;Malcolm套件。 Malcolm套件优点&#xff1a;支持文件还原反病毒引擎&#xff08;clamav/yara&#xff09;…

IntelliJ IDEA 2024.1 更新亮点汇总:全面提升开发体验

IntelliJ IDEA 2024.1 更新亮点汇总&#xff1a;全面提升开发体验 文章目录 IntelliJ IDEA 2024.1 更新亮点汇总&#xff1a;全面提升开发体验摘要引言 IntelliJ IDEA 2024.1 的新增功能主要亮点全行代码完成 最终的支持 Java 22 功能新航站楼 贝塔编辑器中的粘滞线 人工智能助…