柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

vi/vim编辑器常用总结

vi/vim作为运维人员一点不陌生,我们一般编辑文件的时候就会用到这个命令了,因为经常要用到,这里总结记录一下方便以后查看。

一、vi的基本使用方法及相关命令

vim编辑器有三种模式:一般模式、编辑模式、命令行模式。

1.1 一般模式:

一般模式可以进行删除、复制和粘贴,但不能编辑文件。也就是我们vi 文件名称就进入了一般模式了。

一般模式按键说明:


(1). 屏幕翻滚类命令和移动光标命令:

h、j或者Ctrl+n、k或者Ctrl+p、l: 分别控制光标左、下、上、右移动一行.

[Ctrl]+[f]: 屏幕向下移动一页,相当于[PgDn]键

[Ctrl]+[b]: 屏幕向上移动一页,相当于[PgUp]键,不能使用小键盘上的PgUp

[Ctrl]+[u]: 屏幕向上移动半页

[Ctrl]+[d]: 屏幕向下移动半页

0或[Home]键:移到光标行的最前面字符处,但是不能使用小键盘的0。

^: 移动光标到本行第一个非空白的字符。

$或shift+[End]键: 移到光标行最后面的字符处

[Shift]+g或者G:移到文件的最后一行行首

gg或者1G: 移到这个文件的第一行行首

(或者{: 移动光标到本段落的头部

)或者}:移动光标到本段落的尾部

数字 [Enter]: 选择数字再按Enter键,相当于光标向下移动你输入的数字行。

n -号: 光标上移n行

n $: 光标从当前位置开始向下移动多少行,并至此行的行尾

n 空格键: n为数字,光标向右移动n个字符,不加数字按一下空格键,光标移动一格字符

n  [Backspace]: 光标左移动n个字符,不加数字光标只移动一格字符。

w:右移到下一个的字首,比较细致,小数点数字什么的都算上

W:右移到下一个的字首,如果同行中间有个空格,就移动到空格后面的字首,如果没有就移动到下一行的字首。

b/B: 跟上面的w/W正好相反是向左移动。

e或者E:跟上面的w/W正好更相反,是向右移动但是是到首尾而不是首部。

H: 光标移至屏幕的顶行行首

M:光标移至屏幕中间行

L: 光标移至屏幕最后行的行首


(2). 跳到指定行:

[Ctrl]+G:列出光标所在行的行号,在页面的底部能看到。

n G: n代表数字,移动到指定数字的行数的行首。

n l:n代表数字,小写的L,代表移动到算上光标一共向后移动几个字符。


博文来自:www.51niux.com

(3). 删除

x:每按一次,删除光标所在位置的字符,不能跨行,只能是本行

X:每按一次,删除光标前面的一个字符,不能跨行。

n x:n代表数字,表示连光标所在位置的字符都算上,向后一共删除几个字符。只限本行。

dd: 删除光标所在的行。

n dd:删除算上光标所在的行,向下一共删除几行。如: 3 dd 就是一共删除三行。

另外:就是d和其他的一些配合使用。db:向前删除。或者dnb。d0:删除光标到行首。d$:删除光标位置到行尾。

D:跟d$一样。从光标开始删除文本到本行结束。


(4). 复制

yw:将光标所在处到字尾复制到缓冲区中,就也是一个字符串的子尾(rhel7.0.0像这种到7就算字尾了,因为后面被.隔开了,还有空格啊,-等)。

p:将缓冲区的字符贴到光标所在的位置。(这里只针对上面yw)

yy:复制光标所在的行到缓冲区。

n yy:n代表数字,复制从光标开始算,向下一共n行的数据到缓冲区

p: 将yy复制那一行的内容放到光标所在位置的下一行。

P: 正好跟上面的p相反,将yy放到缓冲区里面那一行的内容,放到光标坐在位置的上一行。

另外p跟一些其他的组合就很多了,例如jp:向下移动一行在执行p。njp:向下移动n行再执行p。kp啊等等。


(5).替换

~: 大小写替换。将光标移动到指定的光标位置,按下[Shift]+[~],如果字符为小写就可以直接替换为大写。

n~: n代表数字。n是数字几,就表示从光标开始算上,往后几个字符都进行大小写替换。


(6).执行命令

. :重复执行上一个命令。当然nd,就是重复执行三次。如 3. 就是重复执行三次上一步的操作。

u:撤销上一步的操作。当然nu,例如 3u 就是撤销上三步的操作。  U会撤销所有对同一行的编辑动作。

