N26 第六周作业
总结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 模式,这有一个例外,从 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打开文件
vim [options] [file ..] vim functions vim +2 functions +2 表示打开文件后光标位于第2行的开头 vim + functions 如果省略"+"号后面的数字,则表示打开文件后,光标位于文件最后一行的开头 vim +/if functions 打开文件后,光标位于第1次匹配模式(if)的位置
保存文件
:w 保存修改
ZZ:保存并退出
: x 保存并退出
:wq 保存并退出;
:w file_name 保存结果到file_name文件中,而vim中的文件仍旧是先前打开在文件
关闭文件
:q! 强制退出,不保存修改结果
:q 如果文件自从上次保存后未曾修改,直接退出,否则提示错误
光标移动
:help motion.txt 可查看完整的相关光标移动的帮助
:help usr_03.txt 可查看较重要的相关光标移动的帮助
字符跳转
(1)可以使用键盘的上下左右箭头
(2)可以使用键盘的hjkl键:
h 向左
l 向右(小写L)
j 向下
k 向上
(3)使用数字与命令组合实现按指定字符移动光标,例如:
3k 表示向上移动3行
4<-(4加左箭头)表示向左移动4个字符
单词跳转
w 光标移到下一个单词的首字母
e 光标移到当前或下一个单词的尾字母
b 光标移到当前或前一个单词的首字母#(w|e|b) 数字与指定命令之一组合,每次跳转指定数目在单词
行首行尾跳转
^ 转到行首第一个非空白字符
0 转到行首第一个字符
$ 转到行尾第一个字符
段间跳转} 转到下一段(光标定位在空白行)
{ 转到下一段(光标定位在空白行)
句间跳转
( 转到前一句
) 转到后一句
翻屏
Ctrl+f 向下一屏 Forwards (downwards)
Ctrl+b 向上一屏 Backwards (upwards)Ctrl+d 向下半屏 Downwards
Ctrl+u 向上半屏 UpwardsEnter:按行向后翻
vim的编辑命令:
字符编辑:
x 删除光标位置字符
#x 删除从光标开始指定个数字符xp 可实现光标位置字符与其后字符对调位置
rCHAR 将光标位置字符替换为CHAR所指定的字符,注意是小写的r,大写R直接进入替换模式了
删除(d)
dd 删除光标所在行
d$ 删除光标开始至行尾字符
d^ 删除光标前一个字符至行首第一个非空白字符
dw 删除光标开始至下一个单词首字母之间的字符
de 删除光标位置至下一个词尾之间的字符
db 删除渔村位置前一个字符至前一个词首之间的字符#d(w|b|e|$|^|d) 删除指定数量的字符、单词、行
复制(y)
工作方式类似 d 命令
粘贴
p(小写)在光标位置后面或当前行后粘贴
#p 在光标位置后或当前行后粘贴指定次数
P(大写)在光标位置前面或当前行之前粘贴
#P 在光标位置前面或当前行前面粘贴指定次数
删除(c)
工作方式类似d,所不同在是删除后直接转为Insert模式
撤销(u)
#u 撤销n步
反撤销(Ctrl+r)
#ctrl+r反撤销n步重复执行前一个编辑操作:
[#].按行选定(V)
按字符选定(v)
按块选定(Ctrl+V)
以上3种可视化选定方法结合上下左右来选择,然后结合d、c、y、x等命令使用vim自带的练习教程:vimtutor
命令行模式
命令范围
# 特定行
. 当前行
$ 最后一行
% 所有行,相当于1,$
#,# 某行到某行
/pattern/ 由pattern匹配的下一行
#,+#:指定行范围,如3,+2 为第3行加2行,总共3行结合编辑命令,实现编辑操作
d
y
c
r fild_name 将指定文件内容插入命令范围之后
w file_name 将选定范围写入某文件
查找
/pattern 按模式匹配自上向下查找
?pattern 按模式匹配自下向上查找
n 在查找结果中按查找方向依次导航
N 在查找结果中按查找方向相反的方向依次导航
查找与替换
:[range]s/{pattern}/{string}/[flags]
range为命令范围
pattern为要查找内容的匹配模式
string为需要替换的内容,可以后向引用
flags为修饰符
i,忽略大小写
g,行内全局匹配可把分隔符替换为其它非常用字符:
s@@@
s###
同时打开多个文件
vim FILE1 FILE2 ...
在文件间切换:
:next 下一个
:prev 上一个
:first 第一个
:last 最后一个退出所有文件:
:wqall 保存所有文件并退出;
:wall
:qall打开多个文件时可以使用选项拆分窗口
vim -o abc bcd 拆分成上下两个窗口
vim -O abc bcd 拆分成左右两个窗口窗口切换可以使用 Ctrl+w, Arrow
单个文件拆分窗口
Ctrl+w, s:拆分成上下两个窗口
Ctrl+w, v:拆分成左右两个窗口
Vim 工作特性
配置文件
/etc/vimrc System wide Vim initializations.
~/.vimrc Your personal Vim initializations.:help option-list
查看特性值 :se[t] {option}?
行号
打开::set number
关闭::set nonumber
自动缩进
打开::set autoindent
关闭::set noautoindent
高亮搜索
打开::set hlsearch
关闭::set nohlsearch
语法高亮
打开::syntax on
关闭::syntax off
搜索pattern忽略大小写
打开::set ignorecase
关闭::set noignorecase
获取帮助:
:help
:help subject
1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#
root@localhost ~]# cp /etc/rc.d/rc.local /tmp/ [root@localhost ~]# vim /tmp/rc.sysinit :%s/^[[:space:]]\+[^[:space:]]/#&/
2、复制/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文件中的以#开头,且后面跟了至少一个空白字符的行行的#和空白字符
[root@localhost ~]# cp /etc/rc.sysinit /tmp/ [root@localhost ~]# vim /tmp/rc.sysinit :%s/^#[[:space:]]\+//
4、为/tmp/grub.conf文件中前三行的行首加#号;
: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小时执行一次对/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、每天每两小时取当前系统/proc/meminfo文件中的所有以S开头的信息至/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、工作日的工作时间内,每两小时执行一次echo ""howdy""
0 */2 * * 1-5 echo ""howdy""
10、创建目录/tmp/testdir-当前日期时间;
#!/bin/bash declare curtime; curtime=$(date +"%Y%m%d%H%M") mkdir /tmp/testdir-$curtime
11、在此目录创建100个空文件: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文件中位于第偶数行的用户的用户名;
#!/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、创建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/创建10个空文件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,依次类推。
#!/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