一:基本命令介紹:
1) 光標命令
k,j,h,l---上下左右光標移動命令,雖然你可以在Linux中使用鍵盤右邊的四個光標鍵,
但是記住這四個命令還有非常有用的,也就是右手在鍵盤上放置的位置部分
nG ----n為行數,該命令立即使光標跳到指定行。
Ctrl+G-----光標所在位置的行數和列數報告
w,b------使光標向前或向后跳過一個單詞
2) 編輯命令
i,a,r -------在光標的前,后,上方插入字符命令(i=insert,a=append,r=replace)
cw,dw------ 改變(置換)/刪除光標所在處的單詞的命令 (c=change,d=delete)
x,d$,dd -----刪除一個字符,光標所在處到行尾的所有字符,和整行的命令
3) 查找命令
/string, ?string-----從光標所在處向后/向前查找相應的字符串的命令
4)拷貝復制命令
yy,p -----拷貝一行到剪貼板/取出剪貼板中內容的命令
進入vi(在系統提示符下面輸入以下指令):
vi ??????? 進入vi而不讀入任何文件
二:常見問題及應用技巧
1) 在一個新文件中讀/etc/passwd中的內容,取出用戶名部分
vi file
:r /etc/passwd 在打開的文件file中光標所在處讀入/etc/passwd
:%s/:.*//g 刪除/etc/passwd中用戶名后面的從冒號開始直到行尾的所有部分
:3r /etc/passwd 這是在指定的行號后面讀入文件內容
另外一種方法刪掉文件中所有的空行及以#開始的注釋行
#cat squid.conf.default | grep -v '^$' | grep -v '^#'
2) 在打開一個文件編輯后才知道登錄的用戶對該文件沒有寫權,不能存盤
vi file
:w /tmp/1 既然沒法存盤,不想放棄所做的所有修改,先臨時存到/tmp/1
:20,59w /tmp/1 或者僅僅把第20到59行之間的內容存盤成文件/tmp/1
3) 用VI編輯一個文件,但需要刪除大段大段的內容
vi file
Ctrl+G 把光標移到需要刪除的行的處按ctrl+G顯示行號,再到結尾處再按Ctrl+G.
:23,1045d 假定兩次行號為23和1045,則把這幾間的內容全刪除
也可以在開始和結束兩行中用ma,mb命令標記后用:'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/ 僅替換文件中的第三到七行中的string1成string2
Note: s為substitute,%表示所有行,g表示global
5) 同時編輯兩個文件,在兩個文件中拷貝剪貼文本
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 filename 進入vi并讀入指定名稱的文件(新、舊文件均可)。
vi +n filename???? 進入vi并且由文件的第幾行開始。
vi +filename ???? 進入vi并且由文件的最后一行開始。
vi + /word filename ? 進入vi并且由文件的word這個字開始。
vi filename(s) ??? 進入vi并且將各指定文件列入名單內,第一個文件先讀入。
vedit???????? 進入vi并且在輸入方式時會在狀態行顯示“INSERT MODE"。
編輯數個文件(利用vi filename(s))進入vi后)
:args ????????顯示編輯名單中的各個文件名
:n??????????讀入編輯名單中的下一個文件
:rew?????????讀入編輯名單中的第一個文件
:e#????????? 讀入編輯名單內的前一個文件
:e file ???????讀入另一個文件進vi(此文件可不在編輯名單內),若原文件經修改還沒有存檔,則應先以: w 存檔。
:e! file???????強迫讀入另一個文件進入vi,原文件不作存檔動作。
存儲及退出vi
:w filename????? 存入指定文件,但未退出vi(若未指定文件名則為當前工作的文件名)。
:wq 或者 或者zz?? 存文件,并且退出vi.
:q??????????不作任何修改并退出vi。
:q!????????? 放棄任何修改并退出vi。
:!command?????? 暫時退出vi并執行shell指令,執行完畢后再回到vi。
:sh????????? 暫時退出vi到系統下,結束時按Ctrl + d則回到vi。
加數據指令
i?????????? 在關標位置開始插入字符,結束時候按ESC鍵。
I?????????? 在光標所在行的最前面開始加字,結束時按ESC鍵。
a?????????? 在光標位置后開始加字,結束時按ESC鍵。
A?????????? 在光標所在行的最后面開始加字,結束時按ESC鍵。
o?????????? 在光標下加一空白行并開始加字,結束時按ESC鍵。
O?????????? 在光標上加一空白行并開始加字,結束時按ESC鍵。
!command???????執行shell指令,并把結果加在光標所在行的下一行。
刪除指令
nx??????????刪除由光標位置起始的n個字符(含光標位置,按一個x表示刪除光標所在的字符)
nX ????????? 刪除由光標位置起始的n個字符(不含光標位置)。
ndw????????? 刪除光標位置其實的n個字符組(word)。
d0 ????????? 將行的開始到光標位置的字符全部刪除。
d$ 或D ??????? 將光標位置起始到行尾的字符全部刪除。
ndd ?????????將光標位置起始的n行(整行)刪除(dd表示刪除光標所在行)。
:start,endd????? 刪除文件的第start到end行。
關標移動
0 ??????????移到一行的開始
$ ??????????移到一行的最后
[?????????? 移到文件開始位置
]?????????? 移到文件結束位置
nh??????????往左移n位
nl或者spacebar ??? 往右移n位
nk??????????向上移n行
n+??????????向上移n行,光標在該行的起始
ni ????????? 向下移n行
n-??????????向下移n行,光標在該行的起始
H?????????? 移到屏幕的左上角
M?????????? 移到屏幕的中間行開頭
L?????????? 移到屏幕的最后一行
G?????????? 移到文件的最后一行
nG或者:n???????移到文件的第n行
nw??????????右移n個字組,標點符號屬于字組
nW????????? 右移n個字組,標點符號不屬于字組
nb??????????左移n個字組,標點符號屬于字組
nB????????? 左移n個字組,標點符號不屬于字組
Ctrl + u???????屏幕上卷半個菜單
Ctrl + d ?????? 屏幕下卷半個菜單
Ctrl + b ?????? 屏幕上卷一個菜單
Ctrl + F ?????? 屏幕下卷一個菜單
修改指令
r?????????? 修改光標文件的字符
R?????????? 從光標位置開始修改,結束時按ESC鍵
new????????? 更改n組字符,結束時按ESC鍵
nclearcase/" target="_blank" >cc????????? 從光標所在位置開始更改n行,結束時按ESC鍵
重排各行長度
i?????????? 并按Enter將該行由光標所在處斷開,并進入insert方式
J ??????????把下一行的數據連接到本行之后
尋找指令
/text???????? 從光標位置往下找字串text
?text???????? 從光標位置往上找字串text
n?????????? 繼續找下一個字串(在輸入上面的尋找指令之后使用)
尋找并且取代指令
:getxt1/s/ /text2/options ??將各行的text1替換為text2
option=g表示文件中所有的text1均被取代,若未輸入任何option,則只有各行中的第一個出現的text1被取代
????????????? option=go 在屏幕顯示各取代的行
??????????????option=gc 在每個字串取代之前要求確認?
Start,endgtext1/s/ / text2/options ?同上,只尋找并取代第start~end行。
或:Start,ends/text1/text2/options
復制及移動文件
:first,last co dest ?????將first 到last行的數據復制到目標行(dest)下面
:Start,end?m dest??????將start 到 end行的數據移動到目標行(dest)下。???
:r filename????????? 將指定文件的內容讀入光標所在行下。
nY ????????????? 將光標所在位置開始的n行數據暫存
p?????????????? 復制暫存數據在光標的下一行
P?????????????? 復制暫存數據在光標的上一行
其他命令
.?????????????? 重復前一指令
u?????????????? 取消前一指令
Ctrl + l???????????刷新屏幕顯示
:set number????????? 顯示文件的行號,但不會存文件
:set nonumber???????? 解除行號顯示
:set ai??????????? 設置每行起始位置(以光標當前位置為起始)
:set noai?????????? 取消行起始位置設定
:f 或<Ctrl> + g??????? 告訴用戶有關現行編輯文件的數據。