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的行,并显示出此行下面的五行
:g/pattern/nu : 寻找并显示包含/pattern/所在的行以行号。如::g/<disk/nu ,如果没有设置:set nu 文件是不现实行号的
:g!/<disk/nu #!就是取反的意思,就是把没有<disk的行打印出来
:n1,n2g/pattern/p : 寻找n1行到n2行之间包含/pattern/的行
/字符串:从光标开始处,向文件尾部搜索字符串。(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开头的行
(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 可反序
(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 让文件的第一行到第八行执行排序操作
:向上的按钮:可以向上翻看执行过的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这种直接指定缓冲区文件的形式。
进入到文本后,按: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退出
(4)多文件编辑
打开多个文件,在多个文件之间复制粘贴内容还是比较方便的。
# vim 1.xml 2.xml new.xml #多个文件之间用空格隔开,这里我们打开了三个文件
:n : 跳转到下一个文件
:N :跳转回上一个文件
:files :列出目前vim打开的所有文件
(5)多窗口功能
承接上面继续做操作,:sp filename ,进入多窗口模式,现在我们:sp /opt/1.xml :sp /opt/2.xml :sp /opt/mew.xml
从上图我们可以看出,因为默认就是在1.xml这个窗口上,所以:sp就不用再打开1.xml文件了,不然就重复了
Ctrl+w :可以进行窗口的切换,从上到下的切换
Ctrl+w+j: 跟上面是相反的效果
切换到哪个窗口就可以进行正常的vi操作了。
q! : 关闭