vim文本编辑及文件查找详解
vim编辑器深入讲解
vim编辑器
文本编辑器:
文本:纯文本,ASCII text;Unicode;
文本编辑种类:
行编辑器:sed
全屏编辑器:nano, vi
vi: Visual Interface
vim: Vi IMproved
vim:
模式化的编辑器
基本模式:
编辑模式,命令模式
输入模式
末行模式:
内置的命令行接口;
打开文件:
# vim [options] [file ..]
+#:打开文件后,直接让光标处于第#行的行首;
vim +5 /etc/fstab
+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首;
vim +/export functions
+:直接跳转到文件最后一行;
vim + functions
模式转换:
编辑模式:默认模式
编辑模式 --> 输入模式:
i:insert, 在光标所在处输入;
a: append,在光标在处后方输入;
o:在光标所在处的下方打开一个新行;
I:在光标所在行的行首输入;
A:在光标所在行的行尾输入;
O:在光标所在处的上方打开一个新行;
输入模式 --> 编辑模式
ESC
编辑模式 --> 末行模式
:
末行模式 --> 编辑模式
ESC
关闭文件:
ZZ:保存并退出;
:q 退出
:q! 强制退出,不保存此前的编辑操作
:wq 保存并退出;
:w, :q
:x 保存并退出;
:w /PATH/TO/SOMEFILE
:w /tmp/test.txt[另存为]
光标跳转:
字符间跳转
h:左
j:下
k:上
l:右
#COMMAND:跳转由#指定的个数的字符;
10L,20H,5j,
单词间跳转
w:下一个单词的词首;
e:当前或后一个单词的词尾;
b:当前或前一个单词的词首;
#COMMAND:跳转由#指定的个数的单词;
10w,5e,8b
行首行尾跳转
^:跳转至行首的第一个非空白字符;
0:跳转至行首;
$:跳转至行尾;
行间跳转
#G:跳转至由#指定的行;
1G, gg:第一行;
G:最后一行;
句间跳转:
)
(
段间跳转
}
{
翻屏:
Ctrl+f:向文件尾翻一屏
Ctrl+b:向文件首部翻一屏
Ctrl+d:向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
Enter:按行向后翻
vim的编辑命令:
字符编辑:
x:删除光标所在处的字符;
#x:删除光标所在处起始的#个字符;
例:10x
xp:交换光标所在处的字符与其后面的字符的位置;
替换命令(replace):
r:替换光标所在处的字符;
rCHAR
rA,rE,ra
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除;
d$:删除从当前光标位置到行尾的所有内容;
d^:删除从当前光标位置到行首的所有内容;
dw:删除当前光标所在处的一个单词;
de:删除当前光标所在处的一个单词;
db:删除当前光标所有前的一个单词;
#COMMAND:指定数字
5dw,8de,10db
dd:删除光标所在处的行;
#dd:删除光标所处的行起始的共#行;
粘贴命令(p, put, paste):
p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在处的后方;
P:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至当前光标所在处的前方;
复制命令(yank, y):
y:复制,工作行为相似于d命令;
y$
y^
y0
ye
yw
yb
#COMMAND
yy:复制一整行
#yy:复制#行
改变命令(change, c):
从编辑模式转换到输出模式,实现删除操作,方法和d,y相同;
c$
c^
c0
cb
ce
cw
#COMMAND
cc:删除光标所在的行,并转换为输出模式;
#cc:
其它编辑操作:
可视化模式:
v:按字符选定;
V:按行选定;
结合编辑命令使用:d, c, y
撤销(undo)操作:
u:撤销此前的操作;
#u:撤销此前的#个操作;
撤销此前的撤销:
Ctrl+r
重复执行前一个编辑操作:
.
vim自带的练习教程:vimtutor
vim编辑器高效用法进阶
vim末行模式:
内建的命令行接口
(1) 地址定界
:start_pos[,end_pos]
#:特定的第#行,例如5即第5行;
.:当前行;
$:最后一行;
#,#:指定行范围,左侧为起始行,右侧为结束行;
#,+#:指定行范围,左侧为超始行绝对编号,右侧为相对左侧行号的偏移量;例如:3,+7
.,$-1
1,$
%:全文
/pattern/:从光标所在处起始向文件尾部第一次被模式所匹配到的行;
/first/,$
/pat1/,/pat2/:从光标所在处起始,第一次由pat1匹配到的行开始,至第一次由pat2匹配到的行结束之间的所有行;
可同编辑命令一同使用,实现编辑操作:
d
y
c
w /PATH/TO/SOMEFILE:将范围内的文本保存至指定的文件中;
1,5w /tmp/fun.out
r /PATH/FROM/SOMEFILE:将指定的文件中的文本读取并插入至指定位置;
r /tmp/fun.out
(2) 查找
/PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配到的所有字符串;
?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串;
n:下一个,与命令方向相同;
N:上一个,与命令方向相反;
(3) 查找并替换
s:末行模式的命令;使用格式:
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用正则表达式;
替换为的内容:不能使用下则表达式,但可以引用;
如果“要查找的内容”部分在模式中使用分组符号:在“替换为的内容”中使用后向引用;
直接引用查找模式匹配到的全部文本,要使用&符号;
1,$s/if/IF
修饰符:
i:忽略大小写;
g:全局替换,意味着一行中如果匹配到多次,则均替换;
1,$s/if/IF/ig
例: :%s/\/run\/systemd\/system/\/etc\/sysconfig/g
可把分隔符替换为其它非常用字符:
s@@@
s###
%s@/etc/sysconfig@/etc/init.d@g
示例:
%s@\<t\([[:alpha:]]\+\)\>@T\1@g
%s@\<t[[:alpha:]]\+\>@&er@g
练习:
1、复制/etc/grub2.cfg文件至/tmp目录中,用查找替换命令删除/tmp/grub2.cfg文件中以空白字符开头的行的行首的空白字符;
%s@^[[:space:]]\+@@
2、复制/etc/rc.d/init.d/functions文件至/tmp目录中,用查找替换命令为/tmp/functions文件的每个以空白字符开头的行的行首加上#;
%s@^[[:space:]]\+[^[:space:]]@#&@g
3、为/tmp/grub2.cfg文件的前三行的行首加上#号;
4、将/etc/yum.repos.d/CentOS-Base.repo文件中所有的enabled=0替换为enabled=1,所有gpgcheck=0替换为gpgcheck=1;
%s@\(enabled\|gpgcheck\)=0@\1=1@g
vim的多文件功能:
多文件:
vim FILE1 FILE2 ...
在文件间切换:
:next 下一个
:prev 上一个
:first 第一个
:last 最后一个
退出所有文件:
:wqall 保存所有文件并退出;
:wall
:qall
多窗口:
-o:水平分割窗口
-O:垂直分割窗口
在窗口间切换:Ctrl+w, ARROW
注意:单个文件也可以分割为多个窗口进行查看:
Ctrl+w, s:水平分割窗口
Ctrl+w, v:垂直分割窗口
定制vim的工作特性:
注意:在末行模式下的设定,仅对当前vim进程有效;
永久有效:
全局:/etc/vimrc
用户个人:~/.vimrc
1、行号
显示:set number, 简写为set nu
取消显示:set nomber, set nonu
2、括号匹配高亮
匹配:set showmatch, set sm
取消:set nosm
3、自动缩进
启用:set ai
禁用:set noai
4、高亮搜索
启用:set hlsearch
禁用:set nohlsearch
5、语法高亮
启用:syntax on
禁用:syntax off
6、忽略字符大小写
启用:set ic
禁用:set noic
获取帮助:
:help
:help subject
课外作业:如何设置tab键缩进4个字符;
bash脚本编程之算术运算
+,-,*,/, **, %
算术运算格式:
(1) let VAR=算术运算表达式
(2) VAR=$[算术运算表达式]
(3) VAR=$((算术运算表达式))
(4) VAR=$(expr $ARG1 $OP $ARG2)
[root@CentOS-7-1 ~]# num1=1017
[root@CentOS-7-1 ~]# num2=1213
[root@CentOS-7-1 ~]# let TAL=$num1+$num2
[root@CentOS-7-1 ~]# echo $TAL
[root@CentOS-7-1 ~]# echo $[num1+num2]
[root@CentOS-7-1 ~]# echo $((num1+num2))
[root@CentOS-7-1 ~]# TAA=$(expr $num1 + $num2)
[root@CentOS-7-1 ~]# echo $TAA
注意:乘法符号在有些场景中需要使用转义符;
练习:写一个脚本,完成如下功能:
添加三个用户;
求此三个用户的UID之和;
#!/bin/bash
#create three users
useradd user1 && useradd user2 && useradd user3
#Defining variables
NUM1=$(grep user1 /etc/passwd |cut -d: -f3)
NUM2=$(grep user2 /etc/passwd |cut -d: -f3)
NUM3=$(id -u user3)
#Calculate and sum
let SUM1=$NUM1+$NUM2+$NUM3
echo $SUM1
echo $[NUM1+NUM2+NUM3]
echo $((NUM1+NUM2+NUM3))
SUM2=$(expr $NUM1 + $NUM2 + $NUM3)
echo $SUM2
echo $?
文件查找命令企业级应用
文件查找
在文件系统上查找符合条件的文件;
实现工具:locate, find
locate:
依赖于事先构建好的索引库;
系统自动实现(周期性任务);
手动更新数据库(updatedb);
工作特性:
查找速度快;
模糊查找;
非实时查找;
locate [OPTION]... PATTERN...
-b:只匹配路径中的基名;
-c:统计出共有多少个符合条件的文件;
-r:BRE
locate -b -c filename
注意:索引构建过程需要遍历整个根文件系统,极消耗资源;
yum list |grep locate:查看命令是哪个安装包;
find:
实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;
工作特性:
查找速度略慢;
精确查找;
实时查找;
用法:
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径;默认为当前目录;
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;
查找条件:
表达式:选项和测试
测试:结果通常为布尔型("true", "false")
根据文件名查找:
-name "pattern"
-iname "pattern" [不区分大小写]
支持glob风格的通配符;
*, ?, [], [^]
示例:
[root@CentOS-7-1 find]# find /tmp -name “passwd”
/tmp/find/passwd
[root@CentOS-7-1 find]# find /tmp -iname “passwd”
/tmp/find/Passwd
/tmp/find/PASSWD
/tmp/find/passwd
[root@CentOS-7-1 find]# find /tmp -iname “^passwd”
[root@CentOS-7-1 find]#
[root@CentOS-7-1 find]# find /tmp -iname “passwd"
/tmp/find/Passwd
/tmp/find/PASSWD
/tmp/find/passwd
/tmp/find/abcpasswd
[root@CentOS-7-1 find]# find /tmp -iname "passwd”
/tmp/find/Passwd
/tmp/find/PASSWD
/tmp/find/passwd
/tmp/find/passwd-
/tmp/find/passwdx
[root@CentOS-7-1 find]# find /tmp -iname “passwd”
/tmp/find/Passwd
/tmp/find/PASSWD
/tmp/find/passwd
/tmp/find/passwd-
/tmp/find/passwdx
/tmp/find/abcpasswd
/tmp/find/abcpasswdzsh
[root@CentOS-7-1 find]# find /tmp -iname “*passwd?”
/tmp/find/passwd-
/tmp/find/passwdx
[root@CentOS-7-1 find]# find /tmp -iname “*passwd[[:alnum:]]”
/tmp/find/passwdx
-regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名;
根据文件从属关系查找:
-user USERNAME:查找属主指定用户的所有文件;
-group GRPNAME:查找属组指定组的所有文件;
-uid UID:查找属主指定的UID的所有文件;
-gid GID:查找属组指定的GID的所有文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
根据文件的类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l:符号链接文件
b:块设备 文件
c:字符设备文件
p:管道文件
s:套接字文件
示例:
[root@CentOS-7-1 find]# find /dev/ -type b -ls
10358 0 brw-rw---- 1 root cdrom 11, 0 Jan 31 09:39 /dev/sr0
10301 0 brw-rw---- 1 root disk 8, 5 Jan 31 09:39 /dev/sda5
10300 0 brw-rw---- 1 root disk 8, 4 Jan 31 09:39 /dev/sda4
10299 0 brw-rw---- 1 root disk 8, 3 Jan 31 09:39 /dev/sda3
10298 0 brw-rw---- 1 root disk 8, 2 Jan 31 09:39 /dev/sda2
10297 0 brw-rw---- 1 root disk 8, 1 Jan 31 09:39 /dev/sda1
10254 0 brw-rw---- 1 root disk 8, 0 Jan 31 09:39 /dev/sda
组合测试:
与:-a, 默认组合逻辑;
或:-o
非:-not, !
find /tmp/ -uid 0 -type f -ls
find /tmp/ -nouser -o -type f -ls
find /tmp/ ! -type f -ls
练习:
1、找出/tmp目录下属主为非root的所有文件;
find /tmp/ ! -user root -ls
2、找出/tmp目录下文件名中不包含fstab字符串的文件;
find /tmp/ ! -iname "*fstab*" -ls
3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;
find /tmp/ ! -user root -a ! -iname "*fstab*" -ls
find /tmp/ ! \( -user root -o -iname "*fstab*" \) -ls
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根据文件的大小查找:
-size [+|-]#UNIT
常用单位:k, M, G
格式: find /tmp -size xk/-xM/+xG[x为数字]
#UNIT:(#-1, #,大于指定值减1,或者小于等于指定值为符合条件]
-#UNIT:[0,#-1,从0开始到少于指定的值减1为符合条件]
+#UNIT:(#, oo,只要大于指定的数值均为符合条件)
根据时间戳查找:
以“天”为单位:
-atime [+|-]#
#:[#, #-1,指定时间的天数内,如#为3,表示过去3天以内,不超过第4天,大于72小时,不超过96小时)
-#:(#, 0,大于0,少于等于指定值为符合条件]
+#:(oo, #-1,指定天数的前一天到无穷时间均为符合条件]
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
格式:find /etc -atime/mtime/ctime/amin/mmin/cmin x/-x/+x[x为指定数字]
stat filename[查看文件的访问信息]
根据权限查找:
-perm [/|-]mode
mode:精确权限匹配;
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;
9位权限之间存在“或”关系;
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
格式:find /tmp/ -perm 644 -ls
find /tmp -perm /666 -ls
find /tmp -perm -222 -ls[所有用户必须都具备写权限]
find /tmp -perm -not -222 -ls[至少有一个用户没有写权限]
处理动作:
-print:输出至标准输出;默认的动作;
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;
示例:
[root@CentOS-7-1 tmp]# find /tmp/ -nouser -a -nogroup -ls
50331842 0 drwxr-xr-x 2 1000 1000 23 Jan 30 23:19 /tmp/shell
33584910 0 -rw-r–r-- 1 1000 1000 0 Jan 31 23:45 /tmp/afstabb
33585784 0 -rw-r–r-- 1 1000 1000 0 Jan 31 23:45 /tmp/hifstabok
[root@CentOS-7-1 tmp]# find /tmp/ -nouser -a -nogroup -ok chown root:root {} ;
[root@CentOS-7-1 tmp]# find ./ -perm -002 -exec mv {} {}.bat ;
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
find | xargs COMMAND
课外作业:学习xargs命令的用法;
练习:
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
~]# find /var -user root -a -group mail -ls
2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
~]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;
~]# find / \( -nouser -o -nogroup \) -atime -7 -ls
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
~]# find /etc -size +1M -type f -exec ls -lh {} \;
6、查找/etc目录下所有用户都没有写权限的文件;
~]# find /etc -not -perm /222 -type f -ls
7、查找/etc目录至少有一类用户没有执行权限的文件;
~]# find /etc -not -perm -111 -type f -ls
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
~]# find /etc -perm -113 -type f -ls
Linux特殊权限及facl扩展
Linux系统上的特殊权限
特殊权限:SUID, SGID, STICKY
安全上下文:
1、进程以某用户的身份运行; 进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
2、权限匹配模型:
(1) 判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
(2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;
(3) 应用other的权限;
SUID:
默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行;
SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而程序文件自己的属主;
管理文件的SUID权限:
chmod u+|-s FILE...
展示位置:属主的执行权限位
如果属主原本有执行权限,显示为小写s;
否则,显示为大写S;
SGID:
功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;
管理文件的SGID权限:
chmod g+|-s FILE...
展示位置:属组的执行权限位
如果属组原本有执行权限,显示为小写s;
否则,显示为大写S;
Sticky:
功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的已有文件;如果为此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己的文件;
管理文件的Sticky权限:
chmod o+|-t FILE...
展示位置:其它用户的执行权限位
如果其它用户原本有执行权限,显示为小写t;
否则,显示为大写T;
系统上的/tmp和/var/tmp目录默认均有sticky权限;
管理特殊权限的另一方式:
suid sgid sticy 八进制权限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字;
例如:chmod 1777
facl:file access control lists
文件的额外赋权机制:
在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制;
getfacl命令【查看facl访问控制权限】:
getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE
setfacl命令:
赋权给用户:
setfacl -m u:USERNAME:MODE FILE...
赋权级组:
setfacl -m g:GROUPNAME:MODE FILE...
示例:setfacl -m u:user1:rwx test.file
撤销赋权:
setfacl -x u:USERNAME FILE...
setfacl -x g:GROUPNAME FILE...