N26 第六周作業(yè)
總結(jié)vim編輯器的使用
Vim 模式
Vim 有六種基本模式
Normal mode
Visual mode "-- VISUAL --"
Select mode "-- SELECT --"
Insert mode "-- INSERT --"
Command-line mode
Ex mode
另外還有六種附加模式
Operator-pending mode
Replace mode "-- REPLACE --"
Virtual Replace mode "-- VREPLACE --"
Insert Normal mode "-- (insert) --"
Insert Visual mode "-- (insert) VISUAL --"Insert Select mode "-- (insert) SELECT --"
模式切換
如果不清楚正處于哪種模式,可以按兩次 Esc 鍵回到 Normal 模式,這有一個(gè)例外,從 Ex 模式輸入“:vi”才能返回到 Normal模式。
模式之間切換可以參考下圖:(^V 代表組合鋟 Ctrl - V)
*1 Go from Normal mode to Insert mode by giving the command "i", "I", "a",
"A", "o", "O", "c", "C", "s" or S".
*2 Go from Visual mode to Normal mode by giving a non-movement command, which
causes the command to be executed, or by hitting <Esc> "v", "V" or "CTRL-V"
(see v_v), which just stops Visual mode without side effects.
*3 Go from Command-line mode to Normal mode by:
- Hitting <CR> or <NL>, which causes the entered command to be executed.
- Deleting the complete line (e.g., with CTRL-U) and giving a final <BS>.
- Hitting CTRL-C or <Esc>, which quits the command-line without executing
the command.
In the last case <Esc> may be the character defined with the 'wildchar'
option, in which case it will start command-line completion. You can
ignore that and type <Esc> again. {Vi: when hitting <Esc> the command-line
is executed. This is unexpected for most people; therefore it was changed
in Vim. But when the <Esc> is part of a mapping, the command-line is
executed. If you want the Vi behaviour also when typing <Esc>, use ":cmap
^V<Esc> ^V^M"}
*4 Go from Normal to Select mode by:
- use the mouse to select text while 'selectmode' contains "mouse"
- use a non-printable command to move the cursor while keeping the Shift
key pressed, and the 'selectmode' option contains "key"
- use "v", "V" or "CTRL-V" while 'selectmode' contains "cmd"
- use "gh", "gH" or "g CTRL-H" g_CTRL-H
*5 Go from Select mode to Normal mode by using a non-printable command to move
the cursor, without keeping the Shift key pressed.
*6 Go from Select mode to Insert mode by typing a printable character. The
selection is deleted and the character is inserted.
使用Vim打開(kāi)文件
vim [options] [file ..] vim functions vim +2 functions +2 表示打開(kāi)文件后光標(biāo)位于第2行的開(kāi)頭 vim + functions 如果省略"+"號(hào)后面的數(shù)字,則表示打開(kāi)文件后,光標(biāo)位于文件最后一行的開(kāi)頭 vim +/if functions 打開(kāi)文件后,光標(biāo)位于第1次匹配模式(if)的位置
保存文件
:w 保存修改
ZZ:保存并退出
: x 保存并退出
:wq 保存并退出;
:w file_name 保存結(jié)果到file_name文件中,而vim中的文件仍舊是先前打開(kāi)在文件
關(guān)閉文件
:q! 強(qiáng)制退出,不保存修改結(jié)果
:q 如果文件自從上次保存后未曾修改,直接退出,否則提示錯(cuò)誤
光標(biāo)移動(dòng)
:help motion.txt 可查看完整的相關(guān)光標(biāo)移動(dòng)的幫助
:help usr_03.txt 可查看較重要的相關(guān)光標(biāo)移動(dòng)的幫助
字符跳轉(zhuǎn)
(1)可以使用鍵盤(pán)的上下左右箭頭
(2)可以使用鍵盤(pán)的hjkl鍵:
h 向左
l 向右(小寫(xiě)L)
j 向下
k 向上
(3)使用數(shù)字與命令組合實(shí)現(xiàn)按指定字符移動(dòng)光標(biāo),例如:
3k 表示向上移動(dòng)3行
4<-(4加左箭頭)表示向左移動(dòng)4個(gè)字符
單詞跳轉(zhuǎn)
w 光標(biāo)移到下一個(gè)單詞的首字母
e 光標(biāo)移到當(dāng)前或下一個(gè)單詞的尾字母
b 光標(biāo)移到當(dāng)前或前一個(gè)單詞的首字母#(w|e|b) 數(shù)字與指定命令之一組合,每次跳轉(zhuǎn)指定數(shù)目在單詞
行首行尾跳轉(zhuǎn)
^ 轉(zhuǎn)到行首第一個(gè)非空白字符
0 轉(zhuǎn)到行首第一個(gè)字符
$ 轉(zhuǎn)到行尾第一個(gè)字符
段間跳轉(zhuǎn)} 轉(zhuǎn)到下一段(光標(biāo)定位在空白行)
{ 轉(zhuǎn)到下一段(光標(biāo)定位在空白行)
句間跳轉(zhuǎn)
( 轉(zhuǎn)到前一句
) 轉(zhuǎn)到后一句
翻屏
Ctrl+f 向下一屏 Forwards (downwards)
Ctrl+b 向上一屏 Backwards (upwards)Ctrl+d 向下半屏 Downwards
Ctrl+u 向上半屏 UpwardsEnter:按行向后翻
vim的編輯命令:
字符編輯:
x 刪除光標(biāo)位置字符
#x 刪除從光標(biāo)開(kāi)始指定個(gè)數(shù)字符xp 可實(shí)現(xiàn)光標(biāo)位置字符與其后字符對(duì)調(diào)位置
rCHAR 將光標(biāo)位置字符替換為CHAR所指定的字符,注意是小寫(xiě)的r,大寫(xiě)R直接進(jìn)入替換模式了
刪除(d)
dd 刪除光標(biāo)所在行
d$ 刪除光標(biāo)開(kāi)始至行尾字符
d^ 刪除光標(biāo)前一個(gè)字符至行首第一個(gè)非空白字符
dw 刪除光標(biāo)開(kāi)始至下一個(gè)單詞首字母之間的字符
de 刪除光標(biāo)位置至下一個(gè)詞尾之間的字符
db 刪除漁村位置前一個(gè)字符至前一個(gè)詞首之間的字符#d(w|b|e|$|^|d) 刪除指定數(shù)量的字符、單詞、行
復(fù)制(y)
工作方式類(lèi)似 d 命令
粘貼
p(小寫(xiě))在光標(biāo)位置后面或當(dāng)前行后粘貼
#p 在光標(biāo)位置后或當(dāng)前行后粘貼指定次數(shù)
P(大寫(xiě))在光標(biāo)位置前面或當(dāng)前行之前粘貼
#P 在光標(biāo)位置前面或當(dāng)前行前面粘貼指定次數(shù)
刪除(c)
工作方式類(lèi)似d,所不同在是刪除后直接轉(zhuǎn)為Insert模式
撤銷(xiāo)(u)
#u 撤銷(xiāo)n步
反撤銷(xiāo)(Ctrl+r)
#ctrl+r反撤銷(xiāo)n步重復(fù)執(zhí)行前一個(gè)編輯操作:
[#].按行選定(V)
按字符選定(v)
按塊選定(Ctrl+V)
以上3種可視化選定方法結(jié)合上下左右來(lái)選擇,然后結(jié)合d、c、y、x等命令使用vim自帶的練習(xí)教程:vimtutor
命令行模式
命令范圍
# 特定行
. 當(dāng)前行
$ 最后一行
% 所有行,相當(dāng)于1,$
#,# 某行到某行
/pattern/ 由pattern匹配的下一行
#,+#:指定行范圍,如3,+2 為第3行加2行,總共3行結(jié)合編輯命令,實(shí)現(xiàn)編輯操作
d
y
c
r fild_name 將指定文件內(nèi)容插入命令范圍之后
w file_name 將選定范圍寫(xiě)入某文件
查找
/pattern 按模式匹配自上向下查找
?pattern 按模式匹配自下向上查找
n 在查找結(jié)果中按查找方向依次導(dǎo)航
N 在查找結(jié)果中按查找方向相反的方向依次導(dǎo)航
查找與替換
:[range]s/{pattern}/{string}/[flags]
range為命令范圍
pattern為要查找內(nèi)容的匹配模式
string為需要替換的內(nèi)容,可以后向引用
flags為修飾符
i,忽略大小寫(xiě)
g,行內(nèi)全局匹配可把分隔符替換為其它非常用字符:
s@@@
s###
同時(shí)打開(kāi)多個(gè)文件
vim FILE1 FILE2 ...
在文件間切換:
:next 下一個(gè)
:prev 上一個(gè)
:first 第一個(gè)
:last 最后一個(gè)退出所有文件:
:wqall 保存所有文件并退出;
:wall
:qall打開(kāi)多個(gè)文件時(shí)可以使用選項(xiàng)拆分窗口
vim -o abc bcd 拆分成上下兩個(gè)窗口
vim -O abc bcd 拆分成左右兩個(gè)窗口窗口切換可以使用 Ctrl+w, Arrow
單個(gè)文件拆分窗口
Ctrl+w, s:拆分成上下兩個(gè)窗口
Ctrl+w, v:拆分成左右兩個(gè)窗口
Vim 工作特性
配置文件
/etc/vimrc System wide Vim initializations.
~/.vimrc Your personal Vim initializations.:help option-list
查看特性值 :se[t] {option}?
行號(hào)
打開(kāi)::set number
關(guān)閉::set nonumber
自動(dòng)縮進(jìn)
打開(kāi)::set autoindent
關(guān)閉::set noautoindent
高亮搜索
打開(kāi)::set hlsearch
關(guān)閉::set nohlsearch
語(yǔ)法高亮
打開(kāi)::syntax on
關(guān)閉::syntax off
搜索pattern忽略大小寫(xiě)
打開(kāi)::set ignorecase
關(guān)閉::set noignorecase
獲取幫助:
:help
:help subject
1、復(fù)制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個(gè)空白字符開(kāi)頭的行的行首加#
root@localhost ~]# cp /etc/rc.d/rc.local /tmp/ [root@localhost ~]# vim /tmp/rc.sysinit :%s/^[[:space:]]\+[^[:space:]]/#&/
2、復(fù)制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符;
[root@localhost ~]# cp /boot/grub/grub.conf /tmp [root@localhost ~]# vim /tmp/grub.conf :%s/^[[:space:]]\+//g
3、刪除/tmp/rc.sysinit文件中的以#開(kāi)頭,且后面跟了至少一個(gè)空白字符的行行的#和空白字符
[root@localhost ~]# cp /etc/rc.sysinit /tmp/ [root@localhost ~]# vim /tmp/rc.sysinit :%s/^#[[:space:]]\+//
4、為/tmp/grub.conf文件中前三行的行首加#號(hào);
:1,3s/^./#&/
5、將/etc/yum.repos.d/CentOS-Media.repo文件中所有的enabled=0或gpgcheck=0的最后的0修改為1;
:%s/\(enabled\|gpgcheck\)=0/\1=1/g
6、每4小時(shí)執(zhí)行一次對(duì)/etc目錄的備份,備份至/backup目錄中,保存的目錄名為形如etc-201504020202
0 */4 * * * /bin/bash -c 'filename=`date +/backup/etc-\%Y\%m\%d\%H\%M`&& mkdir $filename && cp -r /etc/* $filename && echo $filename && unset filename'
7、每周2,4,6備份/var/log/messages文件至/backup/messages_logs/目錄中,保存的文件名形如messages-20150402
0 0 * * 2,4,6 /bin/bash -c 'filename=`date +messages-\%Y\%m\%d` && cp /var/log/messages /backup/messages/$filename'
8、每天每?jī)尚r(shí)取當(dāng)前系統(tǒng)/proc/meminfo文件中的所有以S開(kāi)頭的信息至/stats/memory.txt文件中
0 */2 * * * /bin/bash -c 'echo -e `date +"\n\%F \%T"` >> /stats/memory.txt && cat /proc/meminfo | grep -i "^s" >> /stats/memory.txt'
9、工作日的工作時(shí)間內(nèi),每?jī)尚r(shí)執(zhí)行一次echo ""howdy""
0 */2 * * 1-5 echo ""howdy""
10、創(chuàng)建目錄/tmp/testdir-當(dāng)前日期時(shí)間;
#!/bin/bash declare curtime; curtime=$(date +"%Y%m%d%H%M") mkdir /tmp/testdir-$curtime
11、在此目錄創(chuàng)建100個(gè)空文件:file1-file100
#!/bin/bash declare curtime; curtime=$(date +"%Y%m%d%H%M") if [ ! -d $curtime ]; then mkdir /tmp/testdir-$curtime fi declare -i i=0; while [ $i -lt 100 ]; do i+=1 touch /tmp/testdir-$curtime/file$i done
12、顯示/etc/passwd文件中位于第偶數(shù)行的用戶的用戶名;
#!/bin/bash declare -a users=(`cut -d: -f1 /etc/passwd`) declare -i len=${#users[@]} declare -i i=0 while [ $i -le $len ] ;do if [ $(($i%2)) -eq 1 ];then echo ${users[$i]} fi i+=1 done
13、創(chuàng)建10用戶user10-user19;密碼同用戶名;
#!/bin/bash for i in {10..19};do id user$i &> /dev/null if [ ! $? -eq 0 ];then useradd user$i fi done
14、在/tmp/創(chuàng)建10個(gè)空文件file10-file19;
#!/bin/bash for i in {10..19};do if [ ! -f /tmp/file$i ]; then touch /tmp/file$i fi done
15、把file10的屬主和屬組改為user10,依次類(lèi)推。
#!/bin/bash for i in {10..19};do if [ -f /tmp/file$i ];then id user$i &> /dev/null if [ $? -eq 0 ];then chown $(cat /etc/passwd | grep "^user$i" |cut -d: -f3-4) /tmp/file$i fi fi done