J: 默认是将光标所在位置将下一行合并。nJ 就是将光标所在位置算上向下合并几行。如 3j 就是合并三行。


博文来自:www.51niux.com

1.2 编辑模式:

要从一般模式切换到编辑模式可以按下,按ESC切换回一般模式(编辑模式的操作都可以按u来撤销此次编辑操作,再按一次u撤销上一次操作,依次类推,在没有:wq保本文本之前。U的话只限于本次操作撤销/恢复):

i: 在光标前插入,光标是可以移动的,所以可以自由的移动光标然后按i,让你在光标前插入。

I: 在光标当前行的行首插入。

a: 在光标后面插入内容。

A: 在当前行尾插入内容。

o: 在当前行下面新开一行。

O: 在当前行上面新开一行。

r: 替换当前字符,光标停留的位置按下r再输入你想替换的字符,只能一个字符一个字符的替换。或者先按下一组数字,比如12,再按r,再按下你要替换的某个字母或数字或字符,算上光标开始包括后面一共12个字符都会被替换成某个你输入的字母、数字或者字符。

R: 从当前光标位置开始,按顺序替换下去,当然只限本行直至按ESC键停止,就是你可以不断的输入要替换的字母、数字或者字符按顺序替换下去。

c: 更改光标所在位置的文本。(cw:从光标到这个单词的结尾。cnb:从光标往前n个单词。c$:从光标到本行结尾。c0从光标到此行的开头)这些字段都会被删除掉,等待新的字段的编写。如c$或cc就是整行内容消失是一个空行。


1.3 命令模式:

在一般模式下输入 :或者/或者?,就可以将光标移动到最底下那一行。在这个模式中,可以提供查找、读取、存盘、替换字符、离开vi、显示行号等动作。


(1): 搜索及替换命令

:/pattern/;+n1p : n1为数字,显示光标所在位置向下搜索的第一个包含关键字/pattern/所在的行以及向下n1行,显示出来。如: :/<disk/;+5p 选出光标所在位置向下一个带有<disk的行,并显示出此行下面的五行

blob.png

:g/pattern/nu : 寻找并显示包含/pattern/所在的行以行号。如::g/<disk/nu ,如果没有设置:set nu 文件是不现实行号的

blob.png   :g!/<disk/nu  #!就是取反的意思,就是把没有<disk的行打印出来   

:n1,n2g/pattern/p : 寻找n1行到n2行之间包含/pattern/的行

blob.png

/字符串:从光标开始处,向文件尾部搜索字符串。(n为同一方向重复上一次的搜索命令,N为反方向。简单就是这里n是向下查找,N是向上查找。)

?字符串:从光标开始处,向文件首部搜索字符串。(n为同一方向重复上一次的搜索命令,N为反方向。简单就是这里n是向上查找,N是向下查找。)

:s/p1/p2/g :将当前行中所有p1替换成p2,例如:   :s/om/uo/g ,就是将光标当前行所有的om替换为ou

:n1,n2s/p1/p2/g : 将n1行到n2行中所有的p1替换成p2,如:   :18,49s/om/ka/g

:g/p1/s//p2/g :将文件中所有p1都替换为p2,如:     :g/om/s//ka/g

另外vi也支持正则表达式:如:  :g/[KV]/ 查找带有K或者V的行,或者:g/^d/ 开头为d开头的行

blob.png

blob.png


(2): 拷贝与移动内容

:n1,n2con3 : 将n1行到n2行的内容拷贝到n3的行下,如:  :1,3 co 3 就是将1到3行这三行数据,拷贝到第三行下面,成为456行。

:n1,n2mn3:将n1行到n2行的内容移动到n3的行下,如:  :1,3 m 4 就是将1到3行这三行数据,剪切移动到第四行下面,成为新的234行。

:n1,.mn2 :将n1行到当前行的内容移动到n2行下面

:n1,n2tn3 : 将n1到n2所有行的内容移动到n3行下,如: :1,3t4  就是将1到3行的三行内容复制到第四行下面,:%t$ 就是将所有行的内容复制到结尾。

:-,+t0   :将光标前面一行到下面一行之间的三行内容,复制到文件的首部。


(3): 删除行(.表示当前行,$表示最后行,1,表示第一行,%表示文件中的每一行)

:n1,n2 d : 将n1行到n2行的内容删除掉,如:  :1,3 d  这就是将1到3行删除掉

:.,n1d :删除当前行n1行之间的内容, :.,$d 就是删除当前行到结尾的内容,因为.表示当前行在这里。

