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和$在行内快速定位比一直按h或l要高效得多。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;你想把域名改成新的。将光标移动到old_domain.com的o上。输入cw你会发现old_domain.com被删除了并且进入了插入模式。直接输入new_domain.com。按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行后面光标移动到第5行输入dd这一行被“剪切”。光标移动到第10行。输入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。步骤与心路历程打开文件注意权限sudo vi /etc/hosts为什么用sudo/etc/hosts是系统级文件普通用户没有写入权限。如果忘记加sudo在最后保存时会报错。这是第一个坑。进入编辑界面输入密码后你看到了hosts文件的内容。你处于命令模式。移动光标到文件末尾你按下G光标瞬间跳到了文件最后一行。准备输入新内容你想在最后一行下面新增一行。按下o键。这时vi在最后一行下方创建了一个新的空行并且光标位于行首自动进入了插入模式。你可以看到屏幕左下角出现-- INSERT --的提示。输入内容你开始输入192.168.1.100 my.test.local。完成输入准备保存输入完毕后你本能地想输入:wq。停这是第二个坑。你现在还在插入模式直接输入:wq会把这四个字符打到文件里。正确的操作是先按Esc键。看到左下角的-- INSERT --消失了吗这说明你成功回到了命令模式。保存并退出现在放心地输入: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不是一个需要“学会”的软件而是一个通过“使用”来精通的工具。
返回列表