linux vi命令详解
linux vi命令详解
别名:
分类:Linux 教程 | 收藏:0 | 评论: | 更新:2023-06-27 16:54:21 | 人气:0
linux vi命令详解 vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本...

免费阅读 打赏作者

linux vi命令详解

linux vi命令详解

vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

1、vi的基本概念
  基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

    1) 命令行模式command mode)

  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

    2) 插入模式(Insert mode)

  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式(Comand mode)。

    3) 底行模式(last line mode)

  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。

 

不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

 

最后行方式命令
n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
n1,n2 d :将n1行到n2行之间的内容删除
w :保存当前文件
e filename:打开文件filename进行编辑
x:保存当前文件并退出
q:退出vi
q!:不保存文件并退出vi
!command:执行shell命令command
n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1n2,则表示将整个文件内容作为command的输入
r!command:将命令command的输出结果放到当前行

 

2、vi的基本操作 
a) 进入vi

    在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:

   $ vi myfile
不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 「插入模式(Insert mode)」再说吧!

 

b) 切换至插入模式(Insert mode)编辑文件

  在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

 

c) Insert 的切换

  您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

 

d) 退出vi及保存文件

  在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

: w filename (输入 「w filename」将文章以指定的文件名filename保存)

:  W写入文件 

: wq (输入「wq」,存盘并退出vi)

zz 保存并退出

:  x 保存(如果当前文件修改过)并退出

: q! (输入q!, 不存盘强制退出vi)

:  q退出vi


3
、命令行模式(command mode)功能键
1). 插入模式

  按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件

I :在当前行首插入文本   i :在光标前插入文本

按「a」(append)进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

A:在当前行尾添加文本   a:光标后添加文本

按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

O:在当前行之上新开一行 o:在当前行之下新开一行

R  以改写方式输入文本 

 

2). 从插入模式切换为命令行模式

      按「ESC」键。

 

进入vi的命令

vi filename :打开或新建文件,并将光标置于第一行首

vi +n filename :打开文件,并将光标置于第n行首

vi + filename :打开文件,并将光标置于最后一行首

vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处

vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename

vi filename....filename :打开多个文件,依次编辑

 

3). 移动光标

  vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」或「Ctrl+n」、「k」或「Ctrl+p」、「l」,分别控制光标左、下、上、右移一格。

  按「ctrl」+「b」:屏幕往"后"移动一页。

  按「ctrl」+「f」:屏幕往"前"移动一页。

  按「ctrl」+「u」:屏幕往"后"移动半页。

  按「ctrl」+「d」:屏幕往"前"移动半页。

  输入「:0」:移到文章的开头。

  按「G(必须大写)」:移动到文章的最后。

  按「$」:移动到光标所在行的"行尾"。

  按「^」:移动到光标所在行的"行首"

按「w」 右移一个词(特殊符号也算一个词)例:phpifo();为两个词phpifo();

按「W」 右移一个以空格分隔的词(不包含特殊符号他也算一个词)例:phpifo();为一个词

按「e」:光标跳到下个字的字尾(特殊符号也算一个词组合例:phpifo();为两个词phpifo();

按「E」:光标跳到下个字的字尾(中间以空格为分隔词)例:phpifo();为一个词

按「b」:左移一个词(特殊符号也算一个词)

按「B」: 左移一个以空格分隔的词

按「#l」(小写L):光标移到该行的第#个位置,如:5l,56l。

//替换文本

) :光标移至句尾

( :光标移至句首

}:光标移至段落开头

{:光标移至段落结尾

//

nG:光标移至第n行首

n+:光标下移n行

n-:光标上移n行

n$:光标移至第n行尾

    H :光标移至屏幕顶行

M :光标移至屏幕中间行

L :光标移至屏幕最后行

 

屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。(后要回车才会滚至屏幕顶部)

4). 删除文字

  「x」:每按一次,删除光标所在位置的"后面"一个字符。

  「#x」:例如,「6x」表示删除光标所在位置的"后面"6个字符。

  「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符。

  「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符。

  「dd」:删除光标所在行。

「#dd」:删除当前行及其后n-1行

「ndw」(delete word):删除光标处开始及其后的n-1个字(特殊符号也算一个独立词)例:phpifo();为两个词phpifo();

「ndW」(delete word):删除光标处开始及其后的n-1个字(特殊符号连接只算一个词)例:phpifo();为一个词

d0(零):删至行首

d$:删至行尾

