vim 文本编辑器
一 vim是什么?
Vim 是一个文本编辑器软件,可以对文本文件执行快速的增加、删除、修改,以及支持使用正则表达式对文本文件的内容进行匹配过滤等操作,同时支持高亮显示语法等程序编辑功能,并可进行多文件同时编辑或多屏幕编辑。
文本文件是指,存储的内容不包含除字符本身根据指定的编码规则所能被转化为计算机识别的二进制内容以外的其他内容和属性的文件。
Vim 是vi编辑器的增强版本,在大多数的linux发行版中被内置,并且大多数软件接口默认调用的文本编辑器为vim,所以vim 是熟练使用linux的利器。
在linux系统中涉及对文本文件进行操作都可以使用vim来进行。
Vim是一个模式化的编辑器软件,常用的模式有以下几种:
命令模式,插入模式,末行模式,视图模式,多文件模式
1.各种模式之间的切换
1.1执行命令 vim FILENAME 进入文件,默认vim进入命令模式
1.2在命令模式中使用如下命令均可进入vim的插入模式
i:在当前光标处进行插入
a:在当前光标所在位置的后一个字符进行插入
o:在当前光标所在行的下方,插入一个新行
I: 在光标所在行的行首进行插入
A:跳至当前光标所在行的行尾进行插入
O:在光标所在行的上方插入一个新行
1.3进入末行模式
1.3.1 命令模式进入末行模式,输入 ":";
1.3.2 插入模式进入末行模式,输入"Esc"再输入":";
1.4退出vim 及保存文件
1.4.1 退出当前的编辑器,进入末行模式在输入q,强制退出为q!
1.4.2保存当前的编辑,进入末行模式再输入如下的命令:
wq 保存退出
x 保存退出
wq!强制保存退出
1.4.3命令模式下使用命令 ZZ 也可以保存退出。
2 vim的命令模式及其使用
2.1 在命令模式中,可以使用指定的命令对文件进行指定位置的查看,编辑等操作
2.2 使用光标的跳转,可使文件按照指定的方式和位置进行浏览
2.3 光标移动相关命令
2.3.1 字符间跳转,键入如下的命令,可以使文件中的光标按照如下的方向每次移动一个 字符: h:左 l:右 j:下 k:上;
2.3.2 单词之间的跳转,如下命令,可以使文中的光标按照如下的方向每次移动一个单词:
w:下一个单词的词首;
e:当前或下一个单词的词尾;
b:当前或上一单词的词首;
2.3.3 行中的跳转:
^: 跳转至行首的第一个非空白字符;
0:跳转至行首;
$: 跳转至行尾;
2.3.4 文件内的移动:
1G, gg:文件的首行
G:到文件的最后一行;
2.3.5 句子之间移动:
(:光标跳转至上一句句首;
):光标跳转至下一句句首;
2.3.6 段落之间移动:
{ :上一个段落的首部;
} :下一个段落的首部;
2.4命令模式中的编辑操作
2.4.1字符编辑:
x: 删除光标所在处的字符
xp: 删除光标所在处的字符,粘贴在下一个字符的位置
r + 字符: 使用字符替换光标所在处的单个字符;
2.4.2删除命令:
d 用来执行删除操作,通常跟其他控制字符的命令结合使用,以达到光标移动所经过 的字符便为删除的内容的效果,如下组合:
d^ :删除光标所在处向前一个字符至行首非空白字符的内容
d$ :删除光标所在处至行尾的内容
d0 :删除光标所在处向前一个字符至行首的内容
dd : 删除光标所在行
dw : 删除光标所在位置至下一个单词的词首
de : 删除光标所在位置至本词的词尾
db :删除光标所在位置的向前一个字符至本单词的词首
注意:删除的内容会被vim编辑器保存至缓冲区当中;
2.4.3复制命令:
y使用方法与删除d相同
yy: 复制行
2.4.4改变命令:
c 用法与d命令相似,删除后直接进入插入模式
c$、C: 删除当前光标至行尾,并进入插入操作
c^, c0:删除当前光标至行首,并进入插入模式
cc: 删除光标所在行并进入插入操作
2.4.5粘贴:p (paste, put)
如果此复制或删除的内容不是一个完整行
p:粘贴至当前光标所在处后面;
P:粘贴至当前光标所在处前面;
如果复制的内容是完整行(可以不止一行而是多行)
p: 粘贴至当前光标所在行下方;
P:行上方;
2.4.6撤消此前的编辑操作:
u: 撤消此前编辑操作;
Ctrl+r:恢复此前的撤消操作
.: 重复前一个编辑操作
2.4.7翻屏操作:
Ctrl+f: 向文件尾部翻一屏;
Ctrl+b:向文件首部翻一屏;
Ctrl+d: 向文件尾部翻一屏,光标停留在屏幕中间的行首
Ctrl+u: 向文件首部翻一屏,光标停留在屏幕中间的行首
3 vim的末行模式
3.1 地址,定界
:start_pos,end_pos
#:第#行;
#,#:第#行的当前行
#,+#:#行到#+#行(+ 向下#行)
#,-#:#行到#-#行(-向上#行)
.: 当前行
$: 最后一行
%: 全文,相当于1,$
/pat1/:第一次被此模式所匹配到的行;
#,/pat1/
/pat1/,/pat2/
后可跟编辑命令:
d, y
w, r
3.2 查找
/PATTERN:向尾部进行
?PATTERN:向首部进行
n: 与命令同方向
N:与命令反方向
3.3 查找替换
s: 在末行模式下,在地址定界的范围内完成查找替换操作;有命令历史纪录功能
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用后向引用符号,以引用前面模式 中的分组括号所匹配到的内容;
\1, \2, ...
&:引用“要找的内容”匹配到的整个内容;
修饰符:
i: 忽略大小写
g: 全局替换
/:用于分隔符,所以,要查找的内容或替换为的内容中出现此符号,要使用\对其转 义,使用格式:\/
分隔符可替换为其它字符:例如@,#等;
4 多文件模式:
vim FILE1 FILE2 ...
:next 切换至下一个个文件
:first 切换回第一个文件
:prev 切换回上一个
:last 切换回最后一个
:wqall 全部的文件保存并推出
:q!all 强制退出全部的文件
5 多文件窗口分割:
vim -o|-O FILE1 FILE2 ...
-o 窗口上下分割 -O 窗口左右分割
Ctrl+w, 在多个窗口间切换
单文件窗口分割:
Ctrl+w, s: 水平分割split
Ctrl+w, v: 垂直分割vertical
6 定制vim的某些工作特性:
6.1 行号
显示:set nu
禁用:set nonu
6.2 括号匹配
显示:set sm
禁用:set nosm
6.3 自动缩进:
set ai
set noai
6.4 高亮搜索
set hlsearch
set nohlsearch
6.5 语法着色
syntax on
syntax off
6.6 忽略字符大小写
set ic
set noic
:help 获取帮助
:help SUBJECT
7 特性设定的永久生效方式:
全局配置文件:/etc/vimrc
用户个人的配置文件:~/.vimrc
二 find 命令
1 查找文件的命令,指定文件的查找条件,并且在查找过后可以执行指定的处理操作的命令,查找文件时可以做到实时的精确查找
2 find命令:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:默认为当前路径;
查找条件:指定的查找标准,可以根据文件名、大小、属主属组、类型等进行;默认为找出指 定路径下的所有文件;
处理动作:对符合条件的文件做什么操作;默认为输出至屏幕;
3 查找条件:
3.1根据文件名进行查找:
-name "文件名称": 支持使用glob;
*, ?, []
-iname "文件名称":不区分字符大小写,支持使用glob;
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;
3.2根据属主、属组查找:
-user USERNAME: 查找属主为指定用户的文件;
-group GROUPNAME:
-uid UserID: 查找文件的属主指定uid的文件;
-gid GroupID:
-nouser: 查找没有属主的文件;
-nogroup:查找没有属组的文件;
3.3根据文件类型进行查找:
-type TYPE
f: 普通文件
d: 目录
l: 符号链接
b: 块设备
c: 字符设备
p: 命名管道
s: 套接字
3.4组合查找条件:
与条件:-a
或条件:-o
非条件:-not或使用 “!”
3.5根据文件大小来查找:
-size [+|-]#UNIT
单位:k, M, G
#UNIT: (#-1,#] 假设#=5,此范围为大于4小于等于5
+#UNIT: (#,+oo) 假设#=5,此范围为等于大于5
-#UNIT:[0,#-1] 假设#=5,此范围为等于小于4,大于0
3.6根据时间戳:
以“天”为单位
-atime 访问时间 [+|-]# 假设#=5
#:[#,#+1) 5-6天前之间
+#: [#+1,oo] 6天之前
-#: [0,#) 5天前到现在
-mtime 修改时间
-ctime 改变世界
以“分钟”为单位 时间的表示方法与-atime相同
-amin 访问
-mmin 修改
-cmin 改变
3.7根据权限:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;
/400
-MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;
4 处理动作:
-print: 默认处理动作
-ls:类似于对查找到的每个文件做"ls -l"的操作;
-delete: 删除查找到的文件;
-fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;
-ok COMMAND {} \;
对每个文件执行指定的命令之前需要用户事先确认;
-exec COMMAND {} \;
无需用户确认;
三 bash环境变量
bash环境配置:
配置文件,生效范围划分,存在两类:
全局配置:
/etc/profile, /etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分,存在两类:
profile类:为交互式登录的shell提供配置
/etc/profile, /etc/profile.d/*.sh
~/.bash_profile
功用:
(1) 定义环境变量,例如PATH、PS1
(2) 运行命令或脚本
bashrc类:为非交互式登录shell提供配置
/etc/bashrc
~/.bashrc
功用:
(1) 定义命令别名;
(2) 定义本地变量;
变量:内存空间,变量名
类型:
环境变量:作用范围当前shell进程及其子进程
本地变量:作用范围当前shell进程
局部变量:作用范围仅为当前shell进程中某代码片断(通常为函数上下文)
位置变量:$1, $2
特殊变量:$?
变量定义方式:
bash内置变量:可直接调用,内置了许多环境变量,例如PATH等
自定义变量:
变量赋值:变量名=值
bash弱类型:
变量存储数据时,默认均采用字符形式;任何变量可以不经声明,直接引用;
120:24bits
120: 8bits
定义本地变量:
name=value
查看命令:set
撤消变量:
unset name
定义环境变量:
export name=value
declare -x name=value
查看命令:env, printenv, export
引用变量:
${name}, $name
bash中的引用符号:
‘‘: 强引用,变量替换不会发生
"":弱引用
``: 命令引用
shell登录类型:
交互式登录:
直接通过终端进行的登录;
通过su -l Username命令实现的用户切换;
非交互式登录:
图形界面下打开的命令行窗口;
执行脚本;
su Username;
配置文件作用次序:
交互式登录:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
编辑配置文件定义的新配置如何生效?
(1) 重新登录;
(2) 让当前shell进程去重新读取指定的配置文件;
source /PATH/TO/SOMEFILE
. /PATH/TO/SOMEFILE
注意:副作用
四 Linux文件系统上的特殊权限
权限模型:
u, g, o
r, w, x
进程的安全上下文:
前提:进程有属主(进程以哪个用户的身份运行);文件有属主和属组;
(1) 用户是否能够把某个可执行程序文件启动为进程,取决于用户对程序文件是否拥 有执行权限;
(2) 程序启动为进程后,此进程的属主为当前用户,也即进程的发起者;进程所属的 组,为发起者的基本组;
(3) 进程拥的访问权限,取决其属主的访问权限:
(a) 进程的属主,同文件属主,则应用文件属主权限;
(b) 进程的属主,属于文件的属组,则应用文件属组权限;
(c) 则应用其它权限;
SUID:
(1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否有执行权限;
(2) 启动为进程之后,其属主不是发起者,而程序文件自己的属主;这种机制即为SUID;
权限设定:
chmod u+s FILE...
chmod u-s FILE...
注意:
s: 属主原本拥有x权限;
S: 属主原本无x权限;
SGID:
默认情况下,用户创建文件时,其属级为此用户所属的基本组;
一旦某目录被设定了SGID权限,则对此目录拥有写权限的用户在此目录中创建的文件 所属的组为目录的属组,而非用户的基本组;
权限设定:
chmod g+s FILE...
chmod g-s FILE...
Sticky:
对于一个多人可写的目录,此权限用于限制每个仅能删除自己的文件;
权限设定
chmod o+t FILE...
chmod o-t FILE...
作业练习:
1、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;
:%s@^[[:space:]]\+@@
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
:%s@^[[:space:]]\+@#&@
3、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
:%s@\/\<etc\>\/\<sysconfig\>\/\<init\>@\/var\/log@
4、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;
:%s@^#\([[:space:]]\+\)@\1@
5、查找/var目录属主为root,且属组为mail的所有文件;
[root@localhost tmp]# find /var -user root -a -group mail -ls
6、查找/usr目录下不属于root、bin或hadoop的所有文件;
[root@localhost tmp]# find /usr -not -user root -a -not -user bin -a -not -user hadoop -ls
7、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
[root@localhost tmp]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
8、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
[root@localhost tmp]# find / -atime -7 -nouser -o -nogroup
9、查找/etc目录下大于20k且类型为普通文件的所有文件;
[root@localhost tmp]# find /etc -size +20k -exec ls -hl {} \;
10、查找/etc目录下所有用户都没有写权限的文件;
[root@localhost tmp]# find /etc -not -perm /222 -ls
11、查找/etc目录下至少有一类用户没有执行权限的文件;
[root@localhost tmp]# find /etc -not -perm -111 -ls
12、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
[root@localhost tmp]# find /etc/init.d -perm -113 -ls
13、让普通用户能使用/tmp/cat去查看/etc/shadow文件;
[root@localhost tmp]#chmod u+s /etc/shadown
原文地址:http://velen38.blog.51cto.com/911313/1692559