三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux运维必备:从零掌握vi编辑器核心操作与高效技巧

Linux运维必备:从零掌握vi编辑器核心操作与高效技巧

1. 从“不敢动”到“离不开”:为什么vi是Linux的生存技能

如果你刚开始接触Linux,无论是自己搭个服务器,还是在公司里维护线上环境,大概率会遇到一个场景:你需要改一个配置文件,比如网络设置或者用户权限。你信心满满地敲下nano或者gedit,结果系统冷冷地回你一句“command not found”。这时候,老鸟会告诉你,用vi或者vim。你半信半疑地敲下vi somefile.conf,屏幕一闪,进入了一个看似简洁但完全不知道怎么操作的界面。你试着按了几下方向键,光标没动,却打出了几个莫名其妙的字母;你想输入文字,敲了半天键盘,屏幕上纹丝不动;最后你想放弃了,却发现连怎么退出都不知道,只能尴尬地重启终端或者求助他人。

这个场景,几乎是每个Linux新手的“成人礼”。vi(及其增强版vim)之所以让人又爱又恨,是因为它几乎预装在每一个Unix-like系统(包括Linux、macOS、各种BSD)中。在服务器运维、嵌入式开发、甚至只是修改路由器固件时,vi往往是那个唯一可用的、最可靠的文本编辑器。它不像图形化编辑器那样依赖复杂的运行环境,一个最小的系统只要有shell,就一定有vi。因此,掌握vi的基础操作,不是一项“锦上添花”的技能,而是一项“雪中送炭”的生存能力。它意味着无论环境多么简陋,你都能对系统进行最基础的配置和故障排查。

很多人觉得vi的学习曲线陡峭,那是因为它的操作模式与常见的“所见即所得”编辑器截然不同。它区分了“命令模式”和“插入模式”,这种设计源于早期终端机性能有限,为了减少与服务器的通信次数而诞生的高效哲学。一旦你理解了它的逻辑并掌握了核心的“增删改查保存”操作,你就会发现,在纯键盘操作下,它的效率高得惊人。本文的目的,就是帮你跨过最初那道恐惧的门槛,聚焦于最核心、最高频的操作:打开文件、移动光标、修改内容、删除文本、保存退出。我们不追求成为vi大师,但求在关键时刻,你能从容不迫地完成任务,而不是对着屏幕干瞪眼。

2. 理解vi的双模式:一切操作的基础逻辑

在深入具体命令之前,必须彻底理解vi操作模式的核心思想,这是所有困惑的根源。vi将编辑工作分成了两个主要的“状态”或“模式”,你可以把它想象成开车时的“D档(行驶档)”和“P档(驻车档)”。

命令模式:这是你启动vi后进入的默认模式。在这个模式下,你敲击的每一个字母键,都不是在输入字符,而是在向vi下达一个指令。例如,按j不是输入字母j,而是让光标向下移动一行;按x不是输入字母x,而是删除光标下的一个字符。这个模式就像汽车的“P档”,你不能直接开动(输入文字),但可以完成挂挡、拉手刹(执行删除、复制、保存等管理操作)。

插入模式:这是真正进行文字输入和编辑的模式。只有进入这个模式,你敲击键盘,字符才会出现在屏幕上。这就像挂上了“D档”,车子可以前进了。从命令模式进入插入模式有多个“入口”,最常用的是按i(在光标前插入)或a(在光标后插入)。

两种模式之间的切换,是流畅使用vi的关键:

  • 命令模式 -> 插入模式:按i,a,o,I,A,O等键。
  • 插入模式 -> 命令模式:按Esc键(键盘左上角)。这是最重要的一个键!在插入模式下,无论你输入了什么,只要按下Esc,就会立刻回到命令模式。

一个常见的误区是,新手在插入模式下输入完文字,想保存,于是下意识地在文件末尾输入:wq,结果屏幕上出现了“:wq”这几个字符,而不是执行保存退出命令。这就是因为还在插入模式下。正确的做法是:先按Esc确保回到命令模式,然后再输入:wq并回车。

提示:如果你不确定当前处于哪种模式,有一个安全又有效的方法——多按几次Esc键。即使你已经在命令模式,多按几次Esc也不会有什么坏处(可能会听到提示音),但这样可以确保你100%回到命令模式,然后再执行后续命令。