[#s]:从当前光标位置处开始删除#个字符,以输入的文本替代指定数目的字符(如果无#就删除当前光标位置字符)

[#S]:删除#数目的行,并以所输入文本代替之(如果无#就删除当前行)

[#cw] :修改光标后的#个字(即删除后输入)

[#C] :修改光标后#行(包含当前行)(即删除后输入)

nCW:修改指定数目的字(测试无效)

nCC:修改指定数目的行(测试无效)

Ctrl+u:删除输入方式下所输入的文本(测试无效)

 

5). 复制

  「yw」:将光标所在之处到字尾的字符复制到缓冲区中。

「#yw」:复制#个字到缓冲区 例:phpifo();为两个词phpifo();

「#yW」:复制#个字到缓冲区 例:phpifo();为一个词

「ynw」:将后面的n个词移到缺省缓冲区中

「yy」:复制光标所在行到缓冲区。(将一行文本移到缺省缓冲区中

「yn」: 将当前行与下n行移到缺省缓冲区中

  「#yy」:将当前行与下n-1行移到缺省缓冲区中  例如,「6yy」表示拷贝从光标所在的该行"往下数"6-1行文字。

「p」(或者P):将缓冲区内的字符贴到光标所在位置。(行与单词)注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。

 

寄存器操作

"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数

"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字

"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字

ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

 

6). 替换

  「r」(replace):替换光标所在处的字符(单个字符替换)。

「R」:替换光标所到之处的字符,直到按下「ESC」键为止(多个字符替换)

搜索及替换命令 :

/pattern:从光标开始处向文件尾搜索pattern

?pattern:从光标开始处向文件首搜索pattern

n(键盘键):在同一方向重复上一次搜索命令

N(键盘键):在反方向上重复上一次搜索命令

:s/p1/p2/g:将当前行中所有p1均用p2替代

:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代

:g/p1/s//p2/g:将文件中所有p1均用p2替换

 

 

选项设置

all:列出所有选项设置情况

term:设置终端类型

ignorance:在搜索中忽略大小写

list:显示制表位(Ctrl+I)和行尾标志($)

number:显示行号

report:显示由面向行的命令修改过的数目

terse:显示简短的警告信息

warn:在转到别的文件时若没保存当前文件则显示NO write信息

nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符

nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始

mesg:允许vi显示其他用户用write写到自己终端上的信息

 

7). 恢复上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次恢复。

 Ctrl+r 恢复上一步被撤销的操作 

8). 更改

  「cw」(change word):更改光标所在处的字到字尾处

  「c#w」:例如,「c3w」表示更改3个字

 

9). 跳至指定的行

「ctrl」+「g或G(效果一样)」列出光标所在行的行号和列数。

  「#G」:例如,「15G」,表示移动光标至文章的第15行行首。(必须大写G)

4、Last line mode下命令简介
在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

最后行方式命令

:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下

:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下

:n1,n2 d :将n1行到n2行之间的内容删除

w保存当前文件

e filename:打开文件filename进行编辑

x保存当前文件并退出

q退出vi

q!不保存文件并退出vi

:!command:执行shell命令command

:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入

r!command:将命令command的输出结果放到当前行 。

A) 列出行号

 「:set nu」:输入「:set nu」后,会在文件中的每一行前面列出行号。

B) 跳到文件中的某一行

 「:#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

C) 查找字符

 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。

 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

D) 保存文件

 「:w」:在冒号后输入字母「w」就可以将文件保存起来。

E) 离开vi

 「:q」:按「:q」就是退出,如果无法离开vi,可以在「:q」后跟一个「!」强制离开vi。

 「:qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

5、vi命令列表

1、下表列出命令模式下的一些键的功能:

h
左移光标一个字符

l
右移光标一个字符

k
光标上移一行

j
光标下移一行

^
光标移动至行首

:0
数字":0",光标移至文章的开头

G
光标移至文章的最后

$
光标移动至行尾

Ctrl+f
向前翻屏

Ctrl+b
向后翻屏

Ctrl+d
向前翻半屏

Ctrl+u
向后翻半屏

i
在光标位置前插入字符

a
在光标所在位置的后一个字符开始增加

o
插入新的一行,从行首开始输入

ESC
从输入状态退至命令状态

x
删除光标后面的字符

#x
删除光标后的#个字符

X
(
大写X),删除光标前面的字符

#X
删除光标前面的#个字符

dd
删除光标所在的行

#dd
删除从光标所在行数的#行

yw
复制光标所在位置的一个字

#yw
复制光标所在位置的#个字

yy
复制光标所在位置的一行

#yy
复制从光标所在行数的#行

p
粘贴

u
取消操作

cw
更改光标所在位置的一个字

#cw
更改光标所在位置的#个字


2
、下表列出行命令模式下的一些指令
w filename
储存正在编辑的文件为filename

wq filename
储存正在编辑的文件为filename,并退出vi

q!
放弃所有修改,退出vi

set nu
显示行号

/或?
查找,在/后输入要查找的内容

n
与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

二、常见问题及应用技巧

---- 1.在一个新文件中读/etc/passwd中的内容,取出用户名部分。
---- vi file
---- :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd
---- :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。
---- 您也可以在指定的行号后读入文件内容,例如使用命令“:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内容。
---- 我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。
---- #cat squid.conf.default | grep -v ^$ | grep -v ^#

---- 2.在打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,需要将所做修改存入临时文件。
---- vi file
---- :w /tmp/1 保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件,例如仅仅把第2059行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。
---- vi file
---- :20,59w /tmp/1

---- 3.用VI编辑一个文件,但需要删除大段的内容。
---- 首先利用编辑命令“vi file”打开文件,然后将光标移到需要删除的行处按Ctrl+G显示行号,再到结尾处再按Ctrl+G,显示文件结尾的行号。
---- :23,1045d 假定2次得到的行号为231045,则把这期间的内容全删除,也可以在要删除的开始行和结束行中用mamb命令标记,然后利用“:a,bd”命令删除。

---- 4.在整个文件的各行或某几行的行首或行尾加一些字符串。
---- vi file
---- :3,$s/^/some string / 在文件的第一行至最后一行的行首插入“some string”
---- :%s/$/some string/g 在整个文件每一行的行尾添加“some string”
---- :%s/string1/string2/g 在整个文件中替换“string1”“string2”
---- :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”“string2”
---- 注意: 其中ssubstitute%表示所有行,g表示global

---- 5.同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。
---- vi file1 file2
---- yy 在文件1的光标处拷贝所在行
---- :n 切换到文件2 (n=next)
---- p 在文件2的光标所在处粘贴所拷贝的行
---- :n 切换回文件1

---- 6.替换文件中的路径。
---- 使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin换成/bin。也可以使用命令“:%s//usr/bin//bin/g”实现,其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。

对于第一次用vi,有几点注意要提醒一下:

1、 用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。
3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)