文件管理 - Linux系统VIM编辑

1. VIM基本介绍

vi和vim命令是linux中强大的文本编辑器, 由于Linux系统一切皆文件,而配置一个服务就是在修改其配置文件的参数。vim编辑器是运维工程师必须掌握的一个工具, 没有它很多工作都无法完成。

vim其实是vi的升级版

vi与vim的区别

特性 vi vim
语法高亮 不支持 支持
颜色显示 不显示高亮颜色语法 显示高亮颜色语法
其他功能 基础功能 功能更强大

其他功能没有什么区别。所以在linux系统下,使用vi还是vim取决个人习惯。

安装VIM

如果在刚装完的CentOS操作系统下没有vim这个命令,用如下方式进行安装即可:

1
yum install -y vim-enhanced

2. VIM模式介绍

Vim编辑器中设置了三种模式: 命令模式编辑模式末行模式,每种模式分别又支持多种不同的命令快捷键,大大提高了工作效率,而且用户在习惯之后也会觉得相当顺手。要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法。

2.1 命令模式

控制光标移动, 可对文本进行复制、粘贴、删除等工作。

使用vim filename编辑一个文件时,一进入该文件就是命令模式了。

在这个模式下,可以进行光标移动、复制、删除、粘贴操作。

2.2 编辑模式

正常的文本写入。

从命令模式进入编辑模式,只需你按一个键即可(i, I, a, A, o, O, r, R)。

当进入编辑模式时,会在屏幕的最下一行出现”INSERT”的字样。

从编辑模式回到命令模式只需要按键盘左上方的 ESC 键即可。

2.3 末行模式

保存或退出文档,以及设置编辑环境

在命令模式下,输入 “:” 或者 “/“ 即可进入末行模式。

在该模式下,可以进行的操作有,显示行号、搜索、替换、保存、退出。

VIM编辑器配置文件整体流程

  1. 默认打开文件处于命令模式
  2. 需要从命令模式切换至编辑模式
  3. 编辑模式修改配置文件, 然后返回命令行模式
  4. 最后通过命令模式进入末行模式,保存和退出操作

注意: 在vim中,无法直接从编辑模式切换到末行模式。

模式切换图

1
2
3
4
5
6
7
命令模式 (默认)
↓ (i, I, a, A, o, O, r, R)
编辑模式
↓ (ESC)
命令模式
↓ (:, /)
末行模式

3. VIM命令模式

命令行模式:(默认打开文件进入的是命令行模式)

3.1 命令光标跳转

命令 功能
G 跳转光标至末端
gg 跳转光标至顶端
Ngg 跳转光标至当前文件内的第N行(如:22gg跳转到第22行)
$ 将当前光标跳转至光标所在行的末端(尾部)
^ 将当前光标跳转至光标所在行的头部
0 数字0可实现类似效果(跳转到行首)

3.2 翻页操作

文件内容较多时使用:

命令 功能
Ctrl+f 往下翻页(行比较多)
Ctrl+b 往上翻页

3.3 复制操作

命令 功能
yy 复制当前光标所在的行
5yy 复制当前光标以及光标向下4行(共5行)

3.4 粘贴操作

命令 功能
p (小写) 粘贴至当前光标下一行
P (大写) 粘贴至当前光标上一行

3.5 删除操作

命令 功能
dd 删除当前光标所在的行
4dd 删除当前光标所在的行以及往下的3行(共4行)
dG 删除当前光标以后的所有行
D 删除当前光标及光标以后的内容
x 删除当前光标标记往后的字符
X 删除当前光标标记往前的字符

3.6 剪贴操作

先删除dd(或number dd),后粘贴p

3.7 撤销操作

命令 功能
u 撤销上一次的操作(类似windows下的ctrl+z)

3.8 替换操作

命令 功能
r 替换当前光标标记的单个字符
R 进入REPLACE模式, 连续替换,ESC结束

4. VIM编辑模式

编辑模式(从命令行模式进入到编辑模式)

命令 功能
i 进入编辑模式,光标不做任何操作
I 进入编辑模式,并且光标会跳转至本行的头部
a 进入编辑模式,将当前光标往后一位
A 进入编辑模式,将光标移动至本行的尾部
o 进入编辑模式,并在当前光标下添加一行空白内容
O 进入编辑模式,并在当前光标上添加一行空白内容

退出编辑模式: 按 ESC 键返回命令模式