理解了模式,我们再来看看如何打开文件。在终端中,最基本的命令是vi 文件名。如果文件不存在,vi会为你创建一个新的缓冲区,直到你第一次执行保存操作时,该文件才会被实际创建。如果你想同时打开多个文件,可以这样:vi file1.txt file2.conf。打开后,默认显示第一个文件的内容。

3. 核心操作一:在文件中精准移动光标

在命令模式下,你不能使用鼠标,也不能依赖方向键(在某些非常古老的终端模拟器或最小化系统中,方向键可能被映射为奇怪的字符)。因此,vi提供了一套完全基于字母键的光标移动方案,这也是其高效性的体现。

基础移动(必须掌握):

  • h:向左移动一个字符。
  • j:向下移动一行。
  • k:向上移动一行。
  • l:向右移动一个字符。 这四个键在键盘上相邻,非常容易记忆。刚开始你可能觉得别扭,但用习惯了会发现手不用离开主键盘区,速度远快于去够方向键。

快速移动(大幅提升效率):

  • 0(数字零):移动到当前行的行首
  • $:移动到当前行的行尾
  • gg:移动到文件第一行的开头。
  • G:移动到文件最后一行的开头。
  • :n:输入冒号后加数字,然后回车,可以跳转到指定的第n行。例如:50回车,跳转到第50行。这在查看日志或修改大型配置文件时非常有用。
  • w:移动到下一个单词(word)的开头。
  • b:移动到上一个单词的开头。

屏幕滚动:

  • Ctrl + f:向下翻一页(Forward)。
  • Ctrl + b:向上翻一页(Backward)。
  • Ctrl + d:向下翻半页(Down)。
  • Ctrl + u:向上翻半页(Up)。

这里分享一个我个人的习惯:在修改配置文件时,我经常先用G跳到文件末尾,看看最近追加的日志或配置,再用gg回到开头检查全局设置。用0$在行内快速定位,比一直按hl要高效得多。

4. 核心操作二:插入、替换与修改文本

知道怎么移动了,接下来就要开始编辑了。首先,你需要从命令模式进入插入模式。

进入插入模式(在光标位置开始输入):

  • i:在当前光标位置之前插入。这是最常用的方式。
  • a:在当前光标位置之后插入。
  • o:在当前行的下方新建一行,并进入插入模式。
  • O(大写字母O):在当前行的上方新建一行,并进入插入模式。

行首行尾插入:

  • I(大写字母I):移动到当前行的行首第一个非空白字符处,并进入插入模式。这比按0再按i更快捷。
  • A(大写字母A):移动到当前行的行尾,并进入插入模式。这比按$再按a更快捷。

替换单个或多个字符:有时你不想进入插入模式慢慢打字,只是想改掉一两个错的字符。

  • r:替换光标下的一个字符。按r后,再按一个你要替换成的字符,操作立即完成,且保持在命令模式。例如,光标在字母“a”上,按r再按b,“a”就变成了“b”。
  • R(大写字母R):进入替换模式。此时你输入的每个字符都会直接覆盖光标及之后原有的字符,直到你按下Esc退出。这相当于Windows下的“改写”模式。

修改单词或到行尾:c命令是“修改”,它结合了删除和进入插入模式两个动作,非常高效。

  • cw:修改从光标位置到当前单词末尾的内容。vi会删除这些字符,并自动进入插入模式,等你输入新内容。
  • c$:修改从光标位置到行尾的内容。
  • cc:修改整行内容。相当于删除当前行并进入插入模式。

举个例子,假设有一行配置是server_name old_domain.com;,你想把域名改成新的。

  1. 将光标移动到old_domain.como上。
  2. 输入cw,你会发现old_domain.com被删除了,并且进入了插入模式。
  3. 直接输入new_domain.com
  4. Esc回到命令模式。 整个过程无需使用删除键,也无需手动按i进入插入模式,一气呵成。

5. 核心操作三:高效且无痛的删除操作

删除是编辑中最常见的操作之一。vi的删除命令非常强大,而且与移动命令结合,可以精确控制删除范围。

删除字符:

  • x:删除光标所在位置的字符。
  • X(大写字母X):删除光标前一个位置的字符(相当于Backspace)。

