1.vim编辑工具
Vim是一个类似于vi的著名的功能强大、高度可定制的文本编辑器,在vi的基础上改进和增加了很多特性。
可以理解为Windows的记事本,或Notepad++
今天我们学习了vim 的四种基本模式
为什么我们需要学习vim呢?
因为Linux一切皆文件,而我们工作中最多的就是修改某个服务的配置(其实就是修改文件的内容)
也就是说如果没有vi/vim 我们很多工作都无法完成。所以vim是学习Linux最重要的命令之一
如果Linux系统上没有安装vim 我们可以输入 yum install vim-common vim-enhanced 来安装
1.普通模式
主要ing是控制光标移动,可对文本进行复制、粘贴、删除等工作。
1.移动光标:跳转至整段的行尾:G(shift+g) 跳转到整段的行首:gg跳转光标本行的尾部:$跳转光标本行的首部:^
比如20gg: 就会跳转至20行;2.复制yy: 复制光标所在的行;nyy: 复制多行;
比如20yy:会复制当前光标和下面的20行 按p(P)进行复制
3.粘贴p(小写): 粘贴到光标所在行的下一行;P(大写):粘贴到光标所在行的上一行;
4.删除dd: 删除光标所在的行;3dd:删除多行;
20dd:会删除当前光标和下面的20行
D:删除光标所在行后的所有内容;x: 删除一个字符d+G:从头删到尾;
5.移动|剪贴:删除+粘贴=移动
5.替换r:替换某个字符; 光标选中对应的内容 --> r --> 新的内容;R: 连续替换;
6.撤销:u:撤销上一次的操作,可以连续使用(连续撤销);
2.编辑模式
从普通模式进入到编辑模式,然后可随意更改内容。
i: 进入编辑模式,光标不会发生变化; a: 进入编辑模式,光标会向后移动一位; o: 进入编辑模式,会在当前光标下一行插入一行空白的行;
I:进入编辑模式,移动到光标所在的行首; A:进入编辑模式,光标会移动到行尾; O:进入编辑模式,会在当前光标上一行插入一行空白的行;
编辑完成后,按Esc退回至普通模式
3.命令模式
从普通模式进入到命令模式 按 : 就可以进入
保存退出: :w : 保存 :q : 退出 :wq :保存并退出
:q! :退出,不保存任何修改; :wq! :强制保存,并退出 ( 操作的文件无权限时;)
替换(和sed一致): :1,5s#d#b#g # 明确指定替换1-5行中出现的所有的d,替换成b :%s#d#b#g # 搜索整个文件中,将d全部替换成b
搜索:/string:n:下翻N:上翻跳转::20快速跳转至20行;
4.视图模式
从普通模式进入试图模式,主要进行批量操作。
可视行(按行操作):shift+v: 选中需要的行;然后y;shift+v: 选中需要的行;然后d;
可视块(字符操作): 添加注释: 在最前面添加# 算注释; ctrl+v --> shift+i --> # -->Esc--->Esc 删除注释: ctrl+v --> shift+i --> x|d
扩展
1.在命令模式中我们可以临时用一些命令来打开文件的”显示行号“、”忽略大小写“等环境
:set nu 显示行号
:set ic 忽略大小写,在搜索的时候有用
:set ai 自动缩进
:set list 显示制表符(空行、tab键)
:set no[nu|ic|ai..] 取消临时设定的变量
2.如果希望”显示行号“、”忽略大小写“等;永久生效,则需要将内容写入配置文件中;
~/.vimrc 个人环境变量,针对当前用户(优先级高)
/etc/vimrc 全局环境变量,针对系统中所有用户
如果个人vim环境没有配置,则使用全局vim环境变量配置
如果个人vim环境和全局环境变量产生冲突,优先使用个人vim环境变量。
[root@zhang ~]# vim ~/.vimrc
输入
set nu
set ic
如果想使用高逼格的vimrc
https://www.cnblogs.com/zyos/p/9213878.html
3.vimdiff文件对比
相同文件之间差异的对比,通常用与对比修改前后差异
diff :文件对比
vimdiff :以vim方式打开两个文件对比,高亮显示不同的内容
当使用vim打开一个新的文件时,如果修改了文件内容,此时强制退出终端,则会造成异常现象;
#假设打开filename文件被意外关闭,需要删除同文件名的.swp文件即可解决
#rm -f .filename.swp
如果在编辑过程中,会话突然关闭了;我们可以将vim进程给挂起:Ctrl+z
2.文件属性
当我们使用ls -l 列出目录下所有文件时,通常会以长格式的方式显示,其实长格式显示就是我们windows下看到的文件详细信息,我们将其称为文件属性,那整个文件的属性分为十列。
[root@zhang ~]# ls -l 1.txt
-rw-r--r--. 1 root root 80 Jul 10 15:09 1.txt
-rw-r--r--. 1:第一个字符是文件类型,其他则是权限
1 2:硬链接次数
root 3:文件属于哪个用户
root 4:文件属于哪个组
80 5:文件大小
Jul 10 15:9 6:最新修改的时间与日期
1.txt 7:文件名称
3.文件类型
通常我们使用颜色或者后缀名称来区分文件类型,但很多时候不是很准确;
所以我们可以通过ls -l 以长格式显示一个文件的属性,通过第一列的第一个字符来近一步判断文件具体的类型。
文件类型说明
文件类型字母 | 类型含义 |
---|---|
- | 普通文件(文本,二进制,压缩,图片,日志等) |
d | 目录文件 |
b | 设备文件(块设备)存储设备硬盘/dev/sda,/dev/sr0 |
c | 设备文件(字符设备),终端/dev/tty1 |
s | 套接字文件,进程与进程间的一种通信方式(socket插座) |
l | 链接文件 |
但有些情况下,我们无法通过ls -l查看文件的类型,比如:一个文件,它可能是普通文件、也可能是压缩文件、或者是命令文件等,那么此时就需要使用file来更加精准的判断这个文件的类型
[root@zhang ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@zhang ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c5ad78cfc1de12b9bb6829207cececb990b3e987, stripped
[root@zhang ~]# file /dev/sda
/dev/sda: block special
Linux文件扩展名不代表任何含义,为了我们人能更好的识别该文件是什么类型
4.链接文件
4.1Inode与Block
文件有文件名与数据,在Linux上被分成两个部分:数据data与文件元数据 metadata
1.数据data block,数据块是用来记录文件真实内容的地方,我们将其称为block
2.元数据metadata,用来记录文件大小、创建时间、所有者等信息,我们将其称为Inode
3.需要注意:Inode 不包含文件名称,inode仅包含文件的元数据信息,具体来说有以下内容:
-
文件的字节数
-
文件的User ID Group ID
-
文件的读、写、执行权限
-
文件的时间戳
-
链接数,即有多少文件名指向这个inode
-
文件数据block的位置
每个inode都是一个编号,操作系统是通过inode来识别不同的文件。
对于系统来说,文件名只是inode便于识别的别名,或者绰号。(便于我们人识别)
对于系统来说,文件是通过文件名打开的文件,实际上系统内部这个过程分为如下三步:
-
首先,系统找到这个文件名对应的inode编号
-
其次,通过inode编号,获取inode信息
-
最后,根据inode信息,找到文件数据所在的block,读出数据。
4.2软链接
-
什么是软链接:软链接相当于windows的快捷方式;
-
软链接实现原理:
-
软链接文件会将inode指向源文件的block
-
当我们访问这个软链接时,其实访问的是源文件本身;
软链接场景实践
准备网站1.1版本
[root@zhang ~]# mkdir /data/rainbow-v1.1 -p
[root@zhang ~]# echo "123" > /data/rainbow-v1.1/index.html
创建软链接
[root@zhang ~]# ln -s /data/rainbow-v1.1/ /data/rainbow
[root@zhang ~]# ll /data/
total 0
drwxr-xr-x. 2 root root 38 Jul 7 19:10 job
lrwxrwxrwx. 1 root root 19 Jul 10 16:59 rainbow -> /data/rainbow-v1.1/
drwxr-xr-x. 2 root root 24 Jul 10 16:59 rainbow-v1.1
检查程序
[root@zhang ~]# cat /data/rainbow/index.html
123
更新一个新的网站版本
[root@zhang ~]# mkdir /data/rainbow-v2.1
[root@zhang ~]# echo "789" > /data/rainbow-v2.1/index.html
升级
[root@zhang ~]# rm -f /data/rainbow && ln -s /data/rainbow-v2.1/ /data/rainbow
[root@zhang ~]# cat /data/rainbow/index.html
789
回退
[root@zhang ~]# rm -f /data/rainbow && ln -s /data/rainbow-v1.1/ /data/rainbow
[root@zhang ~]# cat /data/rainbow/index.html
123
4.3硬链接
硬链接类似与超市多个门,无论从哪个门进入,看到的内容都是一样的。不会影响进入超市
回到系统中,我们对硬链接的解释:不同的文件名指向同一个inode,简单的说就是指向同一个真实的数据源。
软链接与硬链接的区别
-
In命令创建硬链接,In -s 命令创建软链接
-
目录不能创建硬链接,并且硬链接不可以跨越分区系统
-
软链接支持对目录创建,同时也支持跨越分区系统
-
硬链接文件与源文件的inode相同,软链接文件与源文件inode不同
-
删除软链接文件,对源文件及硬链接文件无任何影响
-
删除文件的硬链接,对源文件及链接文件无任何影响
-
删除链接文件的源文件,对硬链接无影响,会导致软链接失效
-
删除源文件及其硬链接文件,整个文件会被真正的删除
4.4文件时间
Linux下文件有3个时间的,分别是aime,mtime,ctime
简名 | 全名 | 中文名 | 含义 |
---|---|---|---|
atime | access time | 访问时间 | 文件中的数据最后被访问的时间 |
mtime | modify time | 修改时间 | 文件内容被修改的最后时间 |
ctime | change time | 变化时间 | 文件的元数据发生变化。比如权限,所有者等 |
先准备一个文件
[root@zhang ~]# echo "zhangdage" >>A.txt
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 10 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 100682097 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:35:23.176355498 +0800
Modify: 2021-07-10 17:35:23.176355498 +0800
Change: 2021-07-10 17:35:23.176355498 +0800
Birth: -
atime
[root@zhang ~]# cat A.txt
zhangdage
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 10 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 100682097 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:39:10.717346515 +0800
Modify: 2021-07-10 17:35:23.176355498 +0800
Change: 2021-07-10 17:35:23.176355498 +0800
Birth: -
访问时间会发生变化
mtime
[root@zhang ~]# echo "hello" >> A.txt
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 16 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 100682097 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:39:10.717346515 +0800
Modify: 2021-07-10 17:41:06.607341941 +0800
Change: 2021-07-10 17:41:06.607341941 +0800
Birth: -
内容被修改后,mtime会变化,ctime时间发生变化的原因是,内容变化了,inode所记录的大小也需要变化,所以时间发生了变化
ctime
[root@zhang ~]# chown adm A.txt
[root@zhang ~]# stat A.txt
File: ‘A.txt’
Size: 16 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 100682097 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 3/ adm) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-07-10 17:39:10.717346515 +0800
Modify: 2021-07-10 17:41:06.607341941 +0800
Change: 2021-07-10 17:43:22.675336569 +0800
Birth: -
修改文件属性后,只有ctime发生变化