前面基本总结了Linux中一些文件的各种操作,后面开始为shell脚本的学习做好准备,这里开始总结vi和vim的内容,依旧参照《鸟哥的Linux私房菜》一书中的内容,本篇博客对应这本书中第九章的学习内容
vi和vim都有三种模式——一般指令模式,编辑模式,命令行模式

三种模式的转换方式如上图所示
一般指令模式:我们vi指令打开文件,就进入了命令模式,在这个模式中,可以通过上下键来移动光标,可以删除字符或删除整行,也可以复制黏贴文件内容,同时通过相关按钮可以退出vi和vim
编辑模式:输入i,a,o按钮,或者insert和replace按键,进入到编辑模式,在编辑模式里头可以编辑文件内容,如果要退出该模式,按Esc键即可。
命令行模式:在一般指令模式中,输入 :,/, ?三个按钮,光标会位于屏幕最底部,在这个模式中,我们可以搜索文档中的相关内容。
通过vi命令创建一个文件,这个就太简单了,这里就不总结了,只是总结一下vi相关的快捷键
| 按钮 | 效果 |
|---|---|
| h 或 ← | 光标向左移动一个字符 |
| j 或 ↓ | 光标向下移动一个字符 |
| k 或 ↑ | 光标向上移动一个字符 |
| l 或 → | 光标向右移动一个字符 |
| [Ctrl]+[f] | 屏幕向下移动一页,等同于Page Down |
| [Ctrl]+[b] | 屏幕向上移动一页,相当于Page Up |
| [Ctrl]+[d] | 屏幕向下移动半页 |
| [Ctrl]+[u] | 屏幕向上移动半页 |
| + | 光标移动到非空格符的下一列 |
| - | 光标移动到非空格符的上一列 |
| n<space> | n表示数字,按下数字键之后按空格,光标会向右移动这一列的n个字符。 |
| 0 或 Home键 | 移动到这一行开头 |
| $ 或 End键 | 移动到这一行的末尾 |
| H | 光标移动到这个屏幕的最上方那一列的第一个字符 |
| M | 光标移动到这个屏幕的中央那一列的第一个字符 |
| L | 光标移动到这个屏幕的最下方那一列的第一个字符 |
| G | 移动到这个文件的最后一列 |
| nG | n为数字,移动到这个文件的第n列 |
| gg | 移动到这个文件的第一列 |
| n<Enter> | n为数字,光标向下移动n列 |
| 按钮 | 效果 |
|---|---|
| /word | 向当前光标之下找寻第一个word的字符串。 |
| ?word | 向当前光标之上寻找一个字符串为word的字符串 |
| n | 这个不是数字,是英文n的按键,是next的意思,搜寻下一个匹配的字符 |
| N | 与n相反,搜寻上一个匹配的字符 |
| :n1,n2s/word1/word2/g | n1与n2为数字,在第n1列与n2列之间寻找word1这个字符串,并将字符串取代为word2 |
| :1,$s/word1/word2/g | 从第一列到最后一列寻找word1字符串,并将字符串word1替换成word2 |
| :1,$s/word1/word2/gc | 从第一列到最后一列寻找word1字符串,并将字符串替换word2,且在取代前给出提示信息 |
| 按钮 | 效果 |
|---|---|
| x,X | 在一列字当中,x为向后删除一个字符(相当于del),X为向前删除一个字符(相当于backspace) |
| nx | n为数字,连续向后删除n个字符 |
| dd | 删除游标所在的那一整列 |
| ndd | n为数字,删除光标所在的向下n列 |
| d1G | 删除光标所在行到第一行的所有数据 |
| dG | 删除光标所在到最后一行的所有数据 |
| d$ | 删除游标所在处,到该列的最后一个字符 |
| d0 | 删除游标所在处,到该列的最前面的一个字符 |
| yy | 复制游标所在的那一行 |
| nyy | n为数字,复制光标所在的向下n列 |
| y1G | 复制光标所在列到第一行的所有数据 |
| yG | 复制光标所在列到最后一行的所有数据 |
| y0 | 复制光标所在的那个字符到该列行首的所有数据 |
| y$ | 复制光标所在的那个字符到该列行尾的所有数据 |
| p,P | p为将已复制的数据在光标下一行贴上,P则为贴在游标上一行 |
| J | 将光标所在行与下一行的数据结合成同一行 |
| c | 重复删除多个数据,比如向下删除10行 |
| u | 复原前一个动作(类似Ctrl+z) |
| [Ctrl]+r | 重做上一个动作 |
| . | 重复前一个动作 |
| 按钮 | 作用 |
|---|---|
| i,I | 【进入插入模式】 i——从目前光标所在处插入。 I——在目前所在列的第一个非空格符处开始插入 |
| a,A | 【进入插入模式】 a——从目前光标所在的下一个字符处开始插入 A——从光标所在行的最后一个字符处开始插入 |
| o,O | 【进入插入模式】 o——目前光标所在的下一行出插入新的一行, O——在目前光标所在的上一行插入一行 |
| r,R | 【进入替换模式】 r——只会允许替换一次 R——可以替换多次,除非按下ESC退出替换模式为止 |
| Esc | 退出编辑模式,回到一般指令模式中 |
| 按钮 | 作用 |
|---|---|
| :w | 将编辑的数据写入到硬盘 |
| :w! | 文件属性为只读的时候,强制写入该文件 (能否写入,还要看权限) |
| :q | 退出vi |
| :q! | 不保存修改,直接退出 |
| :wq | 保存之后直接退出 |
| ZZ | 如果文件没有改动,则直接退出。 如果文件有改动,则保存退出 |
| :w [filename] | 将编辑的数据存储成另一个文件(类似另存为) |
| :r [filename] | 在编辑的数据中,读入另一个文件的数据 |
| :n1,n2 w [filename] | 将n1到n2的内容存储成filename这个文件 |
| :! command | 暂时离开vi,到指令模式下执行command的显示结果 例如::! ls /home 暂时离开vi 查询/home的文件,按Enter回到vi |
| :set nu | 显示行号 |
| :set nonu | 取消行号显示 |
鸟哥的linux中还有一个完整的实例,跟着走一遍,对vi的使用应该算是有较好的理解了。这里就不做总结了。
vim具有颜色显示功能,同时还支持许多的程序语法,功能比vi丰富。上面总结的vi的操作,vim几乎都支持,还提供了很多额外的功能
| 按钮 | 功能 |
|---|---|
| v | 从光标当前位置开始, 光标所经过的地方会被选中, 再按一下v结束 |
| V | 从光标当前行开始, 光标经过的行都会被选中, 再按一下V结束。 |
| Ctrl + v | 从光标当前位置开始, 选中光标起点和终点所构成的矩形区域, 再按一下Ctrl + v结束 |
| y | 复制选中的地方 |
| d | 删除选中的地方 |
| p | 粘贴刚选中的内容 |
vim其实是支持多文件编辑的,只需要在vim命令之后同时接多个文件名即可
## vim 编辑hosts文件和services文件
[root@localhost tmp]# vim hosts services
vim下编辑多个文件的可用按键如下
| 按钮 | 功能 |
|---|---|
| :n | 编辑下一个文件 |
| :N | 编辑上一个文件 |
| :files | 列出当前vim编辑的所有文件 |
实例如下:

