每个系统管理员至少要学会一种命令行界面的文字处理软件,以便进行日常系统管理工作。因为无论如何,要管理好Linux系统,仍然需要纯文本[注1]的手工设置。Linux的文字处理软件非常多,但是建议使用vi这个正规的文字处理软件。这是因为vi几乎在任何一个类Unix的机器中都存在,学会它会轻松很多。GNU计划中推出了vim(vi improved)这个vi的高级版本,可用功能就更多了。vi是进行shell脚本编程与服务器设置非常重要的工具,所以一定得掌握。
如果用户在启动vim时没有指定文件名,vim会给出简要的帮助信息。如果想要获得更详细的帮助只需要键入命令:help.如果要退出键入命令:q.用~表示的空行并不是文件中的空白行。文件中的空白行依然是文件中的一部分内容,二用~表示的空行并不在文件中。vim +n filename表示打开后光标位于第n行,默认是第1行,而vim + filename则打开后光标位于最后一行。
1、vi模式
通常,vi分为3种模式,分别是“命令模式”、“插入模式”和“末行模式”。这三种模式的作用如下:
命令模式:vi处理文件时,一进入该文件,就是命令模式了。在这个模式下,可以使用“上下左右”键来移动光标,可以使用“删除字符”或者“删除整行”来处理文件内容,也可以使用“复制、粘贴”来处理文件数据。此模式下输入的字符一般都不会显示出来。
插入模式:在一般模式中可以进行删除、复制、粘贴等操作,却无法进行编辑操作。要等到按下“i、I、o、O、a、A、R”等字母之后才会进入编辑模式。注意,通常在Linux中按下上述字母时,画面的左下方会出现“INSERT”或“REPLACE”的字样,这时可输入任何字符到文件中。如果要退出编辑模式则必须按下Esc键方可。
末行模式:在命令模式中,输入“:”就可以将光标移到最下面的那一行,在该模式下您可以搜索数据,而且读取、存盘、离开vi、显示行号等操作都是在该模式下进行的。一行命令执行完后,就自动回到了命令模式。在末行模式下按下Esc可回到命令模式。
2、命令行内容说明
移动光标的方法
h或向左方向键 光标向左移动一个字符
j或向下方向键 光标向下移动一个字符
k或向上方向键 光标向上移动一个字符
l或向右方向键 光标向右移动一个字符
[Ctrl]+[f] 屏幕“向下”移动一页,相当于[Page Down]按键(常用)
[Ctrl]+[b] 屏幕“向上”移动一页,相当于[Page Up]按键(常用)
n<space> n表示数字,例如20.按下数字后再按空格键,光标会向右移动这一行的n个字符。例如20<space>则光标会向后面移动20个字符距离
0 这是数字0,移动到这一行的最前面字符处(常用)
$ 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行
M 光标移动到这个屏幕的中央那一行
L 光标移动到这个屏幕的最下方那一行
G 移动到这个文件的最后一行(常用)
nG n为数字,移动到这个文件的第n行。例如200G则会移动到这个文件的第200行(可配合:set nu)
gg 移动到这个文件的第一行,相当于1G(常用)
n<Enter> n为数字,光标向下移动n行(常用)
搜索与替换
/word 从光标位置开始,向下寻找一个名为word的字符串。 例如要在文件内搜索vbird这个字符串,就输入/vbird即可(常用)
?word 从光标位置开始,向上寻找一个名为word的字符串
:n1,n2s/word1/word2/g n1与n2为数字。在第n1与n2行之间寻找word1字符串,并将字符串替换为word2。(常用)
:1,$s/word1/word2/g 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2(常用)
:1,$s/word1/word2/gc 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2,且在替换前显示提示符给用户确认是否需要替换(常用)
22,100 第[22,100]行之间
5,. 第5行开始至当前行
5,$ 第5行开始至最后行
% 整个缓冲区
.,.+20 从当前行开始往后的连续20行
.,.-10 从当前行开始往前的连续10行
~ 将当前字符大小写
3~ 将当前光标向后的3个字符大小写
删除、复制与粘贴
x,X x为删除当前光标所在字符(相当于Del键),X为删除光标前一个字符(相当于Backspace键)(常用)
nx n为数字,连续向后删除n个字符。举例来说,要连续删除10个字符,则输入“10x”
dd 删除光标所在的那一整行(常用)
ndd 删除从光标开始的n行,例如20dd则是删除20行(常用)
d1G 删除光标所在位置到第一行的所有数据
:3,7d 删除第3到第7行
dG 删除光标所在位置到最后一行的所有数据
d$ 删除光标所在位置到该行的最后一个字符
d0 d的后面是数字,删除光标所在处,到该行的最前面一个字符
yy 复制光标所在的那一行(常用)
nyy 复制光标所在的向下n行,例如20yy则是复制20行(常用)
y1G 复制光标所在行到最后一行的所有数据
yG 复制光标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到改行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p,P p为将已复制的数据粘贴到光标的下一行,P则为贴在光标上一行。
J 将光标所在行与下一行的数据结合成同一行
u 复原前一个操作(常用)
. 这就是小数点。意思是重复前一个动作,如果想重复删除、重复粘贴,按下小数点就可以(常用)
进入编辑模式
i、I i为“从当前光标所在处插入”,I为“在当前所在行的第一个非空格符处开始插入”(常用)
a、A a为“从当前光标所在的下一个字符处开始插入”,A为“从光标所在行的最后一个字符处开始插入”(常用)
o、O o为“在当前光标所在的下一行插入新的一行”,O为“在当前光标所在处的上一行插入新的一行”(常用)
末行模式
:w 将编辑的数据写入硬盘文件中(常用)
:q 离开vi(常用)
:x 关闭,保存修改
:q! 若曾修改过文件,又不想存储,使用!为强制离开不存储文件
:wq 存储后离开,若为:wq!则为强制存储后离开(常用)
ZZ 若文件没有更改,则不存储离开,若文件已经修改,则存储后离开
:w [filename] 将编辑的数据存储为另一个文件(类似另存新文件)
:!command 暂时离开vi到命令行模式下执行command的显示结果。
:set nu 显示行号,设置之后,会在第一行的前缀显示该行的行号
:set nonu 与set nu相反,为取消行号
如果想要进行多次移动的话,例如向下移动30行,您可以使用“30j”或“30↓”的组合键,即加上想要进行的次数(数字)后,进行操作即可。在vi中,“数字”是很有意义的,数字通常表示重复做几次的意思。也有可能表示要去哪里的意思。举例来说,要删除50行,则是用50dd。数字加在动作之前。
vi具有“可恢复”的功能,它主要凭借临时文件来做。举例来说,当我们编辑一个文件时,假设名称为/tmp/passwd,那么在这个/tmp中就会有一个临时文件,文件名为"/tmp/.passwd.swp",这是一个隐藏文件,我们所进行的一些修改,都会暂时存在该文件中。如果在修改过程中,系统死机,那么下次再重新vi /tmp/passwd时,系统就会告诉你,是否要恢复成修改过程中的模样?如果按下R,就可以将数据恢复到修改过程中的样子,而不是源文件。如果不删除那个临时文件,每次编辑该文件的时候都会告诉你该文件有问题。
窗口操作
在末行模式下,通过命令vsplit可以实现窗口的垂直拆分。例如在末行模式下使用命令vsplit将当前打开的文档test.c进行垂直拆分,可以:vsplit filename, 要在两个窗口之间切换,可以执行Ctrl+W。
在末行模式下,通过命令split可以实现窗口的水平拆分。关闭所有窗口用:qall,保存所有内容用:wall。关闭当前窗口之外的窗口,用:only。在vim中执行shell,可以:! command.按回车键后将返回vim中,如果想要将执行结果返回插入到当前编辑的文件中,在末行模式下的语法格式如下:. ! command。
3、vim附加功能
当前大部分的版本都已采用vim替代vi的功能了。为什么要使用 vim呢?因为vim具有颜色显示功能,并且支持许多程序语法,因此当使用vim编辑程序时(不论是c语言还是shell脚本),vim可以帮助您直接进行“程序调试”。
块选择
要使用块选择(Visual Block)的功能,可按下v键或者V键或者[Ctrl]+v键时,光标移动过的地方就会开始反白。
v 字符选择,会将光标经过的地方反白选择
V 行选择,会将光标经过的行反白选择
y 复制反白的地方
d 将反白的地方删除掉
vim环境设置
vim的环境设置参数参数有很多,如果想知道当前设置值,可以在命令行模式时输入:“:set all”来查看,不过,设置项目实在太多了。所以以下尽列出一些平时常用的简单设置值。
:set hlsearch 设置是否将搜索的字符串反白,如果不想反白,就用:set nohlsearch
:set nu 设置行号。取消的话就是:set nnu
:set autoindent 是否自动缩排。不想自动缩排就用:set noautoindent
:set showmode 是否在左下角显示状态行说明
:set all 显示当前所有的环境参数设置值
:set syntax (on|off) 是否根据程序相关语法设置不同的颜色
总之,这些设置值很有用。但是是否每次都使用vim都要重新设置一次各个参数值呢?没有必要,我们可以通过社会自文件来直接规定习惯的vim操作环境。vim设置值一般是放在/etc/vimc文件中,不过,建议不要修改它。可以修改~/.vimc文件(默认不存在,请自行手动建立),写入所需要的设置值。举例来说:
[root@linux ~]# vi ~/.vimc
:set nu
:set autoindent
:set showmode
:syntax on
DOS和Linux的换行符
在DOS使用的换行符为^M$, 我们称为CR与LF两个符号。而在Linux中,则仅有LF($)这个换行符。这个换行符对于Linux的影响很大。在执行Linux命令时,它的判断依据是“Enter”,而Linux的Enter为LF符号。不过,由于DOS的换行符是CRLF,多了一个^M的符号,在这样的情况下,如果是一个shell脚本的程序,将可能造成“程序无法执行”的状态,因为它会误判程序的命令内容。
怎么办?很简单,将格式转换为Linux即可。要以vi进入该文件,然后一个个地删除CR吗?当然不是。我们可以通过简单的命令dos2unix。因为换行符以及DOS与Linux操作系统一些字符的定义不同,因此建议不要再Windows系统中将文件编辑好后,才上传到Linux系统,这样容易发生错误。并且如果在不同的系统之间复制一些纯文本文件时,千万要使用unix2dos或dos2unix来转换格式。也可以打开后(: set ff=unix)
注1:“不论使用什么编辑器”来打开该文件,都可以看到内容,而不是呈现乱码的文件,就是纯文本文件。由于纯文本文件在任何操作系统中都可以被使用,所以是相当方便的一种设置格式。