高级Linux运维工程师养成记-vim编辑器从入门到进阶
vim编辑器概述
vim是Linux平台上功能强大基于模式的文本编辑工具,可以用于文本编辑、脚本开发、甚至是程序开发等等应用场景。相对于gedit(图形化界面的文本编辑器)会让初学者感觉到挺难用,因为要记住大量的命令,但是一旦熟练运用后效率高于其他文本编辑工具。
检查系统中是否安装了vim,只需要执行vim命令,如果能够输出如下所示的版本信息,则表示该系统上可以使用vim,退出vim可以使用:q<Enter>
CentOS8.2的vim
如果安装系统是选择的最小化安装,则需要使用
yum install -y vim
来安装vim编辑器
vim编辑器的安装路径是/usr/bin/vim
[root@centos8 ~]# which vim
/usr/bin/vim
而安装包是vim-enhanced-8.0.1763-13.el8.x86_64,CentOS系列可以使用rpm -qf查看 软件安装包的来源
[root@centos8 ~]# rpm -qf `which vim`
vim-enhanced-8.0.1763-13.el8.x86_64
和vim编辑器类似的编辑器还有vi编辑器,它们两者不是同一个软件包,vim是vi(Visual Interface)的加强版。
查看vi编辑器的安装包
[root@centos8 ~]# rpm -qf `which vi`
vim-minimal-8.0.1763-13.el8.x86_64
vi和vim最大的区别就是可以语法加亮,在编辑文本时会给文本文件内容增加颜色(和路径相关)。vim完全兼容vi。
vi和vim编辑/etc/passwd文件
将/etc/passwd文件复制到/data目录下,然后使用vim打开
[root@centos8 ~]# cd /data/
[root@centos8 data]# cp /etc/passwd /data/
[root@centos8 data]# vim /data/passwd
由于passwd文件的路径发生了变化(位于/data目录下),因此文件的内容不会有颜色,因为之前vim判断/etc目录是系统配置文件,才会给passwd文件的内容带颜色。
vim打开文件
使用vim打开文件时,可以使用vim [option]... file...
打开,其中常用的选项有
- +# 打开文件后,让光标处于第#行的行首,+默认是行尾
- +/PATTERN 让光标处于第一个被PATTERN匹配到的行首
- -b file 二进制方式打开文件
- -d file1 file2 比较多个文件
- -m file 只读方式打开文件
- e 直接进入ex模式
使用vim打开/data目录下的passwd文件,并且默认光标定位在第十行
[root@centos8 data]# vim +10 /data/passwd
![vim +# 定位指定的行数 vim +# 定位指定的行数](./images/1597458215246.png)
使用vim打开/data目录下的passwd文件,并且光标定位在以/bin开头的行
[root@centos8 data]# vim +/^bin /data/passwd
![光标定位在以/bin开头的行 光标定位在以/bin开头的行](./images/1597458111448.png)
使用vim打开/data目录下的passwd文件,并且光标定位在包含FTP的行
[root@centos8 ~]# vim +/FTP /data/passwd
![光标定位在包含FTP的行 光标定位在包含FTP的行](./images/1597458290226.png)
使用vim比较两个文件的差异
在vim打开文件时,如果文件存在,文件被打开并显示文件内容,如果文件不存在,当编辑后第一次存到磁盘时创建它。
首先使用vim创建两个文件,source.txt和target.txt,并查看文件内容。
在编辑source.txt和target.txt文件内容时,首先按i进入编辑模式,编辑文件后按esc退出编辑模式,然后按:进入扩展命令模式,并按wq存盘退出。
[root@centos8 data]# vim source.txt
[root@centos8 data]# vim target.txt
[root@centos8 data]# cat source.txt
this is test content
[root@centos8 data]# cat target.txt
this is test content
THIS IS TEST CONTENT
编辑source.txt
编辑target.txt
然后使用vim -d source.txt target.txt
比较两个文件的差异
如果想要退出可以按esc后使用:切换到扩展命令模式然后输入qall退出文本比较
[root@centos8 data]# vim -d source.txt target.txt
vim比较source.txt和target.txt文件的差异
使用vim同时打开source.txt和target.txt
[root@centos8 data]# vim -o source.txt target.txt
此时会同时开启来两个文本编辑的窗口,在左右两边窗口切换,可以先按快捷键Ctrl+w 松手后再按方向键左或者右来切换窗口,退出首先按esc,然后按:进入扩展命令模式,输入qall退出编辑窗口
使用vim以只读模式打开source.txt
[root@centos8 data]# vim -m source.txt
只读模式提示文件进制修改
vim模式
vim编辑器有三种模式,分别是命令行模式(command mode)、编辑模式(edit mode)、扩展模式(extended command mode)
-
命令模式是默认模式,主要用于查看文件、移动光标、剪切、粘贴文本,无法输入内容
-
编辑模式主要用于修改文本
-
扩展模式主要用于保存退出(:wq)、未修改退出(:q)、强行退出(:q!)等等。
ESC键总是用于退出当前模式,两次ESC键总是返回命令模式。
vim模式切换
vim编辑器默认的模式是命令模式
使用vim编辑(查看)/data目录下的passwd文件,此时是命令模式,不能修改文件
[root@centos8 data]# vim /data/passwd
要修改文件需要从命令模式切换成编辑模式
命令模式切换成编辑模式可以通过 a、A、o、O、i、I键来切换
- i表示在当前字符之前插入
- I表示在行首插入
- a表示在当前字符之后插入
- A表示在行尾插入
- o表示在下一行插入(另起一行)
- O表示上一行插入
编辑模式下编辑/data/passwd文件
![编辑模式新增内容 编辑模式新增内容](./images/1597459647867.png)
编辑完成以后按esc可以退出编辑模式,然后按:进入扩展命令模式,输入wq即可保存修改的内容并且退出vim编辑器。w表示write,q表示quit
修改完成后可以使用只读的方式查看
vim命令模式
vim命令模式-光标跳转
当使用vim打开文件时默认就进入了命令模式,在命令模式下可以使用k,j,h,l实现基于字符之间的光标跳转。
- k表示光标向上
- j表示光标向下
- h表示光标向左
- l表示光标向右
![光标的上下左右移动 光标的上下左右移动](./images/1597460651894.png)
在上下左右移动时,如果想要一次性移动多个字符,可以使用数字加k,j,h,l实现。例如3+h(先按3,再按h)表示向左移动3个字符。
vim命令模式下光标跳转除了基于字符跳转以外,还可以使用w,e,b来实现单词间的跳转
- w表示下一个单词的词首
- e表示当前或下一个单词的词尾
- b表示当前或者前一个单词的词首
![单词词首和词尾 单词词首和词尾](./images/1597054090194.png)
还可使用数字+w,e,b实现多个单词跳转
vim命令模式下光标跳转还能再当前页跳转,命令模式下当前页跳转的常用命令
- H 页首
- M当前页的中间行
- L当前页的页底
- zt 将光标所在当前行移动到屏幕顶端
- zz 将光标所在行移动到屏幕中间
- zb 将光标所在当前行移动到屏幕底端
当前页
vim命令模式还可以实现行、句子和段落的跳转
vim命令模式光标跳转还可以实现行首行尾跳转
- 0 跳转至光标所在行的行首
- $ 跳转至光标所在行的行尾
- ^ 跳转至光标所在行行首的第一个非空白字符
![行首行尾跳转 行首行尾跳转](./images/1597054572586.png)
vim命令模式光标跳转还可以跳转到指定的行,通过行数+G即可
在vim命令模式下输入10和大写字母G跳转到文件的第十行
![行跳转 行跳转](./images/1597054748478.png)
-
gg可以跳到文件首行的第一个字符
-
G 可以跳到文件最后一行的第一个字符
-
shfit+( 和shift+)可以实现句子之间的移动,其中(表示上一句,)表示下一句,句子是以.号结尾的内容
![使用(和)实现句子之间的跳转 使用(和)实现句子之间的跳转](./images/1597056196868.png)
- 使用{和}实现段落之间的移动,如果内容之间有空行就形成了段落,其中}表示下一段,而{表示上一段
![使用{和}实现段落的跳转 使用{和}实现段落的跳转](./images/1597056385125.png)
vim命令模式操作
vim在命令模式下还可以使用相关的命令来完成字符编辑、替换、删除、复制操作
-
编辑命令
- x 删除光标处的字符
- number+x 删除光标处起始的number个字符
- xp 交换光标所在处的字符以及后面字符的位置(例如im交换之后就是mi)
- shift+~ 转换大小写
- J 删除当前行后的换行符
-
替换命令
- r 替换光标所在处的字符(单个字符)
-R 切换成REPLACE模式,此时会替换指定的内容
- r 替换光标所在处的字符(单个字符)
-
删除命令
- d 删除命令,可结合光标跳转字符,实现指定范围删除,例如dgg可以删除光标到行首的内容
- d$ 删除到行尾
- d^ 删除到非空行首
- d0 删除到行首
- dw 删除单词到下一个单词的词首
- de 删除单词到下一个单词的词尾
- db 删除到此到前一个单词的词首
- dd 删除所在行
- D: 从当前光标位置一直删除到行尾,等同于d$
常用的删除操作是dd,即删除光标所在的行
-
复制命令
- y 复制,可以结合光标跳转字符,实现指定范围复制
- y$
- y0
- y^
- ye
- yw
- yb
- yy 复制行
- Y 复制整行
-
粘贴命令
- p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方,否则粘贴至当前光标所在处的后面
- P 缓冲区如存的如果为整行,则粘贴当前光标所在行的上方,否则粘贴至当前光标所在处的前面
-
改变命令
- c 修改后切换成插入模式
- c$ 删除光标到行首并切换到插入模式
- c^
- c0
- cb
- ce
- cw
- cc 删除当前行并输入新内容,相当于S
- C 删除当前光标到行尾,并切换成插入模式
命令模式操作文本总结
修改(替换) | 删除(剪切) | 复制 | |
---|---|---|---|
行 | cc | dd | yy |
字符 | cl | dl | yl |
单词 | cw | dw | yw |
句子头 | c) | d) | y) |
句子尾 | c( | d( | y( |
段落头 | c{ | d{ | y{ |
段落尾 | c} | d} | y} |
命令模式其他命令
- 100iliu[ESC] 粘贴liu 100次
- 起始位置加命令加结束位置
- 0 行首
- y 从这里开始拷贝
- $ 行尾
- gU变大写
- gu变小写
- y 复制
- d 删除
![选中行变大写 选中行变大写](./images/1597061658007.png)
- di" 删除双引号""之间的内容
- yi( 删除小括号()之间的内容
- vi[ 光标在
[]
之间,则选中[]
之间的内容 - dtx 删除字符直到遇见光标之后的第一个x字符
- ytx 复制字符直到遇见光标之后第一个x字符
vim编辑模式
vim扩展命令模式
使用vim打开文件时默认是命令模式,输入:可以切换成扩展命令模式
文件编辑修改完成后如果要保存退出,此时需要从编辑模式切换到扩展命令模式,输入冒号(:)即可从编辑模式切换到扩展命令模式
切换成扩展命令模式后,通常会输入wq表示存储修改的文件内容并退出vim编辑器。
vim在扩展命令模式下存盘退出还有其他几种形式
- q vim打开文件并未做修改,此时可以在扩展命令模式下使用q退出
- q! vim编辑文件内容后不想保存修改的内容,可以使用q!退出,会丢失修改的内容
- w vim编辑文件内容后保存文件内容到磁盘
除了存盘退出以外,vim编辑器的命令扩展模式还提供了一些日常运维常用的功能
- 使用vim的扩展命令模式实现将/etc/issue文件的内容读取到/data/passwd文件中
在扩展命令模式下输入r 然后加上文件路径并回车即可
![读取文件内容到当前文件中 读取文件内容到当前文件中](./images/1597049772635.png)
读取/etc/issue文件的内容
读取之后的文件内容
- 使用vim的扩展命令模式实现将/data/passwd文件另存为passwd.old
在扩展命令模式下输入w 然后加上另存为文件的名称并回车即可
![文件另存为 文件另存为](./images/1597461107414.png)
- 使用vim的扩展命令模式实现查看之前另存为文件passwd.old的详细信息
在扩展命令模式下输入!ls -l|grep passwd.old 并回车后即可查看该文件的详细信息,然后按回车可以返回到命令模式
![扩展命令模式下执行命令 扩展命令模式下执行命令](./images/1597461219213.png)
执行命令的结果
![扩展命令模式下执行命令的结果 扩展命令模式下执行命令的结果](./images/1597461162218.png)
- 使用vim的扩展命令模式读取内核版本到/data/passwd文件中
在扩展命令模式下使用r!uname -a并回车后即可实现将内核版本信息写入文件
![读取内核版本写入到/data/passwd文件中 读取内核版本写入到/data/passwd文件中](./images/1597461545308.png)
写入内核版本信息成功
![写入成功 写入成功](./images/1597461596282.png)