可以通过:sp {filename}指令,达到分窗口区域编辑文件的效果
:sp filename
在vim的命令窗口情况下输入上述命令,可将文本进行分区编辑。如下动图所示

这种情况下一些可用按钮如下所示
| 按钮 | 功能 |
|---|---|
| :sp [filename] | 开启一个窗口,如果没有filename, 则表示两个窗口编辑同一个文件内容 |
| ctrl+w+j/↓ | 移动到下方的编辑窗口 |
| ctrl+w+k/↑ | 移动到上方的编辑窗口 |
| ctrl+w+q | 等同于:q退出多窗口编辑 |
《鸟哥的Linux私房菜》一书中,总结了一些vim的快捷键和指令

vi和vim的使用还有些其他需要注意的,换行符是一个。
通常情况下windows下的换行符是CRLF,而Linux下的换行符时LF,如果我们在windows下编写了shell,需要放到linux下执行,这个时候需要注意换行符的处理。这需要用到dos2unix和unix2dos工具
## 安装dos2unix和unix2dos
[root@localhost vitest]# yum install -y dos2unix
[root@localhost vitest]# yum install -y unix2dos

这里不演示具体实例了
[root@localhost vitest]# ls
man_db.conf man.test.config
##将man_db.conf,由unix转成dos,会有相关提示
[root@localhost vitest]# unix2dos -k man_db.conf
unix2dos: converting file man_db.conf to DOS format ...
##将man_db.conf转换成unix,并将转换后的内容输出到新文件
[root@localhost vitest]# dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
##查看文件的属性,会显示换行符的相关信息
[root@localhost vitest]# file man_db.conf*
man_db.conf: ASCII text, with CRLF line terminators
man_db.conf.linux: ASCII text
每个文件编码格式的转换通过iconv命令来处理

简单梳理了一下vi和vim的常见按键和用法,后面进入到shell以及linux的进程、网络管理等内容的总结