5. VIM末行模式

末行模式主要用于搜索, 保存, 退出文件, 还可以让用户执行外部的Linux命令或跳转到所编写文档的特定行数

末行模式(必须退回到命令行模式)

5.1 保存和退出

命令 功能
:w 保存当前状态
:w! 强制保存当前状态
:q 退出当前文档(文档必须保存才能退出)
:q! 强制退出文档不会修改当前内容
:wq 先保存,在退出
:wq! 强制保存并退出
:x 先保存,在退出
ZZ 保存退出, shift+zz(命令模式下)

错误提示: E37: No write since last change (add ! to override)

5.2 跳转操作

命令 功能
:number 跳转至对应的行号(如::22跳转到第22行)

5.3 查找操作

命令 功能
/string 需要搜索的内容(查找)
n 按搜索到的内容依次往下进行查找
N 按搜索到的内容依次往上进行查找

5.4 替换操作

命令 功能
:1,5s#sbin#test#g 替换1-5行中包含sbin的内容为test
:%s#sbin#test#g 替换整个文本文件中包含sbin的替换为test
:%s#sbin#test#gc 替换内容时时提示是否需要替换

替换格式说明:

  • s#原内容#新内容#g - 使用#作为分隔符
  • s/原内容/新内容/g - 使用/作为分隔符
  • 1,5 - 指定行范围(1到5行)
  • % - 表示整个文件
  • g - 全局替换(每行所有匹配)
  • c - 确认替换

5.5 另存操作

命令 功能
:w /root/test 将文件所有内容另存为/root/test

5.6 读入操作

命令 功能
:r /etc/hosts 读入/etc/hosts文件至当前光标下面
:5r /etc/hosts 指定/etc/hosts文件当前文件的第5行下面

6. VIM视图模式

视图模式(从命令行模式进入视图模式)

6.1 可视块模式 (VISUAL BLOCK)

进入方式: Ctrl+v 进入VISUAL BLOCK 选中需要注释的行(可视块模式)

操作:

  1. 插入: 按Shift+i进入编辑模式,输入#,结束按ESC
  2. 删除: 选中内容后,按x或者d键删除
  3. 替换: 选中需要替换的内容, 按下r键,然后输入替换后的内容

6.2 可视行模式 (VISUAL LINE)

进入方式: Shift+v 进入VISUAL LINE 选中行内容(可视行模式)

操作:

  1. 复制: 选中行内容后按y键即可复制
  2. 删除: 选中行内容后按d键删除

7. VIM环境变量

7.1 环境变量临时生效

命令 功能
:set nu 显示行号
:set ic 忽略大小写, 在搜索的时候有用
:set ai 自动缩进
:set list 显示制表符(空行、tab键)
:set no[nu|ic|ai…] 取消临时设定的变量

7.2 环境变量永久生效

配置文件位置:

  • ~/.vimrc - 个人环境变量(优先级高)
  • /etc/vimrc - 全局环境变量

配置方法:

1
2
3
# vim ~/.vimrc   
set nu
set ic

优先级说明:

  • 如果个人vim环境没有配置, 则使用全局vim环境变量配置
  • 如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量

常用配置示例:

1
2
3
4
5
6
7
8
# ~/.vimrc
set nu " 显示行号
set ic " 忽略大小写
set ai " 自动缩进
set tabstop=4 " 设置tab键为4个空格
set shiftwidth=4 " 设置自动缩进为4个空格
set expandtab " 将tab键转换为空格
syntax on " 开启语法高亮

8. VIM扩展知识

8.1 同时编辑多个文件

1
2
3
4
5
6
7
8
# 水平分割
vim -o file1 file2

# 垂直分割
vim -O file1 file2

# 文件间切换
Ctrl+ww

8.2 文件差异对比

1
2
3
4
5
# 文件对比(用的不多)
diff file1 file2

# 以vim方式打开两个文件对比,标记不同的内容
vimdiff file1 file2

8.3 VIM非正常退出处理

如果VIM非正常退出(Ctrl+z)挂起或强制退出终端没关闭VIM后

问题: 会出现.filename.swp交换文件

解决方法: 删除同文件名的.swp文件即可解决

1
2
# 删除交换文件
rm -f .filename.swp

或者: 在vim中提示时选择删除交换文件


9. VIM练习

请把/etc/passwd复制到/root/目录下,并重命名为test.txt

练习步骤详解

步骤1: 准备文件

