vi visual interface
vim vi improved
vim +12 inittab 開啟inittab檔案,游標就處於第12行
vim + inittab 開啟檔案,游標處於最後一行
vim +/pattern /etc/inittab 開啟檔案,定位至第一次被pattern匹配到的行的行首;
vim模式:
命令模式 ,預設進來的模式
輸入模式
尾行模式
命令模式-->輸入模式下:
i insert 在當前游標所在字元的前面,轉為輸入模式
a append 在當前游標所在字元的後面,轉為輸入模式
o 在當前游標所在行的下方,新建一行,並轉為輸入模式
I:在當前游標所在行的行首,轉為輸入模式
A:在當前游標所在行的行尾,轉為輸入模式
O:在當前游標所在行的上方,新建一行,並轉為輸入模式
輸入模式--》命令模式
ESC ...
--》末行模式, 先得切到命令模式下,然後 shift + :
:10d 刪除第10行
:10,20d 刪除第10行到第20行
:set nu 顯示行號
執行shell命令
: ! ls /etc
末行模式---》命令模式
ESC ...
關閉檔案:
在末行模式下關閉檔案
:q 直接退出
:wq 儲存並退出 :x
:q! 強制退出
:w 僅儲存
:w! 強制儲存
在命令模式下關閉檔案
ZZ 儲存退出
移動游標:在命令模式下
逐字元移動
上下左右方向鍵即可, 數字 + 方向鍵 = 移動多少個字元 hljk
以單詞為單位移動:
w :移至下一個單詞的詞首
e :跳至當前或下一個單詞的詞尾
b :跳至當前或前一個單詞的詞首
#w/e/b : 一次跳#個單詞
行內跳轉:
0鍵:跳到行首 絕對行首
^鍵:行首的第一個非空白字元
$鍵:絕對行尾
行間跳轉:
#G :跳轉至第#行
G :最後一行
在末行模式也可以實現跳轉:
直接給出行號,回車即可 :10
翻屏操作:
ctrl+f :向下翻一屏
ctrl+b :向上翻一屏
ctrl+d :向下翻半屏
ctrl+u :向上翻半屏
命令模式下的指令:
刪除單個字元
x 刪除游標所在處的單個字元
#x 刪除游標所在處及向後的共#個字元
刪除命令 d :
d命令跟跳轉命令組合使用
#d跳轉符 : 刪除跳轉符範圍的#個 #dw , #de , #db
dd:刪除當前游標所在行
#dd : 刪除包括當前游標所在行在內的#行
末行模式下:
startline,endlined
. 當前行
$ 最後一行
+# 向下的#行
$-2
貼上命令:p
p:小寫,如果刪除或複製為整行內容,則貼上至游標所在行的下方;
如果複製或刪除的內容為非整行,則貼上至游標所在字元的後面;
P:大寫,如果刪除或複製為整行內容,則貼上至游標所在行的上方;
如果複製或刪除的內容為非整行,則貼上至游標所在字元的前面;
複製命令 : y yank 用法同d
yy
3yy
:1,100y
y$
y0
先刪除內容,再轉換為輸入模式:c
c用法同d命令
cc
c$
替換: replace
r character
6 r character
R :替換模式 esc退出
撤銷編輯操作:
undo u
u:撤銷前一次的編輯操作
連續u命令可撤銷此前的n次編輯操作
#u :直接撤銷最近#次編輯操作
恢復撤銷:反撤銷
ctrl+r
重複前一次編輯操作
.
視覺化模式:
v : 按字元選取
V :按矩形塊選取
選取後,可做其它操作
查詢替換:編輯模式下即可
/pattern 從游標行向下查詢
?pattern 從游標行向上查詢
n/N
查詢並替換:類似sed
在末行模式下使用s命令
:addr1,addr2s@pattern@string@gi
:.,$-1s/he/HE/g
1,$ === % 表示全文
練習:將/etc/yum.repos.d/server.repo檔案中的ftp://instructor.example.com/pub替換為http://172.16.0.1/yum
%s/ftp:\/\/instructor\.example\.com\/pub/http:\/\/172.16.0.1\/yum/g
%s@ftp://instructor\.example\.com/pub@http://172.16.0.1/yum@g
檔案內容如下:
# repos on instructor for classroom use
# Main rhel5 server
[base]
name=Instructor Server Repository
baseurl=ftp://172.16.0.1/pub/Server
gpgcheck=0
# This one is needed for xen packages
[VT]
name=Instructor VT Repository
baseurl=ftp://172.16.0.1/pub/VT
gpgcheck=0
# This one is needed for clustering packages
[Cluster]
name=Instructor Cluster Repository
baseurl=ftp://172.16.0.1/pub/Cluster
gpgcheck=0
# This one is needed for cluster storage (GFS, iSCSI target, etc...) packages
[ClusterStorage]
name=Instructor ClusterStorage Repository
baseurl=ftp://172.16.0.1/pub/ClusterStorage
gpgcheck=0
使用vim編輯多個檔案:
vim可以跨檔案操作 如開啟一個檔案複製,關閉;開啟另一個檔案貼上是可以的;
vim file1 file2 ...
預設開啟是第一個檔案,
在末行模式下切換檔案:
:next 切換至下一個檔案
:prev 切換至上一個檔案
切換時,要注意編輯了檔案後,提示儲存;才能切換
:last 切換至最後一個檔案
:first 切換至第一個檔案
退出:
:qa 全部退出
分屏顯示一個檔案:
ctrl+w,s : 水平拆分
ctrl+w,v :垂直拆分
在視窗間切換游標:
ctrl+w, 上下左右箭頭切換
退出視窗:q , qa
分視窗顯示多個檔案:
vim -o rc.sysinit inittab 水平分隔
vim -O rc.sysinit inittab 垂直分隔
切換跟上面一樣
將當前檔案中的部分內容,另存為一個檔案:
末行模式下,使用w命令
:w
:addr1,addr2w /path/to/somewhere
將另外一個檔案的內容,填充在當前檔案中:
:r /path/to/somewhere
跟shell互動:
:! command
顯示行號:
:set number 簡寫 :set nu
:set nonu 取消顯示行號
想永久生效,需要修改配置檔案
忽略大小寫:
:set ignorecase :set ic
:set noignorecase :set noic
設定自動縮排:
:set autoindent :set ai
:set noai
查詢到文字高亮顯示:
:set hlsearch
:set nohlsearch
語法高亮:
:syntax on
:syntax off
vim的配置檔案:
全域性:/etc/vimrc
個人:~/.vimrc 沒有可以手動建立
.file.swp vim未正常儲存退出的檔案就會保留這個。再次開啟檔案,會提示出問題
vim -r file 恢復 再手動刪除.file.swp
指令碼練習:新增10個使用者user1~user10,密碼同使用者名稱;但要求只有使用者不存在的情況下才能新增;
#!/bin/bash
#
for i in {1..10}; do
if id user$i &> /dev/null; then
echo "user$i exists."
else
useradd user$i
echo user$i | passwd --stdin user$i &> /dev/null
echo "Add user user$i finished."
fi
done
---------------------------------------------------------
#!/bin/bash
#
for i in {1..10}; do
if id user$i &> /dev/null; then
userdel -r user$i
echo "Delete user$i finished."
else
echo "user$i not exists."
fi
done
擴充:接受一個引數;
add:新增使用者user1..user10
del: 刪除使用者user1..user10
其它;退出
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "Usage: adminuser.sh ARG"
exit 7
fi
if [ $1 == '--add' ]; then
for i in {1..10}; do
if id user$i &> /dev/null; then
echo "user$i exists."
else
useradd user$i
echo user$i | passwd --stdin user$i &> /dev/null
echo "Add user$i finished."
fi
done
elif [ $1 == '--del' ]; then
for i in {1..10}; do
if id user$i &> /dev/null; then
userdel -r user$i
echo "Delete user$i finished."
else
echo "No user$i."
fi
done
else
echo "Unknown ARG"
exit 8
fi
擴充:期望給什麼使用者就新增,刪除什麼使用者,如下
adminusers.sh --add user1,user2,hello,hi,user3
#!/bin/bash
#
if [ $# -lt 2 ]; then
echo "Usage: adminuser2.sh ARG1 ARG2."
exit 11
fi
if [ $1 == '--add' ]; then
for i in `echo $2 | sed 's/,/ /g'`; do
if id $i &> /dev/null; then
echo "$i exists."
else
useradd $i
echo $i | passwd --stdin $i &> /dev/null
echo "Add $i finished."
fi
done
elif [ $1 == '--del' ]; then
for i in `echo $2 | sed 's/,/ /g'`; do
if id $i &> /dev/null; then
userdel -r $i
echo "Delete $i finished."
else
echo "$i not exists."
fi
done
elif [ $1 == '--help' ]; then
echo "Usage: adminuser2.sh --add USER1,USER2,... | --del USER1,USER2,... | --help"
else
echo "Unknown options."
exit 12
fi
擴充套件:-v選項,顯示整個執行過程?
組合測試條件:
-a 與關係
-o 或關係
! 非關係
大於1,小於等於3?
if [ $# -gt 1 -a $# -le 3 ]
if [ $# -gt 1 ] && [ $# -le 3 ]
#!/bin/bash
#
if [ $1 == 'q' -o $1 == 'quit' -o $1 == 'Q' -o $1 == 'Quit' ]; then
echo "Quiting..."
exit 0
else
echo "Unknown Argument."
exit 1
fi
擴充套件:如果使用者給的不是這幾個字串,就新增使用者,否則退出?
[ ! \( $1 == 'q' -a $1 == 'quit' -a $1 == 'Q' -a $1 == 'Quit' \) ]
本作品採用《CC 協議》,轉載必須註明作者和本文連結