删除单词和行:

  • dw:删除从光标位置到当前单词末尾(包括单词后的空格)。如果光标在单词开头,就是删除整个单词。
  • dd:删除整行。这是使用频率最高的删除命令之一。
  • D(大写字母D):删除从光标位置到行尾的所有内容。相当于d$
  • d0:删除从光标位置到行首的所有内容。

删除多行或结合移动:d命令可以和各种移动命令组合,实现任意范围的删除。

  • d3w:删除3个单词
  • 2dd:删除2行(从当前行开始算)。
  • dG:删除从当前行到文件末尾的所有行。(警告:这个命令很危险,用前务必确认!
  • dgg:删除从当前行到文件开头的所有行。(同样危险!

这里有一个非常重要的技巧:vi的删除操作,实际上是把内容放到了“匿名寄存器”里。这意味着你刚刚用dd删除的那一行,可以用粘贴命令p再贴出来。所以,dd在很多情况下也可以当作“剪切”来用。例如,你想把第5行移动到第10行后面:

  1. 光标移动到第5行,输入dd,这一行被“剪切”。
  2. 光标移动到第10行。
  3. 输入p,被删除的第5行内容就会粘贴到第10行的下方

注意:vi的删除是不可逆的吗?在未保存前,你可以使用撤销命令u来撤销上一次的编辑操作(包括删除)。但一旦执行了保存(:w),历史编辑记录通常就会被清空,无法再撤销之前的操作了。所以,在执行涉及大量删除(如dG)的操作前,请务必三思。

6. 核心操作四:保存、退出与强制处理

所有编辑工作的最终目的,要么是保存成果,要么是放弃修改。vi的相关命令都以冒号:开头,在命令模式下输入:,光标会跳到屏幕底部,等待你输入更复杂的“末行命令”。

基础保存与退出:

  • :w保存文件。如果是新文件,需要指定文件名,如:w newfile.txt
  • :q退出vi。如果文件没有修改,会直接退出。如果文件被修改过但没有保存,vi会拒绝退出并给出提示。
  • :wq保存并退出。这是最常用的组合,相当于“写入并退出”。
  • :x:功能与:wq几乎相同,也是保存并退出。但它有一个细微差别:只有当文件确实被修改过时,:x才会执行保存操作并更新文件的修改时间;如果文件没有被修改,:x会直接退出而不改变文件时间戳。:wq则无条件写入。在脚本或自动化场景中,:x可能更精确。

不保存强制退出:当你改乱了文件,想放弃所有修改,回到文件最初打开时的状态,就需要强制退出。

  • :q!强制退出,不保存!表示强制执行。这是放弃当前所有修改的唯一方法。

强制保存(处理权限问题):有时你编辑一个需要root权限的文件(如/etc/hosts),但忘记用sudo启动vi。编辑完成后输入:wq,会得到“E45: ‘readonly‘ option is set (add ! to override)”或权限拒绝的错误。

  • :w !sudo tee %:这是一个经典的技巧组合命令。
    • :w表示写入。
    • !后面接shell命令。
    • sudo tee %%在vi中代表当前文件名。tee命令将从标准输入读取数据,同时写入文件和标准输出。整个命令的意思是:将当前缓冲区的内容,通过管道传递给sudo tee 文件名这个shell命令来执行写入。系统会提示你输入root密码。
  • 输入上述命令并回车后,可能会提示文件已被修改,是否重新加载。输入L(Load) 即可。
  • 最后,再执行:q!退出。因为文件已经被外部命令保存了,vi内部的缓冲区可能认为文件被外部修改,用:q!强制退出即可。

另存为与部分保存:

  • :w new_filename:将当前内容另存为一个新文件,原文件不变。
  • :n,m w filename:将第n行到第m行的内容,单独保存到文件filename中。例如,:10,20 w part.txt将10到20行保存为part.txt。

7. 实战避坑:从打开到保存退出的完整流程与高频问题

光知道命令不够,我们用一个修改Linux系统/etc/hosts文件的完整例子,串联所有操作,并指出其中容易踩的坑。

场景:你需要为本机添加一个域名映射,将my.test.local指向192.168.1.100

步骤与心路历程:

  1. 打开文件(注意权限)

    sudo vi /etc/hosts
    • 为什么用sudo?/etc/hosts是系统级文件,普通用户没有写入权限。如果忘记加sudo,在最后保存时会报错。这是第一个坑。
  2. 进入编辑界面:输入密码后,你看到了hosts文件的内容。你处于命令模式。

  3. 移动光标到文件末尾:你按下G,光标瞬间跳到了文件最后一行。

  4. 准备输入新内容:你想在最后一行下面新增一行。按下o键。这时,vi在最后一行下方创建了一个新的空行,并且光标位于行首,自动进入了插入模式。你可以看到屏幕左下角出现-- INSERT --的提示。

  5. 输入内容:你开始输入:192.168.1.100 my.test.local

  6. 完成输入,准备保存:输入完毕后,你本能地想输入:wq停!这是第二个坑。你现在还在插入模式,直接输入:wq会把这四个字符打到文件里。正确的操作是:先按Esc键。看到左下角的-- INSERT --消失了吗?这说明你成功回到了命令模式。

  7. 保存并退出:现在,放心地输入:wq,然后回车。文件保存,vi关闭,回到终端。

可能遇到的意外与解决:

  • 意外一:输错了内容,想重来。在插入模式下,你可以用退格键修改。如果已经按了Esc回到命令模式,发现整行都错了,可以将光标移到该行,按dd删除整行,再按o新建一行重新输入。
  • 意外二:修改了多处,但只想放弃所有修改。直接输入:q!回车,强行退出,文件会保持打开时的原样。
  • 意外三:忘记sudo,保存时报错。如前所述,使用:w !sudo tee %这个“救命命令”。
  • 意外四:屏幕显示乱码或异常。有时终端窗口大小变化可能导致vi显示错乱。在命令模式下输入Ctrl + l(小写L)可以重绘屏幕,通常能解决显示问题。

一个关于保存的深刻教训:我曾经在修改一个重要的生产服务器配置时,因为长时间操作,中途网络抖动导致SSH连接断开。重新连接后,发现vi编辑的配置文件没有保存,几十分钟的工作白费了。后来才知道,vi有交换文件(.swp)机制。如果vi异常退出,当你再次用vi打开同一个文件时,它会提示发现交换文件,并询问你是恢复(R)、删除交换文件(D)还是退出(Q)。选择恢复(R),有很大几率能找回之前未保存的修改。这是一个非常重要的故障恢复技巧。

8. 效率飞跃:掌握搜索、撤销与重复命令

当你熟练了基本编辑后,下面三个命令能让你的效率再上一个台阶。

搜索文本: 在命令模式下,输入/后跟要搜索的字符串,然后回车。例如/error会搜索文件中所有的“error”。

  • n:跳转到下一个匹配项。
  • N(大写字母N):跳转到上一个匹配项。 搜索在排查日志时极其有用。比如在长长的系统日志里/Failed快速定位错误行。

撤销与重做

  • u撤销上一次编辑操作。可以连续按u进行多次撤销。
  • Ctrl + r重做,即撤销刚才的撤销操作。

重复上一个操作.(英文句点):这是一个威力巨大的命令。它会重复你上一次在命令模式下所做的编辑操作

  • 例如,你刚刚用dw删除了一个单词。将光标移到另一个需要删除的单词上,只需按一个.,就等效于又执行了一次dw
  • 再比如,你在一行末尾添加了一个分号;(操作是A;Esc)。接下来在其它几十行都需要做同样操作,你只需要移动到每一行,按.即可,无需再重复A;Esc这一系列按键。

最后,如何查看当前正在编辑的文件信息和状态?在命令模式下输入Ctrl + g,屏幕底部会显示文件名、是否被修改、总行数以及光标当前位置等信息。

从畏惧到熟练使用vi,关键在于度过最初十几分钟的适应期。我的建议是,不要试图一次性记住所有命令。先把本文讲的“打开、移动(i/j/k/l)、插入(i/a/o)、删除(x/dd)、保存退出(:wq/:q!)”这五大核心操作练熟,形成肌肉记忆。在你的个人虚拟机或测试服务器上,随便创建一个文本文件,反复练习这个完整流程。一旦你发现可以在不碰鼠标、不碰方向键的情况下完成一次简单的编辑,你就已经突破了最大的障碍。剩下的那些高效命令,会在你日后无数次的使用中,自然而然地被吸收和掌握。记住,vi不是一个需要“学会”的软件,而是一个通过“使用”来精通的工具。

← 返回列表