一 vim
vi visual interface 全屏文本编辑器
行文本编辑器sed
全屏:vi/vim nano
vim = vi improved
模式:
编辑模式,命令模式
输入模式
末行模式
编辑模式--》输入模式
i insert,原地插入
a append,之后插入
o 新起一行插入
I 行首插入
A 行尾插入
O 当前行上方插入新行
输入模式--》编辑模式
按ESC键
编辑模式--》末行模式
按 :wq 保存退出
末行模式--》编辑模式
按ESC键,连按两次
vim 打开文件如果存在直接编辑,如果不存在会创建文件,路径必须正常
vim +n file 打开文件并路到第n行
+/PATTERN
:q
:q!
:wq 强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
:x 写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。
编辑模式下按ZZ会保存
光标跳转
字符间跳转
h j k l
左 下 上 右
每个跳转字符前面可以加数字,表示多个字符跳转
3h 向左跳3个字符
单词间跳转
w 跳到后一个单词的词首 符号被当作单独单词,_不当作单独单词
e 当前或后一单词的词尾
b 当前或前一单词的词首
前面加数字 ,可以多词跳转
行内跳转
^ 跳转至行首的第一个非空白字符
0 跳转到行首
$ 跳转到行毛
行间移动
#G 跳转到第#号
1G gg 跳转到第一行
G 跳转到最后一行
句间移动
) 跳到下一句 以各种符号分隔
( 跳到上一句
段落间移动
} 跳到下一段 以整行空白 分隔
{ 跳到上一段 以整行空白 分隔
编辑命令
字符编辑
x 删除光标所在处的字符
#x 删除光标所在处入之后的#个字符
xp 把光标所在外的字符和后面的字符对掉
r 替换所在处的字符
#r
删除命令
d 删除,可以跟光标跳转一起使用
d$ 删除光标位置 到行尾的字符
d^ 删除光标位置 到行首的字符
d0 删除光标位置 到行首的字符
dw 删除光标到下一词前的的全部字符(同时删除下一词前的符号)
de 删除光标到词尾的全部字符(不删除下一词前的符号)
db 删除光标到词首的全部字符,如果已经在词首,删除光标之前的整个词
dd 删除光标所在一整行
#dd 删除光标所在行及后面的#行
所有删除内容被VIM编辑器保存至缓冲区
粘贴命令
如果此前复制或删除内容不是一个完整行
p 粘贴到光标所在位置的后方
P 粘贴到光标所在位置的前方
如果此前复制或删除内容是完整行或多行
p 粘贴到光标所在行的下方
P 粘贴到光标所在行的上方
复制命令
y 复币
y$ 复制光标位置 到行尾的字符
y^ 复制光标位置 到行首的字符
y0 复制光标位置 到行首的字符
‘=
yw 复制光标到下一词前的全部字符
ye 复制光标到词尾的全部字符
yb 复制光标到词首的全部字符,如果已经在词首,复制光标之前的整个词
yy 复制整行
#y 复制#行
改变命令
c 删除--->剪切---->进入插入模式
c$ c^ c0
ce cw cb
cc
#c
撤销命令
u
#u
恢复撤消
ctrl+r
. 重复前一个操作命令
翻屏操作
ctrl+f 向后翻一屏
ctrl+b 向前翻一屏
ctrl+d 向后半屏
ctrl+u 向前半屏
vimtutor vim内置教程
末行模式
地址,定界 后面都可以跟编辑命令 d y w r
:start,end
#第#行
:5 光标跳到第5行
:100 光标跳到第100行
:100d 删除第100行
#,# 第#行到第#行
#,+#
:100,+3d 第100行后面的3行内容删除
. 当前行
$ 最后一行
:.,$-1d
% 1,$ 全文
:/part1/ 第一次被此模式所匹配的行
:/umask/
:#,/umask/
:/part1/,/part2/
查找功能
/PATTERN 从光标向尾部查找
?PATTERN 从光标向头部查找
n 与命令同方向查找下一个
N 与命令反方向查找下一个
查找替换
s 在末行模式下 在地址定界范围内完成查找替换操作
s/要查找的内容/替换为的内容/修饰符
查找的内容:可使用模式
替换的肉容:不能使用模式,可以使用后面引用符号
&引用要查找的内容匹配到的整个内容
修饰符
i 忽略大小写
g 全局替换
/:用于分隔符,要使用\对符号进行转义
:3,100s/pid/processid/g
:%s@/etc/fstab@/tmp/fstab@/g
:.,+20s/^# //g
多文件模式
vim file1 file2
:next 切换到下一个文件
:first 切换到第一个文件
:last 切换到最后一个文件
:prev 切换到前一个文件
:wqall 保存全部文件
:q!all 不保存全部文件 并退出
多文件窗口分割
vim -o file1 file2 水平分割
-O 垂直分割
ctrl+w+箭头
单文件窗口分割
ctrl+w+s 水平分割 按ctrl+w +方向切换窗口
ctrl+w+v 垂直分割 按ctrl+w +方向切换窗口
定制 vim
显示行号 :set nu
不显示行号 :set nonu
括号匹配 set sm
set no sm
自动缩进 set ai
set noai
高亮搜索 set hlsearch
set nohlserch
语法着色 syntax on
syntax off
忽略字符大小写 set ic
set noic
:help
vim 中文手册
vim /etc/vimrc vim的全局配置文件
/~/.vimrc vim的个人配置文件
二 文件查找
locate 文件查找,根据索引查找,新文件可能找不到 ,查找速度快 ,模糊查找
索引的构建是在系统空闲时自动进行(周期性任务) ,手动更新数据库(updatedb)
find 文件找查,实时查找,查找速度慢,精确查找
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径 默认为当前路径
查找条件 指定查找标准,可以根据文件名,大小,属主,类型等,默认指出指定路径下的所有文件
处理动作 对符合条件的文件做什么操作,默认输出到屏幕
查找条件
根据文件名进行查找
-name 文件名 支持使用glob
* ? []
-iname 文件名 不区分大小写,支持使用glob
-regex "PATTERN" 以PATTERN匹配整个文件路径字符串,不公公是文件名
find /tme -user centos find /tmp -user centos -ls find /tmp -group centos -ls
根据属主,属组查找
-user username
-group groupname
-uid useruid
-gid usergid
-nouser 没有属主的文件
-nogroup 没有属组的文件
根所文件类型查找
-type TYPE
f 普通文件
d 目录文件
l 符号连接文件
b 块设备
c 字符设备文件
p 命令管道
s 套接字文件
find /tmp -type s -ls
组合查找条件
非条件 -not,!
与条件 -a
或条件 -o
find -type f -a -nouser -ls find /tmp \( -nouser -o -user marion \) -ls find /etc ! -name "*.conf"
!A -o !B = !(A -a B)
!A -a !B = !(A -o B)
find /etc -not -name "a.conf" -a -not -type f -ls find /etc -not \( -name "a.conf" -o -not -type f ) -ls
根据文件大小查找
-size [+|-] #UNIT
单位 k M G
#UNIT (+-1,#]
+UNIT (#,+OO)
-UNIT [0,#-1]
find /etc -size -3k
以时间查找
以天为单位
-atime [+|-]n accessed n*24 hours ago
-mtime [+|-]n modified n*24 hours ago
-ctime [+|-]n changed n*24 hours ago
find /etc -mtime -3 -ls
以分钟为单位
-amin [+|-]n accessed n minutes ago
-mmim [+|-]n modified n minutes ago
-cmin [+|-]n changed n minutes ago
根据权限
-perm [/|-] MODE
MODE 精确权限匹配
/MODE 任何一类对像(u,g,o) 的任何一位权限符合即可,隐含或条件,三类条件中的任一符合都可以
-MODE 每一类对像(u,g,o)指定的每一位权限必须同时存大方或符合条件,隐含与条件。
find ./ -perm /222 -ls find ./ -perm -222 -ls
处理动作
-print :默认显示到屏幕
-ls
-delete
-fls /path/to/somefile
-ok COMMAND{} \; 对每个文件执行前要用户确认
-exec COMANND{} \; 对文件的执行无须用户确认
find ./ -perm -222 -exec ls -lh {} \; find ./ -perm -003 -exec chmod o-w {} \; find ./ -not -perm /111 -ls find ./ -not -perm /111 -exec mv {} {}.old \;
三 bash环境配置
man bash
配置文件
全局配置文件 /etc/profile /etc/profile.d/*.sh
/etc/bashrc
个人配置文件 ~/.bash_profile
~/.bashrc
Profile类
功用 定义环境变量
运行的命令或者脚本
bashrc类
功用 自定义命令别名
定义本地变量
pstree set env printenv export
unset 变量名 取消变量
$变量名 引用变量
'' 强制用,变量替换不会发生
"" 弱引用
`` 命令引用
ls -l `which cat`
shell登录类型
交互式登录
通过终端进行的登录
通过su -l 命令实现的用户切换
非交互式登录
图型界面下打开的命令行窗口
执行脚本
配置文件的作用次序 后面的优先级高于前面的优先级
交互式登录 :
/etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录
~/.bashrc--> /etc/bashrc --> /etc/profile.d/*.sh
编辑的配置文件定义生效方法
重新登录
让当前shell进程去重新读到指定的配置文件
source /path/to/somefile
./path/to/somefile
注意:副作用,每读取一次会把配置的内容附加到环境中,造成配置重复
四 Linux文件系统上的特殊权限
进程的安全上下文
进程有属组(进程以哪个用户的身份运行)
(1) 用户是否把某个可执行文件起动为进程,取决于用户对程序文件是否拥有执行权限
(2) 程序起动为进程后,此进程的属主为当前用户, 进程所属的组,为发起者的基本组
(3) 进程拥有的访问权限,取决其属主的访问权限
进程的属主同文件属主,应用文件属主权限
进程的属主属于文件的属组,应用文件属组权限
其它情况,应用其它权限
SUID 用户是否把某个可执行文件起动为进程,取决于用户对程序文件是否拥有执行权限
任何用户来执行该程序为进程时,该程序是程序的属主发起程序
chmod u+s /tmp/cat
注意
S 属主原来无x权限
s 属主原来有x权限
SGID 默认情况下,用户创建文件其属组为此用户所属的基本组
一旦某目录设置了SGID权限,则些目录拥有写权限的用户在此目录中创建的文件的组为目录的属组,不是创建用户的基本组。
chmod g+s /tmp/test/
注意
S 属组原来无x权限
s 属组原来有x权限
Sticky 对一个多个可写的目录,此权限用于限制每个用户仅能删除属主为自已的权限
chmod o+t file chmod o+t /tmp/test
SUID SGID STICKY
0 0 0
chmod 4777 file
五 Linux磁盘管理 和文件系统
识别硬盘 /dev/sd#
标记不同的硬盘设备 /dev/sd[a-]
标记同一设备上的不同分区 /dev/sd[a-z][1-]
1-4: 主或扩展分区标识
5+:逻辑分区标识
设备文件 特殊文件
设备号
major,minor
major 设备类型
minor 同一类型下的不同设备
块设备 标识为b 随机访问设备
字符设备 标记为c 线性设备
GPT
分区,分隔存储空间为多个小的空间,每个空间可独立使用文件系统
分区工具
fdisk parted sfdisk
fdisk 最多支持在一块硬盘上的15个分区
分区管理子命令
p: 显示
n: 创建
d: 删除
t: 修改分区ID
l: 列出所有支持ID类型
w: 保存退出
q: 放弃修改并退出
m: 获取帮助
创建完成之后,查看内核是否已经识别新的分区:
cat /proc/partitions
有三个命令可以让内核重读磁盘分区表:
CentOS 5: partprobe [DEVICE]
CentOS 6,7: partx kpartx
partx命令:
partx DEVICE
partx -a DEVICE
partx -a -n M:N DEVICE
M
M:
:N
kpartx命令:
kpartx -af DEVICE
partx -a -n 4:5 /dev/sda kpartx -af /dev/sda
文件系统管理
文件系统 VFS Virtual File System
Linux : ext2 ext3 ext4 btrfs swap
Unix : xfs ffs ufs jfs jfs2
光盘 : ISO9660
Win : fat32/vfat ntfs
网络文件系统 : net nfs cifs
集群文件系统 : ocfs2 gfs2
分布式文件系统: ceph moosefs mogilefs hdfs gfs glusterfs
日志型文件系统 ext3
非日志型文件系统 ext2
交换分区swap
创建文件系统
在分区上执行格式化(高级格式化)
要使用某种文件系统,满足两个条件:
内核中 支持此文件系统
用户空间 有文件系统管理工具
创建工具:mkfs (make filesystem) mkfs -t type DEVICE
mkfs.ext4
fsck
fsck.ext4
ext系列文件系统的专用管理工具:mke2fs -t ext2|ext3|ext4 DEVICE
blkid /dev/sda5 显示文件系统的详细信息
练习
6、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;
cp /etc/grub2.cfg /tmp/ vim /tmp/grub2.cfg :%s@^[[:space:]]@@g :1,$s/^[[:space:]]//g :%s/^[[:space:]]
7、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
cp /etc/rc.d/init.d/functions /tmp/ vim /tmp/functions :%s@^[[:space:]]@#&@g
8、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
vim /tmp/functions :%s@/etc/sysconfig/init@/var/log@g
9、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;
vim /tmp/functions :%s@^#\([[:space:]]\+\)@\1@g
10、查找/var目录属主为root,且属组为mail的所有文件;
find /var -user root -a -group mail -ls
11、查找/usr目录下不属于root、bin或hadoop的所有文件;
find /usr -not \( -user root -o -user wang -o user hadoop \) -ls
12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
find /etc -atime -7 -a -not \( -nouser -o -nogroup \) -ls
14、查找/etc目录下大于20k且类型为普通文件的所有文件;
find /etc -size +20k -a -type f -ls
15、查找/etc目录下所有用户都没有写权限的文件;
find /etc -not -perm /222 -ls
16、查找/etc目录下至少有一类用户没有执行权限的文件;
find /etc -not -perm -111 -ls
17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
find /etc/init.d -perm /111 -a -perm /002 -ls
18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;
cp /bin/cat /tmp chmod u+s /tmp/cat su - hadoop /test/cat shadow
19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;
mkdir -p /test/data chmod g+wrxs,o+wrxt /test/data or chmod 3777 data