1
2
# 复制文件并重命名
cp /etc/passwd /root/test.txt

步骤2: 打开文件并设置行号

1
2
3
4
5
# 用vim打开test.txt
vim /root/test.txt

# 在末行模式下设置行号
:set nu

步骤3: 光标移动练习

1
2
3
4
5
# 分别向下、向右、向左、向上移动5个字符
# 向下: 5j
# 向右: 5l
# 向左: 5h
# 向上: 5k

步骤4: 翻页操作

1
2
3
# 分别向下、向上翻两页
# 向下翻两页: Ctrl+f (按两次)
# 向上翻两页: Ctrl+b (按两次)

步骤5: 跳转到指定行

1
2
3
4
# 把光标移动到第10行
:10
# 或
10gg

步骤6: 行首行末移动

1
2
3
4
5
# 让光标移动到行末,再移动到行首
$ # 移动到行末
^ # 移动到行首
# 或
0 # 移动到行首

步骤7: 文件首末行

1
2
3
4
5
# 移动到test.txt文件的最后一行
G

# 移动到文件的首行
gg

步骤8: 搜索操作

1
2
3
4
5
# 搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索
:set ic # 设置忽略大小写
/root # 搜索root
n # 下一个匹配
N # 上一个匹配

步骤9: 替换操作

1
2
3
4
5
6
7
8
# 把从第一行到第三行出现的root 替换成--alex--
:1,3s#root#--alex--#g

# 还原上一步操作
u

# 把整个文件中所有的root替换成--alex--
:%s#root#--alex--#g

步骤10: 删除操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 把光标移动到20行,删除本行
:20
dd

# 还原上一步操作
u

# 删除第19行
:19
dd

# 还原上一步操作
u

# 删除从5行到10行的所有内容
:5,10d

# 还原上一步操作
u

步骤11: 复制粘贴操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 复制2行并粘贴到11行下面
:2
2yy
:11
p

# 还原上一步操作(按两次u)
u
u

# 复制从11行到15行的内容并粘贴到8行上面
:11
5yy
:8
P

# 还原上一步操作(按两次u)
u
u

步骤12: 移动操作

1
2
3
4
5
6
7
8
9
# 把13行到18行的内容移动文件的尾部
:13,18
d
G
p

# 还原上一步操作(按两次u)
u
u

步骤13: 替换和插入

1
2
3
4
5
6
7
8
9
# 光标移动到首行,把/sbin/nologin改成/bin/bash
gg
:%s#/sbin/nologin#/bin/bash#g

# 在第一行下面插入新的一行,并输入"# Hello!"
:1
o
# Hello!
ESC

步骤14: 保存退出

1
2
3
4
5
6
# 保存文档并退出
:wq
# 或
:x
# 或
ZZ

完整练习命令序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# 1. 准备文件
cp /etc/passwd /root/test.txt

# 2. 打开文件
vim /root/test.txt

# 在vim中执行以下操作:

# 设置行号
:set nu

# 光标移动
5j 5l 5h 5k

# 翻页
Ctrl+f Ctrl+f # 向下翻两页
Ctrl+b Ctrl+b # 向上翻两页

# 跳转
:10
$ ^
G
gg

# 搜索
:set ic
/root
n n n # 数出现次数

# 替换
:1,3s#root#--alex--#g
u
:%s#root#--alex--#g

# 删除
:20
dd
u
:19
dd
u
:5,10d
u

# 复制粘贴
:2
2yy
:11
p
u u
:11
5yy
:8
P
u u

# 移动
:13,18
d
G
p
u u

# 替换和插入
gg
:%s#/sbin/nologin#/bin/bash#g
:1
o
# Hello!
ESC

# 保存退出
:wq

10. VIM命令速查表

10.1 模式切换

操作 命令
进入编辑模式 i, I, a, A, o, O
返回命令模式 ESC
进入末行模式 :, /

10.2 光标移动

操作 命令
行首 ^, 0
行末 $
文件首 gg
文件末 G
指定行 Ngg, :N
翻页 Ctrl+f, Ctrl+b

10.3 编辑操作

操作 命令
复制 yy, Nyy
粘贴 p, P
删除 dd, Ndd, x, X
撤销 u
替换 r, R

10.4 末行模式

操作 命令
保存 :w
退出 :q
保存退出 :wq, :x, ZZ
搜索 /string, n, N
替换 :s#old#new#g
跳转 :N