:.,.+n1d : 删除当前行以及包括当前行在内一下n1行的内容,如: :.,.+20d  如果当前行是第四行,就是删除第四行到25行之间的内容.24行会被删掉,25行会留下。

:/pattern/d : 删除光标所在位置向下第一个包含pattern的行,如: :/os/d光标所在位置向下第一个包含os的行

:/pattern/+n1d: n1为数字。删除光标所在位置第一个包含/pattern/关键字所在行的下面第n1行。

:/pattern1/,/pattern2/d :从光标所在位置第一个包含/pattern1/到第一个包含/pattern2/所在的行都删除,如:  :/<disk/,/<alias/d


(4):插入(%表示所有行)

:n1,n2s/^/p1/  :再n1行到n2行,的行首位置插入p1,n2如果是$代表最后一行,如: :3,4s/^/smome thing/  在三四行的行首插入smome thing

:n1,n2s/$/p1/  :再n1行到n2行,的行尾位置插入p1,n2如果是$代表最后一行,如:  :3,4s/$/smome thing/  在三四行的行尾插入smome thing

:%s/^/p1/g      :在整个文件每一行的行首添加p1,如:  :%s/^/smoe/g  在每一行的行首添加smoe字段。

:%s/$/p1/g      :在整个文件每一行的行尾添加p1,如:  :%s/^/smoe/g  在每一行的行尾添加smoe字段。

 : r  !comman   :将执行的命令的结果输入到文件的光标所在位置的下一行,如::r !date   将时间的执行结果输入到当前的文件中,:r !sort  /opt/new.xml 将new.xml文件里面的内容排序后插入进来,:r !sort -r /opt/new.xml 可反序

blob.png


(5): 其他的命令方式 

:n1,n2#  :n1和n2都是数字,暂时显示某些行到某些行的编号,#用来显示暂时显示某一行

 : .=  : 列出光标放钱所在行的行号,在界面的左下角。

 :=    : 列出文件的总行数

 :/pattern/= :列出pattern第一次出现时的行号。如:   :/timer name/=  按回车在屏幕左下角就会显示timer name第一次出现在多少行

:w  : 保存当前文件

:e  filename  : 如果现在打开的文件没有进行修改的话,可以打开另外一个文件进行编辑,现在这个文件也就相当于未保存关闭了。

 : x :保存当前文件并退出

 :q   : 退出vi

 : q! :强制退出

 :wq!  :强制保存并退出

 :!command :执行shell命令的command,按q退出命令显示界面

 :!rcommand :将shell命令的执行结果放到当前行的下一行

另外合并ex命令,|可以分割命令,让你在同一个ex提示符号下合并多个命令:例如::1,3d|s/unit/haha/ 删除1-3行,现在第四行变为了第一行,光标也就停留在了原来的第四行现在的第一行,将unit替换为haha,当然这种替换此行出现的第一个unit,如果替换此行所有的unit,就应该是:s/unit/haha/g,对其他行的unit不影响。

n1,n2!sort :n1,n2行的内容执行unix的命令,如::1,8!sort  让文件的第一行到第八行执行排序操作

blob.png

:向上的按钮:可以向上翻看执行过的vi操作并停留在哪个命令按回车键,执行此命令。

(6). 保存一部分文件

:n1,n2w newfile   :将n1行到n2行之间的内容保存在一个新的文件。如: :1,9w /opt/new.xml 就是将第一行到第九行的内容保存到新的文件/opt/new.xml里面。当然如果这个文件存在了,会提示你此文件存在了是否强制覆盖,如果要覆盖的话:1,9w /opt/new.xml!  用叹号强制覆盖。

:n1,n2w >>newfile: 将n1行到n2行之间的内容追加到一个文件中,如:   :1,9w >>/opt/new.xml  

:r filename : 将指定文件里面的内容追加到光标所在的位置的下一行。

:n1r filename :  将指定文件里面的内容追加到我们所指定位置的下一行。如: :0r /opt/new.xml  如我们想将内容追加到文件首部,0的下一行正好是第一行哈。当然$r就是代表追加到文件结尾了。

:/pattern/r filename : 将指定文件的内容读入文件第一个出现pattern关键字的行下面。


博文来自:www.51niux.com

1.4 打开vi的选项

vi +n file: 在第n行打开file.

vi + file :在最后一行打开file

vi +/pattern file:在第一个出现pattern的地方打开file。如:# vi +/"address\ type" /opt/2.xml 从/opt/2.xml文件中第一个address  type位置打开,如果有特殊字符什么的最好用\转义一下。

