第四章 vi/vim
1. 打开、关闭文件
vim [option] filename +n:光标定位到第n行 +/henry:光标到第一个匹配到的行首 -m:只读方式打开 -e:直接进入扩展命令行模式 -b:以二进制方式打开
:q # 退出 :q! # 不保存,强制退出 :w # 保存 :wq # 保存退出 :wq! # 强制的保存退出 :x # 保存退出
ZZ # 保存退出
ZQ # 不保存退出
2. 模式的切换和操作
-
命令模式:打开后的默认模式
-
-
扩展命令模式(末行模式):保存或退出等
-
可视化模式:配合鼠标使用
1. 命令模式和插入模式
-
命令模式进入插入模式
-
-
I 在当前行的行首位置开始插入
-
a 在光标的后面开始插入
-
A 在当前行的行尾位置开始插入
-
o 在当前光标所在行的下方打开一个新行
-
-
回到命令模式:
2. 命令模式和扩展命令模式
-
从命令模式进入扩展命令模式
: # shifit + :
- 命令模式的操作
:w # 保存文件到磁盘 :r filename # 读入filename,在cursor的下一行插入其内容 :w filename # 另存为 :! command # 执行终端命令 :r! command # cursor下一行插入执行结果
3. cursor光标移动
-
-
l 右移动
-
j 往下移动
-
k 往上移动
-
#
w 下一个单词的词首 e 当前单词或者下一个单词的词尾 b 当前单词或者上一个单词的词首 \# command 多个单词之间进行跳转
gg 回到第一行 1G 回到第一行 G跳转到最后一行 扩展命令模式下:# 跳转到对应的#行 #G 跳转到指定的#行
{ # 上一段 } # 下一段 [[ # 文本开头 ]] # 文本结尾
ctrl + f # 下一屏 ctrl + d # 下半屏 ctrl + u # 上半屏 ctrl + b # 上一屏
4. 命令行的操作
1.字符编辑
nx # 删除cursor之后的文本(n个字符,默认一个) xp # 两个字符交换位置 p # 黏贴到cursor所在后一个字符后 ~ # 大小写转化 nJ # 合并下 n 行,删除下 n 行换行符 rx # 用 x 替换cursor所在位置后的单个字符 R # 切换为 Replace 模式,可以连续替换
dl # 删除右边的一个字符,根据cursor移动删除 d0 d$/D 3dd # 删除当前行和下2行 d^ # 从cursor位置删除到当前行第一个非空字符 dw # 删除一个单词 de # 删除到当前单词或下一个单词词尾 db # 删除到当前单词或上一个单词词首 dG # 删除到文件行尾 dgg # 删除到文件行首
y$ # 结合cursor跳转使用 5yy # 复制5行 p # 粘贴到cursor位置(类似a),如果是整行则粘贴到下一行 P(大写) # 粘贴到cursor位置前,如果是整行则粘贴到上一行
-
-
y$
-
y0
-
y^
-
yw
-
ye
-
yb
-
yG
-
ygg
-
yy 复制整行
-
cw # 结合cursor跳转使用 cc # 删除整行,并进入insert模式 ncc # 删除 n 行 c$/C
c$
c0
c^
cb
ce
cw
#
cc 删除当前行并且输入新内容
#cc 删除#行,并切换到插入模式
- 插入n次henry
nihenry # 插入n个henry
- 撤销u:最近的更改
nu # 撤销之前的 n 次更改 U # 撤销当前行的更改 ctrl+r # 撤销 撤销 3.
-
-
#u 撤销之前的#次更改
-
U 撤销光标所在行的关于此行操作
-
ctrl+r 重做最后的操作,撤销撤销
-
. 重复前一个操作
-
/pattern # 向下搜索指定pattern ?pattern # 向上搜索指定pattern n # 和搜索命令相同方向跳转cursor N # 和搜索命令相反方向跳转cursor
- 粘贴
p 如果是整行,则粘贴到当前所在行的下面,否则,则粘贴到光标所在位置的后面
P 如果是整行,则粘贴到当前行所在的上面,否则,则粘贴到光标所在位置的前面
5. 扩展的命令模式补充
### ```SHELL :start,end # 从start行到end行 :start,+n # 从start行到 start+n 行 :2,5 # 2-5行 :2,+5 # 2-7行 :n # 具体到第n行 :. # 当前行 :$ # 最后一行 :$-2 # 倒数第 $-2 行 :% # 全部 :n,/pattern/ # 从第n行到第一次pattern匹配行 :/pat1/,/pat2/ # 从第一次pat1匹配行到第一次pat2匹配行 :/pattern/,n # 从第一次pattern匹配行到第 n 行 ``` ###
:/pattern/,n w newfile :4 r b # 在第4行,插入 d # 删除 y # 复制 w newfile # 将指定范围内的文件另存为 r filename # 将文件内容插入指定位置
3. 查找替换
-
:地址定位符s/pattern(正则)/替换的内容/装饰器
-
查找的内容可以使用正则表达式和分组,替换的内容可以引用,即\1, \2 等
-
也可以使用&代替查找的内容(不需要分组)
# 替换第一个匹配字符 :%s/s..c/abc # 使用向后引用,正则的分组 :%s/\(sy.c\)/abc\1/
-
装饰器
-
i:忽略大小写
-
g:全部替换
-
gc:替换之前要确认(y 确认,n 跳过,a 全部,l,...)
-
/ 可以作为替换成别的分隔符:@ #
-
6. 其他操作
1. 可视化模式
-
配合移动键使用
-
-
v:面向字符
-
V:面向行
-
ctrl + v:面向块
# 批量加入注释 1. ctrl + v 2. 移动光标选中需要注释的行 3. 按下 I 并输入注释 4. esc结束
-
保存之后再切换否则更改的内容会丢失
vim f1 f2 f2 # 打开多个文件 :next # 切换下一个文件 :prev # 切换下一个文件
:last #最后一个 :first #第一个 # 退出 :wqall :wall :qall
3. 使用多个窗口
-
多个文件
vim -o f1 f2 f3 # 水平分屏 vim -O f1 f2 f3 # 垂直分屏 ctrl + w(hjkl) # 切换窗口
- 单个文件
ctrl + w, s # 水平分屏 ctrl + w, v # 垂直分隔 ctrl + w,hjkl # 跳转 ctrl + w, q # 取消相邻的屏幕 ctrl + w, o # 取消全部窗口
4. 定制vim
-
-
当前用户配置文件:~/.vimrc
-
-
添加行号 set nu 取消 set nonu
-
搜索时忽略大小写 set ic 取消set noic
-
自动缩进(与上一行对其) set ai 取消 set noai
-
搜索高亮 set hls 取消 set nohls
-
语法高亮 syntax on 关闭 syntax off
-
设置光标所在的行的标识符 set cul 取消 set nocul
-
-
:set nu # 设置行号 :set nonu # 取消行号 :set ic # 忽略大小写,搜索 :set noic :set ai # 自动缩进,与上一样对齐 :set noai :set hls # 搜索高亮 :set nohls :syntax on # 语法高亮 :syntax off :set cul # 设置光标所在行的标志符(下划线) :set nocul :set all # 获取帮助
- 文件转换
# 转换为 windows 格式 :windows set fileformat=dos# 转换为 Linux/unix :linux set fileformat=unix
5. vim帮助信息
-
:help :help topic
-
vimtutor
-
5. 搜索
1. find
1. 用法
-
find [option]... [查找路径][查询条件][处理动作]
-
查找路径:可以指定目录,默认当前目录
-
查找条件:用来指定文件查找的标准,文件名、大小、权限、类型等
-
处理动作:对符合条件文件进行的操作,默认直接输出到屏幕
2. 查找条件
1. -name:可以配合通配符使用
-
文件名:完全匹配
-
# 使用名称查找,文件目录和文件只要符合都可以 find . -name a.txt # 完全匹配 find -name a\? # 所有以a开头后面有一个字母的文件或文件夹 find -name a\* # 所有以a开头的文件或文件夹 find -anme 'a*' # 所有以a开头的文件或文件夹 find -anme a[ab] # 以a开头,后面字母是a/b的文件或文件夹
find -iname a # 忽略大小写
3. -maxdepth/-mindepth
-
指定查找深度,搜索层数,指定目录为第一层
find -maxdepth 2 -name a # 最小层数, 包括第二层 find -mixdepth 2 -name a
4. -type:指定文件类型(7)
-
f:文件
-
-
l:链接
-
s:套接字
-
b:块设备
-
c:字符设备文件
-
p:管道文件
find -type f -name a find -type d -name a find -type l -name a find -type s /run -name * # 指定搜索层数 find -maxdepth 1 -type d # 搜索块文件,如:/dev/sda find / -type b -ls # 搜索字符文件 find / -type c -ls # 搜索管道文件 find / -type p -ls
find -empty -type d # 查找所有空目录
find -user henry
find -group henry
7. -uid/-gid:uid或gid的文件和目录
id henry # 查看用户uid find -uid 1000 find -gid 1000
8. -nouser/-nogroup:没有属主的
-
linux通过uid进行识别用户
find / -nouser # 用户被删除时,属主变成数字表示没有属主 find / -nogroup
9. 组合条件
-
-
或:-o
-
非:-not / !
-
摩根定律
-
非A或非B=非(A 且 B)
-
非A且非B=非(A 或 B)
-
find -type f -o -nouser find -not -user henry -a -not -user dean ll find -not \( -user henry -o -not -user dean \) -ll
# 排除指定目录下的其他文件 find -path "./*a1" -prune -o -print # 以下命令等效 find -path "./*a1" find -path "./*a1" -prune -a -print find -path "./*a1" -prune -not -print
-
-n:[0, n-1]
-
n:查找在大小在(n-1 n ] 的文件且不等0的文件
-
+n:(n, )
-
c:字节,K:kb,M:mb,G:gb
find -size 1c/K/M/G # 生成 1M 文件 dd if=/dev/zero of =ccc bs=1M count=1 ll ccc # 查找文件大小在[0, 1]的文件和目录 find -size -2M # 查找文件大小在(1, 2]的文件和目录 find -size 2M # 查找文件大小在(2,...)2M以上的文件和目录 find -size +2M
12. 文件时间戳
-
-
atime [+|-]/ mtime / ctime
-
time:[time,time+1)时间为 time 天到 time+1 天之间的文件
-
+time:[time+1….]
-
-time:[0, tim)
-
-
以分钟为单位(和天一样)
-
-amin
-
-mmin
-
-cmin
-
# 查找访问时间为[0, 1)天内的文件和目录 find -atime -1 -ls # 查找访问时间为[1,2)天内的文件和目录 find -atime 1 -ls # 查找访问时间为[2,....),2天以上的文件和目录 find -atime +1 -ls
# 普通文件一般为 find -perm 644 -ls # 软链接为 777 find -perm 777 -ls
3. 处理动作(5)
-
把搜索结果打印到屏幕上
find -perm 644 -print
find -perm 644 -ls
find -perm 644 -delete
# 将查找结果写入到文件中 find -perm 644 -fls ls.txt
5. -ok/exec command {} \;
-
对查找到的文件执行 command 命令
-
{}:表示搜索到的内容
-
\; :为固定格式
-
ok:需要确认,exec:不需要确认
-
find传递内容时一次性传递的
# 需要确认 find -perm 644 -ok rm -rf {} \; # 不需要确认 find -perm 644 -exec rm -rf {} \;
-
xargs:可以将命令的输出,一个个交给管道之后的命令
-
解决好多命令不支持管道,但工作中会用到的问题
-
有些命令不支持太多字符,也可以使用xargs
touch a{1..1000000} echo a{1..1000000}|xargs touch find -name * | xargs ls -l ls a* | xargs rm -f
-
从文件中查找符合条件行,使用正则时需要对 +、 ?、 {、 }、 (、 )
-
Global search REgular expression and pring out the line,全局用正则搜索,并打印符合条件行
-
三剑客:grep、sed、awk,用于处理文本,都可以使用正则
1. 用法
-
gerp [option]… pattern [filename]
# 只要行内容包行 pattern 整行就会被输出 grep 'root' /etc/passwd
-
--color=auto
-
alias grep = 'grep --color'
-
将匹配到的文本添加颜色显示
-
-
-v:取反
-
-i:忽略大小写
-
-n:显示匹配行行号
-
-c:显示匹配的行数
-
-o:显示匹配的字符串
-
-q:静默模式,不输出内容,判断执行是否成功,echo $?
-
-A n:输出匹配和后 n 行
-
-B n:输出匹配和前 n 行
-
-C n:输出匹配和前后 n 行
-
-e:或关系
-
-E:扩展正则表达式
-
-r:递归查找,用于在目录中查找
# 显示没有匹配到的行 grep -v 'root' /etc/passwd grep -q 'root' /etc/passwd # $?上次命令结果的返回值,成功表示0,不成功为非0(1-255) echo $? # 输出匹配行以及其下 2 行 grep -nA 2 'root' /etc/passwd # 输出匹配行以及其上 2 行 grep -nB 2 'root' /etc/passwd # 输出匹配行以及前后 2 行 grep -nC 2 'root' /etc/passwd # 或者 grep -e 'root' /etc/passwd -e 'mail' /etc/passwd # 递归查找 grep -r 'root' /etc/
4. 正则
-
注意和文件通配符区分
1. 字符匹配(9)
-
.:任意
-
[abc]:abc的一个
-
[^abc]:取反
-
[:alpha:]:字母
-
[:upper:]:大写字母A-Z
-
[:lower:]:小写字母a-z
-
[:digit:]:数字
-
[:alnum:]:数字字母
-
[:punct:]:标点
grep "[[:alnum:]]*" b grep "\W*" b grep "a*.c" b abc ac bc dc ...
2. 量词
-
*
:任意次,默认时贪婪匹配 -
?:0 或 1次,使用时需要转义 \?
-
+
:至少1次,使用时需要转义 -
{n}:匹配n次,使用时需要转义
\{n\}
-
{m, n}:匹配n次,使用时需要转义
\{m, n\}
-
{,n}:至多n次,使用时需要转义
\{,n\}
grep "a\?c" b grep "a\+c" b
-
^:开头
-
$:结尾
-
^$:空行
grep "^$" b
4. 向后引用
-
\1:表示前面第一个分组的引用
grep "\(.\+\) is \1" b grep "\(l..e\).*\1" b # 外边的是1,里面的是2分组 grep "\(l(..)e\).*\1\2" b
5. egrep
-
egrep = grep -E
-
# 以下写法等价 grep -E "(l..e).*\1" b egrep "(l..e).*\1" b
6.压缩和归档
1. gzip
1. 用法
-
gzip [option]… [file]...
2. 参数
-
-c:保留源文件,必须指定导出路径
-
-d:解压
-
-9:指定压缩比为 9,默认为9, 范围[1-9]
# 删除源文件压缩 gzip /etc/passwd # 解压zip包,默认删除压缩包 gunzip /etc/passwd.gz # 解压,删除压缩包 gzip -d /etc/passwd.gz # 压缩,解压保留原文件 gzip -c /etc/passwd.gz > /etc/passwd gzip -dc /etc/passwd.gz > /etc/passwd # 值越大,压缩比越大 gzip -9 /etc/passwd gzip -1 /etc/passwd # 查看压缩包,可以输出到一文件,即变相解压 zcat /etc/passwd.gz > /etc/passwd
2. bzip2
参数
-
-k:保留源文件
-
-d:解压缩
-
-9:指定压缩比
bzip2 /etc/passwd # 指定压缩比默认9 bzip2 -9 /etc/passwd bzip2 -d /etc/passwd.bz2 bunzip2 /etc/passwd.bz2 # 保留源文件 bzip2 -k /etc/passwd.bz2 # 查看bz2文件 bzcat /etc/passwd.bz2
-
生成 .xz 文件
1. 参数
-
-k:保留源文件
-
-d:解压
-
-9:指定压缩比
xz /etc/passwd xz -d /etc/passwd.xz unxz /etc/passwd.xz # 指定压缩比为 9 xz -9 /etc/passwd # 查看.xz 文件 xzcat /etc/passwd.xz
2. tar 归档
-
-
参数 - 可省略
1. 参数
-
c:创建
-
v:显示过程
-
f:指定文件
-
r:追加
-
x:解包
-
-C:指定解压位置
-
z:使用 gzip 压缩
-
j:使用 bzip2 压缩
-
J:使用 xz 压缩
-
--exclude=filename
:排除指定文件
# 打包 tar cvf a.tar b c # 追加 d 到 a.tar tar -r -f a.tar d # 使用 gzip 压缩,和解压 tar zcvf a.tar.gz f1 f2 f3 tar zxvf a.tar.bz # 使用 bzip2 压缩,和解压 tar jcvf a.tar.bz f1 f2 f3 tar jxvf a.tar.bz # 使用 xz 压缩,和解压 tar Jcvf a.tar.xz f1 f2 f3 tar Jxvf a.tar.xz # 不指定压缩格式的解压, 默认解压到当前目录 tar xvf a.tar.xz tar xf a.tar -C /opt # 排除指定文件 tar zcf etc.tar.gz --exclude=/etc/yum.repos.d --exclude=yum.conf /etc/
2. split 分卷压缩
-
只能压缩文件
1. 用法
`split -b size filename -d tarfile`
`cat tarfile* > tarfile`
2. 参数
-
-
-d:指定数字为后缀,默认是字母
# 大文件切分压缩 split -b 1M b -d b.tar.gz # 合并 cat b.tar.gz0* > b.tar.gz
1. motd
-
message of the day
-
登录提示内容
-
/etc/motd
2. 用户
1.用户分类
-
root:id为 0
-
普通用户:
-
系统用户:一般情况下启动服务或者运行进程,不可以登录,id 为 1-999/centos 7, 1-499/centos6。
-
可登录用户:可以登录系统的,1000-65535/centos7,500-65535/cenos6。
-
2. useradd
-
只能root用户执行
1. 参数(10)
-
-d:指定用户的家目录,默认在/home,不可以指定为 /temp 目录
-
-u:指定用户id
-
-g:指定用户的用户组,可以使用 gid / name
-
-G:指定用户的附加组
-
-M:不创建用户家目录
-
-N:不创建组,默认继承自 users
-
-r:创建系统用户,id 从1000依次递减
-
-s:指定用户登录后使用的 shell,/sbin/nologin(可以登录看到提示信息,会立马踢掉)
-
-D:显示默认配置(可以和 -b,-s,-g连用)
-
-b:修改默认的家目录
useradd echo useradd -d /opt/echo echo # gid:有且只能有一个,—G:指定附加组,可以有多个 useradd -G root,echo dean # 默认继承自, users useradd -N dean1 # 创建系统用户 useradd -r henry # 指定用户登录使用的shell useradd -s /sbin/nologin dean2 passwd dean2 # 给dean2 设置登录密码 # 如果不指定uid,则系统会找到最大的 uid 进行递增 useradd -u 3000 dean3 useradd dean4
- 修改默认配置
# 修改默认登录shell useradd -D -s /sbin/nologin # 修改默认的家目录 useradd -D -b /opt # 修改默认组 useradd -D -g 3000
cat /etc/default/useradd # 用户家目录的模版 ll -a /etc/skel/.
- 存放用户位置:/etc/passwd(7部分)
henry: x: 1000:1000:henry: /home/henry:/bin/bash
用户名 密码占位符 uid gid 描述信息 家目录 使用shell
3. usermod
-
-
-U:解锁用户
-
-m:移动家目录
-
-d:新的家目录,不会自己创建,要使用-m选项
-
-g:修改主组
-
-G:修改附加组
-
-a:追加附加组,需要和G一起连用
-
-l:改名
-
# 登录会进入 / 目录 usermod -d /usr/henry henry # -d 一般和 -m 连用 usermod -md /usr/local/henry henry # 追加附加组,需要和G一起连用 usermod -aG dean henry
4. userdel
-
-r:删除用户以及家目录和mail pool
# 删除用户和家目录和mail pool userdel -r dean2
5. passwd
参数(9)
-
-
-l:锁定用户
-
-u:解锁用户
-
-e:强制用户下次登录时,修改密码
-
-x maxdays:密码最长有效期,默认是 day
-
-n mindays:密码最短有效期
-
-w days:提前通知用户密码到期时间
-
-i days:密码过期多少天禁用
-
-—stdin
passwd -i 7 dean # 用于脚本,自动修改,交互的内容获取不到 echo 'xxx' | passed --stdin username
6. chage
-
-d:将密码修改时间设置为指定时间
-
-E:设置用户过期时间
-
-I:密码过期多长时间以后账户被禁用
-
-l:list用户密码策略
-
-m days:密码最多使用期
-
-M days:密码最长使用期
-
-W days:密码过期的警告天数
# 交互式更改用户密码策略 chage dean
-
用户名
-
密码
-
18106:从unix元年到密码最近一次修改的时间
-
0:密码最小使用期限
-
99999:密码最大使用期限
-
7:密码过期前提前 7 天通知用户,默认是 7 天
-
20:密码过期 20 天被锁定,
-
cat /etc/shadow # $6$ : sha-512,6表示加密方式,ahzn7peGcStDon3:加盐,剩下的为加密字符串 henry:$6$.ahzn7peGcStDon3$kI8HHtL5V0CHFS4VMb9.8yag5Qyq2a9CqjA3zyqFwnEHJYtzAOgDdDr7JzEiABusYOpZG.6BGvfyqjZvxABHk/:18106:0:99999:7:20::
7. su和sudo
1. su
-
su username,从root切换,不需要密码
-
su username # 完全切换,切换用户家目录和环境变量 su - username # 获取用户权限,执行命令 su - root -c 'useradd dean3'
-
/etc/sudoers
-
添加用户:henry ALL=(ALL) [NOPASSWD:]ALL
-
添加用户组:%wheel ALL=(ALL) [NOPASSWD:] ALL
-
(ALL):允许执行的命令
-
NOPASSWD:不需要输入密码
-
vim /etc/sudoers 添加:henry ALL=(ALL) ALL sudo useradd dean4
3. 用户组
-
gid取值和uid相同
-
root组:root ID为0
-
普通用户组
-
系统组
-
可登录用户组
-
2. groupadd(2)
1. 参数(2)
-
-g:指定gid
-
-r:指定系统组
groupadd oleg
cat /etc/group
-
/etc/group
-
/etc/gshadow
-
henry:组名
-
x:密码占位符
-
1000:gid
-
dean:以当前组为附加组的用户列表
# /etc/group henry:x:1000:dean # /etc/gshadow
3. groupmod(2)
-
-
-n:修改gname
groupmod -g henry 3000
groupmod -n henry henryboos
groupdel dean
-
用户名和密码
-
用户名和key
# 生成key ssk-keygen # 公钥和私钥,非对称加密 Your identification has been saved in /root/.ssh/id_rsa. # 公钥 Your public key has been saved in /root/.ssh/id_rsa.pub. +---[RSA 2048]----+ | .o+ | | .= . | | .. = o . | | . . .. = o + | | o o + .S O . | | + = = o@ o | | = B..=.* | | E+. +o+ | | .++ ++ | +----[SHA256]-----+ # copy公钥到远程服务器 ssh-copy-id root@ip # 直接登录,公加密私解密 ssh root@ip