一 Vim
1.vim的使用方法
1.1 三种模式化
编辑模式、输入模式、末行模式
1.2 模式转换
编辑模式 --> 输入模式:
i:在当前光标所在字符的前面,转为输入模式
a:在当前光标所在字符的后面,转为输入模式
o:在当前光标所在行的下方,新建一行,并转为输入模式
I:在当前光标所在行的行首,转为输入模式
A:在当前光标所在行的行尾,转为输入模式
O:在当前光标所在行的上方,新建一行,并转为输入模式
输入模式 --> 编辑模式:ESC
编辑模式 --> 末行模式::
末行模式 --> 编辑模式: ESC
1.3 打开和保存文件
1)打开文件
vim +#:打开文件,并定位于第#行
vim +:打开文件,并定位至最后一行
vim +/PATTERN:打开文件,定位至第一次被PATTERN匹配的行的行首
2)关闭文件
:q 退出
:wq 保存并退出 等于 :x 等于 编辑模式下 zz
:q! 不保存强行退出
:w 保存
:w! 强行保存
ZZ 退出
2.光标跳转
2.1字符间跳转
h,j,k,l :左,下,上,右
2.2单词间跳转
w:跳至下一个单词的词首
e:跳至当前或下一个单词的词尾
b:跳至当前或前一个单词的词首
2.3行内跳转
0:绝对行首
^:行首的第一个非空白字符
$:绝对行尾
2.4行间移动
#G:跳转至第#行 (末行模式下 :#行号)
G:跳至最后一行 (末行模式下 :$ )
gg:跳至第一行
2.3句间移动
)
(
2.4段落间移动
}
{
3.编辑命令
3.1字符编辑
x:删除光标所在处的单个字符
#x:删除光标所在处及向后的共#个字符
3.2 删除命令
d命令与跳转命令结合使用
d$:删除到行尾。
#d跳转符:删除跳转符指定的#个字符
dd:删除当前光标所在行
#dd:删除包括光标所在行之内的#行
注意:删除的内容会被vim编辑器保存至缓冲区当中;
3.2粘贴命令
如果此复制或删除的内容不是一个完整行
p:粘贴至当前光标所在处后面;
P:粘贴至当前光标所在处前面;
如果复制的内容是完整行(可不止一行)
p: 粘贴至当前光标所在行下方;
P:行上方;
3.3复制命令
用法与d类似
yy:复制一行
3.4改变命令
cc:删除一行,并进入输入模式
c$:删除到行尾,并进入输入模式
3.5撤消命令
u:撤销上一次操作,连续u命令可以撤销此前的n次操作
#u:撤销最近#次编辑操作
Ctrl+r:恢复此前的撤消操作
.: 重复前一个编辑操作
3.6翻屏
ctrl + d:向下翻半屏
ctrl + u:向上翻半屏
ctrl + f:向上翻一屏
ctrl + b:向下翻一屏
4.查找替换
4.1地址定界
:start_pos,end_pos
#:第#行;
#,#
#,+#
.: 当前行
$: 最后一行
%: 全文,相当于1,$
/pat1/:第一次被此模式所匹配到的行;
#,/pat1/
/pat1/,/pat2/
后可跟编辑命令:
d, y
w, r
4.2查找
/PATTERN:从光标开始处向文件尾搜索PATTERN
?PATTERN:从光标开始处向文件首搜索PATTERN
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
4.3查找替换
1)s(substitute 替换): 在末行模式下,在地址定界的范围内完成查找替换操作;
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用后向引用符号,以引用前面模式中的分组括号所匹配到的内容;
\1, \2, ...
&:引用“要找的内容”匹配到的整个内容;
2)修饰符:
%:表示所有行
i: 忽略大小写
g: 全局替换
/:用于分隔符,所以,要查找的内容或替换为的内容中出现此符号,要使用\对其转义,使用格式:\/
分隔符可替换为其它字符:例如@,#等;
:s/p1/p2/g 在当前行中所有p1用p2代替
:n1,n2s/p1/p2/g 将n1至n2行中的所有p1用p2代替
:%s/p1/p2/g 将文件中的所有p1用p2代替
5.多文件模式
5.1打开多文件
格式:vim FILE1 FILE2 ...
注意:要再保存以后才能next,first切换
:next 切换
:first
:prev
:last
:wqall
:q!all (qall!)
5.2多文件窗口分割
vim -o|-O FILE1 FILE2...
Ctrl+w ARROW:切换文件
5.3单文件窗口分割
Ctrl+w, s: split, 水平分割
Ctrl+w, v: vertical, 垂直分割
6.定制vim的某些工作特性
(1) 行号
显示:set nu
禁用:set nonu
(2) 括号匹配
显示: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
(7) 特性设定的永久生效方式:
全局配置文件:/etc/vimrc
用户个人的配置文件:~/.vimrc
练习1
1.复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符
:%s/^[[:space:]]//g
2. 复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留
:%s/^/# /g
3. 替换/tmp/functions文件中的/etc/sysconfig/init为/var/log
:%s/\/etc\/sysconfig\/init/\/var\/log/g
:%s@/etc/sysconfig/init@/var/log@g
4. 删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#
:%s/^# \+//g
二 Find命令
1. 文件查找
locate: 非实时查找工具;依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新此数据库(updatedb);查找速度快;模糊查找;
find:实时查找;查找速度略慢;精确查找;
2.find命令:
find [OPTION]... [查找路径] [查找条件] [处理动作]
l 查找路径:默认为当前路径;
l 查找条件:指定的查找标准,可以根据文件名、大小、属主属组、类型等进行;默认为找出指定路径下的所有文件;
l 处理动作:对符合条件的文件做什么操作;默认为输出至屏幕;
3.查找条件:
1) 根据文件名进行查找:
-name "文件名称": 支持使用glob;
使用通配符:*, ?, []等实现模糊查找
-iname "文件名称":不区分字符大小写,支持使用glob;
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;
2) 根据属主、属组查找:
-user USERNAME: 查找属主为指定用户的文件;
-group GROUPNAME: 查找指定属组的文件
-uid UserID: 查找文件的属主指定uid的文件;
-gid GroupID: 查找文件的属组指定gid的文件
-nouser: 查找没有属主的文件;
-nogroup:查找没有属组的文件;
3)根据文件类型进行查找:
-type TYPE
f: 普通文件
d: 目录
l: 符号链接
b: 块设备
c: 字符设备
p: 命名管道
s: 套接字
4)组合查找条件:
与条件:-a(默认省略)
或条件:-o
非条件:-not, !
!A -o !B = !(A -a B)
!A -a !B = !(A -o B)
5)根据文件大小来查找:
-size [+|-]#UNIT
单位:k, M, G
#UNIT: (#-1,#]
+#UNIT: (#,+oo)
-#UNIT:[0,#-1]
6)根据时间戳:
以“天”为单位
-atime [+|-]# 读取时间(access),当文件的内容被读取时,列如使用cat读取某文件时
#:[#,#+1)
+#: [#+1,oo]
-#: [0,#)
-mtime 文件的“内容数据”更改时间
-ctime 文件的“状态”(status)改变时间,列如:权限、属性
以“分钟”为单位
-amin
-mmin
-cmin
7)根据权限:
l -perm [/|-]MODE
l MODE: 精确权限匹配
l /MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;
l -MODE:每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;
l +MODE:查找文件权限包含“任一mode的权限”的文件
4.处理动作:
l -print: 默认处理动作
l -ls:类似于对查找到的每个文件做"ls -l"的操作;
l -delete: 删除查找到的文件;
l -fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;
l -ok COMMAND {} \;对每个文件执行指定的命令之前需要用户事先确认;
l -exec COMMAND {} \;无需用户确认;
1、查找/var目录属主为root,且属组为mail的所有文件;
find /var -user root -groupmail
2、查找/usr目录下不属于root、bin或hadoop的所有文件;
# find /usr ! \( -user root -o -user bin -o-user hadoop \) -ls
3、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
find /etc -mtime -7 -a !#find /etc -mtime -7 -a ! \( -user root -o -user hadoop \) -ls
4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
# find / \( -nouser -o-nogroup \) -atime -7 -ls
5、查找/etc目录下大于20k且类型为普通的所有文件;
# find /etc -size +20k -typef
6、查找/etc目录下所有用户都没有写权限的文件;
# find /etc ! -perm +222 -ls
7、查找/etc目录下至少有一类用户没有执行权限的文件;
# find /etc -perm -111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
# find/etc/init.d -perm -112
三 bash环境配置
1.配置文件分类
1) 按生效范围划分
全局配置:
etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
2) 按功能划分
profile类:为交互式登录的shell提供配置
/etc/profile,/etc/profile.d/*.sh
~/.bash_profile
功用:
(1) 定义环境变量,例如PATH、PS1
(2) 运行命令或脚本
bashrc类:为非交互式登录shell提供配置
/etc/bashrc
~/.bashrc
功用:
(1) 定义命令别名;
(2) 定义本地变量;
2.变量
2.1变量:
内存空间,变量名
2.2变量作用范围:
环境变量:作用范围当前shell进程及其子进程
本地变量:作用范围当前shell进程
局部变量:作用范围仅为当前shell进程中某代码片断(通常为函数上下文)
位置变量:$1,$2(向脚本传递参数)
特殊变量:$?
2.3变量定义方式:
bash内置变量:可直接调用,内置了许多环境变量,例如PATH等
自定义变量:用户定义名字,bash分配内存空间
变量赋值:变量名=值
2.4 因为bash是弱类型的编程,所以变量存储数据时,默认均采用字符串形式(每个字符需要1个字节);任何变量可以不经声明,直接引用;
2.5定义本地变量:
name=value
查看:set
2.6定义环境变量:
export name=value
declare-xname=value
查看:env, printenv,export
2.7撤消变量:unset name
2.8引用变量:${name}
示例:
2.9 bash中的引用符号:
''(单引号): 强引用,变量替换不会发生
""(双引号):弱引用,会发生变量替换
二者区别:
``(反引号): 命令引用 例如:#ls -l `which cat`
3 shell登录类型
3.1交互式登录:
直接通过终端进行的登录;
通过su -l Username命令实现的用户切换;
3.2非交互式登录:
图形界面下打开的命令行窗口;
执行脚本;
suUsername;
3.3配置文件作用次序:
1)交互式登录:
/etc/profile -->/etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
2)非交互式登录:
~/.bashrc -->/etc/bashrc --> /etc/profile.d/*.sh
3.4新配置文件定义的生效
(1) 重新登录;
(2) 让当前shell进程去重新读取指定的配置文件;
source/PATH/TO/SOMEFILE
. /PATH/TO/SOMEFILE
四Linux文件系统的特殊权限
1.进程的安全上下文:
前提:进程有属主(进程以哪个用户的身份运行);文件有属主和属组;
(1) 用户是否能够把某个可执行程序文件启动为进程,取决于用户对程序文件是否拥有执行权限;
(2) 程序启动为进程后,此进程的属主为当前用户,也即进程的发起者;进程所属的组,为发起者的基本组;
(3) 进程拥的访问权限,取决其属主的访问权限:
(a) 进程的属主,同文件属主,则应用文件属主权限;
(b) 进程的属主,属于文件的属组,则应用文件属组权限;
(c) 否则应用其它权限;
2.SUID:
(1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否有执行权限;
(2) 启动为进程之后,其属主不是发起者,而程序文件自己的属主;这种机制即为SUID;
(3)权限设定:
chmod u+sFILE...
chmod u-sFILE...
注意:
s:属主原本拥有x权限;
S:属主原本无x权限;
3.SGID:
默认情况下,用户创建文件时,其属组为此用户所属的基本组;
一旦某目录被设定了SGID权限,则对此目录拥有写权限的用户在此目录中创建的文件所属的组为目录的属组,而非用户的基本组;全局可写
权限设定:
chmodg+s FILE...
chmodg-s FILE...
4.Sticky:
对于一个多人可写的目录,此权限用于限制每个仅能删除自己的文件;
权限设定
chmodo+t FILE...
chmodo-t FILE...
SUID,SGID, STICKY对应4,2,1
1.让普通用户能使用/tmp/cat去查看/etc/shadow文件;
2.创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;
1)创建目录
#mkdir -p /test/data #ll -d /test/data drwxr-xr-x.2 root root 4096 Sep 8 05:51 /test/data
2)创建组, 让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组
#groupadd mage #chgrp mage /test/data #chmod 775 /test/data/
添加sgid属性
#chmod g+s /test/data
此时用户创建的文件都属自已的属组
3)每个用户仅能删除自己的文件
#chmod o+t /test/data #usermod -G mage centos #usermod -G mage lan
4)结果