vi -R file: 以只读形式打开文件,可以移动查看但是不能修改。

vi -r file:.2.xml.swp这种格式的文件都不陌生了,这可能是因为我们再vi文件的时候因为如程序临时被杀死了啊,突然宕机了啊或者是窗口突然关闭了啊等一些原因。系统为我们保存的一份缓存历史文件。此文件是记录了出问题那一刻文件的内容。如果要恢复到出问题的那一刻的状态呢。可以用这种形式恢复一下。下面是例子截图:

# vi -r /opt/2.xml  #用缓存区的文件恢复2.xml文本。当然也可以用# vi -r /opt/.2.xml.swp这种直接指定缓冲区文件的形式。

blob.png

进入到文本后,按:wq就是将缓冲区的文件保存下来替换掉现在的文件,按q就是退出不保存。.swp这种文件默认是不会被清理掉的,可以rm 手工删除掉。不然每次打开文件都会是否恢复的提示。


二、vim的功能


(1):vim常用环境设置参数(如果希望每次用vi都可以输出行号等一系列的设置,可以编辑vimrc文件没有则创建,将set nu类似的添加进去。"set nu 开头是双引号表示注释。# vi ~/.vimrc 。)

用vim 打开文件,进行下面的操作查看,因为有的如光亮显示就得用到vim,不然用vi看不到效果。

:set nu  :设置行号

:set nonu : 取消行号

:set hlsearch: 设置高亮度查找,默认就是显示的。如你用/ 关键字 查找的时候,关键字会是黄色的高亮显示。

:set nohlsearch : 取消高亮度查找,就是搜索出来的关键字不是高亮显示了。

:set all : 显示目前所有的环境参数值

:syntax on/off:默认是on进行语法检查,颜色显示状态,off为关闭依据相关语法显示不同的颜色并关闭语法检查。

:set bg=dark/light : 默认是light,显示不同的颜色色调。


(2). 块选择

v:字符选择,会将光标经过的地方反白选择,可以通过上下左右键来选择区域大小

V:块选择,可以通过上下键来选择行

y:复制反白的区域

d:删除反白的区域

p:粘贴经过y复制的选择的区域到光标指定的位置


(3). 纵向编辑模式

Ctrl+v : 就可以进入vim的纵向编辑模式。移动游标定位某一个位置,键入Ctrl+v后状态栏上出现VISUAL BLOCK字样,即进入纵向编辑模式。移动游标以按需选择待编辑的区域。

批量添加:

示例1(从当前行到结尾的句首批量插入某些统一的内容,如批量#注释):

Ctrl+v(进入到待编辑模式)==》将光标移动到要开始的位置==》输入大写的G==》输入大写的I进入行首插入模式==》输入#==》ESC退出

示例2(从指定的当前行到向下多行首部添加#注释):

将光标移动到要开始的位置 ==》Ctrl+v(进入 visual block模式)==》按j向下或者k向上选中多行==》输入大写的I进入行首插入模式==>输入#==》Esc退出。

示例3:多行注释#删除:

将光标移动到要开始的位置 ==》Ctrl+v(进入 visual block模式)==》按j向下或者k向上选中多行==》输入字母d==》esc退出。

示例4(从当前行到指定的结尾部分句首批量插入固定的内容,如:This is )

Ctrl+v(进入到待编辑模式)==》将光标移动到要开始的位置==》按向上或者向下键选择要插入的行==》输入大写的I进入行首插入模式==》输入This is==》ESC退出

blob.png


(4)多文件编辑

打开多个文件,在多个文件之间复制粘贴内容还是比较方便的。

# vim 1.xml  2.xml  new.xml   #多个文件之间用空格隔开,这里我们打开了三个文件

:n  : 跳转到下一个文件

:N :跳转回上一个文件

:files :列出目前vim打开的所有文件 

blob.png


(5)多窗口功能

承接上面继续做操作,:sp filename ,进入多窗口模式,现在我们:sp /opt/1.xml :sp /opt/2.xml  :sp /opt/mew.xmlblob.png  

从上图我们可以看出,因为默认就是在1.xml这个窗口上,所以:sp就不用再打开1.xml文件了,不然就重复了

Ctrl+w :可以进行窗口的切换,从上到下的切换

Ctrl+w+j: 跟上面是相反的效果

切换到哪个窗口就可以进行正常的vi操作了。

q! : 关闭

作者:忙碌的柴少 分类:linux文本编辑工具 浏览:1876 评论:0
留言列表
发表评论
来宾的头像