Linux葵花宝典-无需自宫版

1. Linux简介

1.1 什么是Linux

Linux葵花宝典-无需自宫版_第1张图片

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由Linus Torvalds于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统

Linux 一般是指 Linux 内核、 Linux 系统、 Linux 发行版。严格意义上说 Linux 是指由 Linus Torvalds 维护的并发布的内核。它的代码只包括内核而不包括其它方面的应用。内核提供系统核心服务,如进程管理,进程的调度,虚拟文件系统,内存的管理等等。

1.2 Linux特点

  • 免费开源

    Linux是一款完全免费的操作系统,任何人都可以从网络上下载到它的源代码,并可以根据自己的需求进行定制化的开发,而且没有版权限制。

  • 模块化程度高

    Linux的内核设计分成进程管理、内存管理、进程间通信、虚拟文件系统、网络5部分,其采用的模块机制使得用户可以根据实际需要,在内核中插入或移走模块,这使得内核可以被高度的剪裁定制,以方便在不同的场景下使用。

  • 广泛的硬件支持

    得益于其免费开源的特点,有大批程序员不断地向Linux社区提供代码,使得Linux有着异常丰富的设备驱动资源,对主流硬件的支持极好,而且几乎能运行在所有流行的处理器上。

  • 安全稳定

    Linux采取了很多安全技术措施,包括读写权限控制、带保护的子系统、审计跟踪、核心授权等,这为网络环境中的用户提供了安全保障。实际上有很多运行Linux的服务器可以持续运行长达数年而无须重启,依然可以性能良好地提供服务,其安全稳定性已经在各个领域得到了广泛的证实。

  • 多用户,多任务

    多用户是指系统资源可以同时被不同的用户使用,每个用户对自己的资源有特定的权限,互不影响。多任务是现代化计算机的主要特点,指的是计算机能同时运行多个程序,且程序之间彼此独立,Linux内核负责调度每个进程,使之平等地访问处理器。由于CPU处理速度极快,从用户的角度来看所有的进程好像在并行运行。

  • 良好的可移植性

    Linux中95%以上的代码都是用C语言编写的,由于C语言是一种机器无关的高级语言,是可移植的,因此Linux系统也是可移植的。

1.3 Linux版本

内核版本

  • 内核版本:免费的,它只是操作系统的核心,负责控制硬件、管理文件系统、程序进程等,并不给用户提供各种工具和应用软件;

网址:https://www.kernel.org/

Linux葵花宝典-无需自宫版_第2张图片

Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字

  • 第一个组数字:目前发布的内核主版本。
  • 第二个组数字:偶数表示稳定版本;奇数表示开发中版本。
  • 第三个组数字:错误修补的次数。

用命令uname -a查看内核版本号

[root@localhost ~]# uname -a
Linux bogon 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
  • 第一个组数字:3, 主版本号
  • 第二个组数字:10, 次版本号,当前为稳定版本
  • 第三个组数字:0, 修订版本号
  • 第四个组数字:0-1160,表示发行版本的补丁版本
  • el7:则表示我正在使用的内核是 RedHat / CentOS 系列发行版专用内核
  • x86_64:采用的是64位的CPU

发行版本

  • 发行版本:以Linux内核为中心,再集成搭配各种各样的系统管理软件或应用工具软件组成一套完整的操作系统,如此的组合便称为Linux发行版。

Linux的发行版本可以大体分为两类:

  • 一类是商业公司维护的发行版本:以著名的Redhat(REHL)为代表;
  • 一类是社区组织维护的发行版本:以Debian为代表;

1) Red Hat Linux

Linux葵花宝典-无需自宫版_第3张图片

Red Hat(红帽公司)创建于 1993 年,是目前世界上资深的 Linux 厂商,也是最获认可的 Linux 品牌。

Red Hat 公司的产品主要包括 RHEL(Red Hat Enterprise Linux,收费版本)和 CentOS(RHEL 的社区克隆版本,免费版本)、Fedora Core(由 Red Hat 桌面版发展而来,免费版本)。

CentOS:是基于 Red Hat Enterprise Linux 源代码重新编译、去除 Red Hat 商标的产物,各种操作使用和付费版本没有区别,且完全免费。缺点是不向用户提供技术支持,也不负任何商业责任。有实力的公司可以选择付费版本。

2) Ubuntu Linux

Linux葵花宝典-无需自宫版_第4张图片

Ubuntu 基于知名的 Debian Linux 发展而来,界面友好,容易上手,对硬件的支持非常全面,是目前最适合做桌面系统的 Linux 发行版本,而且 Ubuntu 的所有发行版本都免费提供。

1.4 系统安装

发行版中不管是RedHat、CentOS还是Ubuntu,其内核都是来自Linux内核官网(www.kernel.org),不同发行版之间的差别在于软件管理的不同,所以不管使用哪一个发行版,只要理解其原理之后,各类发行版的区别其实不大。

这个理主要使用版本为7.9的CentOS

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

1.4.1 下载IOS文件

下载地址:https://wiki.centos.org/Download

  1. 官网下载地址

    CentOS Mirrors List

  2. 清华大学下载地址

    Index of /centos/7.9.2009/isos/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

  3. 阿里下载地址

    centos-7-isos-x86_64安装包下载_开源镜像站-阿里云

以阿里下载举例说明

step1: 进入阿里云站点,选择 CentOS-7-x86_64-DVD-1804.iso下载

各个版本的ISO镜像文件说明:

CentOS-7-x86_64-DVD-1708.iso 标准安装版(推荐)
CentOS-7-x86_64-Everything-1708.iso 完整版,集成所有软件(以用来补充系统的软件或者填充本地镜像)
CentOS-7-x86_64-LiveGNOME-1708.iso GNOME桌面版
CentOS-7-x86_64-LiveKDE-1708.iso KDE桌面版
CentOS-7-x86_64-Minimal-1708.iso 精简版,自带的软件最少
CentOS-7-x86_64-NetInstall-1708.iso 网络安装版(从网络安装或者救援系统

1.4.2 创建虚拟机

Linux葵花宝典-无需自宫版_第5张图片

1.4.3 典型类型的配置

Linux葵花宝典-无需自宫版_第6张图片

1.4.4 安装客户端操作系统

Linux葵花宝典-无需自宫版_第7张图片

1.4.5 命名虚拟机

根据自己喜欢命名

1.4.6 指定磁盘容量

一般20就差不多, 根据自己需求

1.4.7 开启此虚拟机

Linux葵花宝典-无需自宫版_第8张图片

1.4.8 选择语言

Linux葵花宝典-无需自宫版_第9张图片

1.4.9 等待安装完毕

设置root密码为:root,等待安装完毕

Linux葵花宝典-无需自宫版_第10张图片

1.5 帮助命令(man、help、info)

Linux系统中的命令是非常多的,约2600个命令。我们不可能记住每个命令的使用方法,以及各个参数的功能。但好在Linux给我们提供了帮助手册,供我们查看命令的详细使用说明。

内部命令:

内部命令指的是集成在Shell里面的命令,属于Shell的一部分。只要Shell被执行,内部命令就自动载入内存,用户可以直接使用,比如cd命令等。

外部命令:

考虑到运行效率等原因,不可能把所有的命令都集成在Shell里面,更多的Linux命令是独立于Shell之外的,这些就叫做外部命令,比如cp、ls等命令。每个外部命令都对应系统中的一个可执行的二进制程序文件。

1.5.1 使用 help

help只能获取Shell内置命令的帮助

  • 命令名称: help

  • 英文原意: help

  • 所在路径:Shell内置命令

  • 执行权限:所有用户

  • 功能描述:显示Shell内置命令的帮助。可以使用type命令来区分内置命令与外部命令

    shell是Linux的命令解释器

help 只能用于内部命令,不能用于外部命令。

例如:help cd --help 用于外部命令。例如:ls --help

使用type来查询命令属于外部的还是内部的

[root@localhost ~]# type cd
cd is a shell builtin     # 得到这样的结果说明是内建命令,正如上文所说内建命令都是在 bash 源码中的 builtins 的.def中
[root@localhost ~]# type vim
vim is /usr/bin/vim       # 得到这样的结果说明是外部命令,正如上文所说,外部命令在/usr/bin or /usr/sbin等等中
[root@localhost ~]# type ls
ls is aliased to `ls --color=auto'
[root@localhost ~]#       # 若是得到alias的结果,说明该指令为命令别名所设定的名称

1.5.2 使用 man

man得到的内容比用help更多更详细,而且man没有内建与外部命令的区分,因为man工具是显示系统手册页中的内容,也就是一本电子版的字典,这些内容大多数都是对命令的解释信息,还有一些相关的描述。

[root@localhost ~]#man [选项] 命令
选项:
    -f  查看命合拥有哪个级别的帮助
    -k  查看和命合相关的所有帮助

Linux葵花宝典-无需自宫版_第11张图片

使用上面这个命令时会发现最左上角显示“ LS (1)”,在这里,“ LS ”表示手册名称,而“(1)”表示该手册位于第一章节。

man手册中一共有以下几个章节:

1   普通用户可以执行的系统命令和可执行文件的帮助
2   内核可以调用的函数和工具的帮助 
3   C语言函数的帮助
4   设备和特殊文件的帮助
5   配置文件的帮助
6   游戏的帮助(个人版的Linux中是有游戏的)
7   杂项的帮助
8   超级用户可以执行的系统命令的帮助
9   内核的帮助

1 Standard commands (标准命令)
2 System calls (系统调用)
3 Library functions (库函数)
4 Special devices (设备说明)
5 File formats (文件格式)
6 Games and toys (游戏和娱乐)
7 Miscellaneous (杂项)
8 Administrative Commands (管理员命令)
9 其他(Linux特定的), 用来存放内核例行程序的文档。

1.5.3 使用 Info

得到的信息比 man 还要多,info 来自自由软件基金会的 GNU 项目,是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息。所以得到的信息当然更多

man 和 info 就像两个集合,它们有一个交集部分,但与 man 相比,info 工具可显示更完整的 GNU 工具信息。若 man 页包含的某个工具的概要信息在 info 中也有介绍,那么 man 页中会有“请参考 info 页更详细内容”的字样。

2. Linux文件管理

2.1 文件目录的层级结构

为了方便管理文件和目录,Linux 系统将它们组织成一个以根目录 / 开始的倒置的树状结构。Linux 中的目录,和 Windows 系统中的文件夹类似,不同之处在于,Linux 系统中的目录也被当做文件看待。

在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构,如图所示:

Linux葵花宝典-无需自宫版_第12张图片

其中,目录就相当于 Windows 中的文件夹,目录中存放的既可以是文件,也可以是其他的子目录,而文件中存储的是真正的信息

为了方便管理和维护,Linux 系统采用了文件系统层次标准,也称为 FHS 标准,它规定了根目录下各个目录应该存在哪些类型的文件(或子目录)

[root@linux30 ~]# cd /
[root@linux30 /]# ls -l
总用量 24
lrwxrwxrwx.   1 root root    7 9月   6 15:40 bin -> usr/bin ## 常见的用户命令
dr-xr-xr-x.   5 root root 4096 11月  9 13:33 boot  ## 内核和启动文件
drwxr-xr-x.  20 root root 3240 12月 20 16:15 dev  ## 设备文件
drwxr-xr-x.  88 root root 8192 12月 20 16:15 etc  ## 系统和服务的配置文件
drwxr-xr-x.   7 root root   77 12月 20 09:43 home  ## 系统默认的普通用户的家目录
lrwxrwxrwx.   1 root root    7 9月   6 15:40 lib -> usr/lib  ## 系统函数库目录
drwxr-xr-x.   2 root root    6 4月  11 2018 media  ## 系统用来挂载光驱等临时文件系统的挂载点
drwxr-xr-x.   3 root root   18 11月  9 09:29 mnt  ## 系统加载文件系统时常用的挂载点
drwxr-xr-x.  11 root root  162 11月 15 10:19 opt  ## 第三方软件安装目录
dr-xr-xr-x. 138 root root    0 12月 20 16:14 proc  ## 虚拟文件系统
dr-xr-x---.  13 root root 4096 12月 16 22:57 root  ## root用户的家目录
lrwxrwxrwx.   1 root root    8 9月   6 15:40 sbin -> usr/sbin ## 存放系统管理命令
drwxrwxrwt.  16 root root 4096 12月 20 16:15 tmp  ## 临时文件的存放目录
drwxr-xr-x.  13 root root  155 9月   6 15:40 usr  ## 存放和用户直接相关的文件和目录
[root@linux30 /]#

2.2 绝对路径及相对路径

1)绝对路径

Linux系统采用了目录树的文件组织结构,在Linux下每个目录或文件都可以从根目录处开始寻找,比如:/usr/local/src目录。这种从根目录开始的全路径被称为“绝对路径”,绝对路径一定是以“/”开头的。

2)当前目录:pwd

[root@linux30 ~]# pwd
/root
[root@linux30 ~]#

3)特殊目录:(.)和(…)

在每个目录下,都会固定存在两个特殊目录,分别是一个点(.)和两个点(…)的目录。一个点(.)代表的是当前目录,两个点(…)代表的是当前目录的上层目录。在Linux下,所有以点开始的文件都是“隐藏文件,对于这类文件,只使用命令ls -l是看不到的,必须要使用ls -la才可以看到

[root@linux30 ~]# ls -l
总用量 4
-rw-------. 1 root root 1440 9月   6 15:43 anaconda-ks.cfg
drwxr-xr-x. 5 root root   53 10月 21 17:49 logs
drwxr-xr-x. 4 root root   34 10月 25 15:47 nacos
[root@linux30 ~]# ls -la
总用量 76
dr-xr-x---. 13 root root  4096 12月 16 22:57 .
dr-xr-xr-x. 18 root root   236 9月  29 15:34 ..
-rw-------.  1 root root  1440 9月   6 15:43 anaconda-ks.cfg
drwxr-xr-x.  3 root root    32 10月 21 17:49 .arthas
-rw-------.  1 root root 17993 12月 20 16:14 .bash_history
...
[root@linux30 ~]#

4)相对路径

顾名思义,“相对路径”的关键在于当前在什么路径下

[root@linux30 ~]# cd /mnt/  ##现在进入/mnt目录
[root@linux30 mnt]# ls -la
总用量 0
drwxr-xr-x.  3 root root  18 11月  9 09:29 .  ## 代表当前目录
dr-xr-xr-x. 18 root root 236 9月  29 15:34 ..  ## 代表上层目录
drwxr-xr-x.  2 root root   6 11月  9 09:29 hgfs
[root@linux30 mnt]# cd .  ## 进入当前目录
[root@linux30 mnt]# pwd  ## 显示当前目录
/mnt
[root@linux30 mnt]# cd ..  ## 进入当前目录的上层目录
[root@linux30 /]# pwd
/
[root@linux30 /]#  ## 进入了上层目录,也就是/目录中

2.3 文件的相关操作

创建、删除、移动、重命名、查看文件,以及不同系统之间进行格式转换。

1)创建文件:touch

Linux葵花宝典-无需自宫版_第13张图片

如果在使用touch命令创建文件的时候,当前目录中已经存在了这个文件,那么这个命令不会对当前的同名文件造成影响,因为它并不会修改文件的内容,虽然实际上touch确实对该文件做了“修改”—它会更新文件的创建时间属性。

Linux葵花宝典-无需自宫版_第14张图片

2)删除文件:rm

[root@linux30 tmp]# rm test.txt
rm:是否删除普通空文件 "test.txt"?y
[root@linux30 tmp]#

Linux葵花宝典-无需自宫版_第15张图片

3)移动或重命名文件:mv

[root@linux30 tmp]# mkdir src dest ## 创建src和dest目录
[root@linux30 tmp]# ll
总用量 4
drwxr-xr-x. 2 root root    6 12月 20 16:46 dest
drwxr-xr-x. 2 root root    6 12月 20 16:46 src
[root@linux30 tmp]# cd src/ ## 进入src目录
[root@linux30 src]# ll
总用量 0
[root@linux30 src]# touch test.txt  ## 创建test.txt文件
[root@linux30 src]# ll
总用量 0
-rw-r--r--. 1 root root 0 12月 20 16:46 test.txt
[root@linux30 src]# mv test.txt ../dest/  ## 移动test.txt文件到dest目录
[root@linux30 src]# ll
总用量 0
[root@linux30 src]# cd ../dest/  ## 进入dest目录
[root@linux30 dest]# ll
总用量 0
-rw-r--r--. 1 root root 0 12月 20 16:46 test.txt
[root@linux30 dest]# mv test.txt test2.txt  ## 重命名test.txt -> test2.txt
[root@linux30 dest]# ll
总用量 0
-rw-r--r--. 1 root root 0 12月 20 16:46 test2.txt
[root@linux30 dest]#

4)查看文件:cat

Linux葵花宝典-无需自宫版_第16张图片

使用 -n 参数可以显示每行的行号

Linux葵花宝典-无需自宫版_第17张图片

5)查看文件头:head

有时候文件非常大,使用cat命令显示出来的内容太多,而我们可能并不想查看所有内容,只是想看看文件开始部分的内容,这时候就可以使用head命令了,后面跟上需要查看的文件名就可以了。默认情况下,head将显示该文件前10行的内容。

Linux葵花宝典-无需自宫版_第18张图片

6)查看文件尾:tail

当文件很大时,可以使用该命令查看文件尾部的内容,默认情况下tail也是只显示文件的最后10行内容,同样可以使用-n参数指定显示的行数。

tail还有个更实用的功能,就是可以动态地查看文件尾。这对查看一些不断改变的文件来说非常有用。

查看末尾 tail -10 日志文件名称
动态查看日志 tail -f 日志文件名
Linux葵花宝典-无需自宫版_第19张图片

2.4 目录相关操作

1)进入目录:cd

[root@linux30 fileSys]# cd  ## 不带参数,进入到root目录
[root@linux30 ~]# pwd
/root
[root@linux30 ~]# cd linux-course/fileSys/  ## 进入/root/linux-course/fileSys目录
[root@linux30 fileSys]# pwd
/root/linux-course/fileSys
[root@linux30 fileSys]#

2)创建目录:mkdir

[root@localhost ~]# mkdir a
[root@localhost ~]# ll
total 4
drwxr-xr-x. 2 root root    6 Aug  3 08:30 a
-rw-------. 1 root root 1260 Aug  2 18:16 anaconda-ks.cfg
[root@localhost ~]# mkdir aa
[root@localhost ~]# ll
total 4
drwxr-xr-x. 2 root root    6 Aug  3 08:30 a
drwxr-xr-x. 2 root root    6 Aug  3 08:30 aa
-rw-------. 1 root root 1260 Aug  2 18:16 anaconda-ks.cfg
[root@localhost ~]# mkdir b bb
[root@localhost ~]# ll
total 4
drwxr-xr-x. 2 root root    6 Aug  3 08:30 a
drwxr-xr-x. 2 root root    6 Aug  3 08:30 aa
-rw-------. 1 root root 1260 Aug  2 18:16 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 Aug  3 08:30 b
drwxr-xr-x. 2 root root    6 Aug  3 08:30 bb
[root@localhost ~]# 

批量创建目录

[root@localhost ~]# mkdir master{1..3}
[root@localhost ~]# ll
total 0
drwxr-xr-x. 2 root root 6 Aug  3 08:33 master1
drwxr-xr-x. 2 root root 6 Aug  3 08:33 master2
drwxr-xr-x. 2 root root 6 Aug  3 08:33 master3
[root@localhost ~]# 

3)删除目录:rmdir和rm

该命令只能删除空目录,如果目录不为空(存在文件或者子目录),那么该命令将拒绝删除指定的目录。
可以使用rm -rf /dir1

[root@localhost ~]# rmdir aaa
rmdir: failed to remove ‘aaa’: Directory not empty
[root@localhost ~]# mkdir bbb
[root@localhost ~]# rmdir bbb
[root@localhost ~]# rm -rf aaa

4)文件和目录复制:cp

-i 覆盖已有文件前,提示用户确认,是否进行覆盖。
-r 递归复制目录,即复制目录下所有层级的子目录及文件。
-p 复制文件时,保持文件的所有者,权限信息,及时间属性。
-d 如果复制的源文件是符号链接,那么仅复制符号链接本身,而且保留符号链接所指向的目标文件或目录。
-a 等同于 -p,-d,-r三个参数选项的综合。
-t 默认情况下,命令格式为:cp 源文件 目标文件,当使用 -t 参数时,可以颠倒顺序。变为: cp -t 目标文件 源文件

[root@linux30 fileSys]# mkdir -p dir1/dir2/dir3/dir4
[root@linux30 fileSys]# cp anaconda-ks.cfg dir1/dir2/dir3/dir4  ## 文件的复制
[root@linux30 fileSys]# ll dir1/dir2/dir3/dir4
总用量 4
-rw-------. 1 root root 1440 12月 20 17:29 anaconda-ks.cfg
[root@linux30 fileSys]#

2.5 软/硬链接

ln 命令用于给文件创建链接,根据 Linux 系统存储文件的特点,链接的方式分为以下 2 种:

  • 软链接:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录。(尽量使用绝对路径, 否则移动后无法找到文件)
  • 硬链接:文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。(别名)

ln 命令的基本格式如下:

[root@localhost ~]# ln [选项] 源文件 目标文件

选项:

  • -s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件;
  • -f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;

【例 1】创建硬链接:

[root@localhost ~]# touch cangls
[root@localhost ~]# ln /root/cangls /tmp

建立硬链接文件,目标文件没有写文件名,会和原名一致 #也就是/tmp/cangls 是硬链接文件

【例 2】创建软链接:

[root@localhost ~]# touch bols
[root@localhost ~]# In -s /root/bols /tmp

建立软链接文件

这里需要注意的是,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错

硬链接

硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接

  • 不允许给目录创建硬链接;
  • 只有在同一文件系统中的文件之间才能创建链接,即不同分区上的两个文件之间不能够建立硬链接。

Linux葵花宝典-无需自宫版_第20张图片

源文件的关联数,在文件创建之初该值为1,该文件每增加一个硬链接该值将增1,当此数为0的时候该文件才能真正被文件系统删除。

软链接

软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。

Linux葵花宝典-无需自宫版_第21张图片

软链接的inode和源文件的inode不一样,这说明软链接本身就是一个文件。

删除软链接的源文件,然后可以在终端中看到对应的软链接将会以闪烁的方式标记其已是一个断链

3.Vim文本编辑器

Linux 系统中“一切皆文件”,因此当在命令行下更改文件内容时,不可避免地要用到文本编辑器。

Vi 编辑器是 Unix 系统最初的编辑器。它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行、在文件中移动、插入、编辑和替换文本。

在 GNU 项目中,在将 Vi 编辑器移植到开源世界的同时,决定对其作一些改进。由于改进后的 Vi 不再是以前 Unix 中的那个原始的 Vi 编辑器了,开发人员也就将它重命名为“Vi improved”,也就是 Vim。

因此可以这样说,Vim 是由 Vi 发展演变过程的文本编辑器,因其具有语法高亮显示、多视窗编辑、代码折叠、支持插件等功能,已成为众多 Linux 发行版本的标配

Vim的命令安装

在这里插入图片描述
主要是因为默认安装的是vi,vim命令并没有安装完全,输入rpm -qa|grep vim命令,发现CentOS上只装了vim的最小化安装

安装命令

yum -y install vim*

Vim三种工作模式

使用 Vim 编辑文件时,存在 3 种工作模式,分别是命令模式、输入模式和末行指令模式,这 3 种工作模式可随意切换,如图所示:

Linux葵花宝典-无需自宫版_第22张图片

Vim的命令模式

使用 Vim 编辑文件时,默认处于命令模式。此模式下,可使用方向键(上、下、左、右键)或 k、j、h、i 移动光标的位置,还可以对文件内容进行复制、粘贴、替换、删除等操作。

Vim的输入模式

在输入模式下,Vim 可以对文件执行写操作,类似于在 Windows 系统的文档中输入内容。

使 Vim 进行输入模式的方式是在命令模式状态下输入 i、I、a、A、o、O 等插入命令(各指令的具体功能如表 所示),当编辑文件完成后按 Esc 键即可返回命令模式

Vim 的末行指令模式

编辑模式用于对文件中的指定内容执行保存、查找或替换等操作。

Vim基本操作

使用 Vim 进行编辑

同样,Vim 提供了大量的编辑快捷键,主要可分为以下几类。

Vim 插入文本

从命令模式进入输入模式进行编辑,可以按下 I、i、O、o、A、a 等键来完成,使用不同的键,光标所处的位置不同,如表所示。

快捷键 功能描述
i 在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动
I 在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令
o 在光标所在行的下面插入新的一行。光标停在空行首,等待输入文本
O(大写) 在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本
a 在当前光标所在位置之后插入随后输入的文本
A 在光标所在行的行尾插入随后输入的文本,相当于光标移动到行尾再执行 a 命令

Vim 查找文本

快捷键 功能描述
/abc 从光标所在位置向前查找字符串 abc
/^abc 查找以 abc 为行首的行
/abc$ 查找以 abc 为行尾的行
?abc 从光标所在为主向后查找字符串 abc
n 向同一方向重复上次的查找指令
N 向相反方向重复上次的查找指定

Vim 替换文本

快捷键 功能描述
r 替换光标所在位置的字符
R 从光标所在位置开始替换字符,其输入内容会覆盖掉后面等长的文本内容,按“Esc”可以结束
: s/a1/a2/g 将当前光标所在行中的所有 a1 用 a2 替换
:n1,n2s/a1/a2/g 将文件中 n1 到 n2 行中所有 a1 都用 a2 替换
:g/a1/a2/g 将文件中所有的 a1 都用 a2 替换

Vim删除文本

快捷键 功能描述
x 删除光标所在位置的字符
dd 删除光标所在行
ndd 删除当前行(包括此行)后 n 行文本
dG 删除光标所在行一直到文件末尾的所有内容
D 删除光标位置到行尾的内容
:a1,a2d 函数从 a1 行到 a2 行的文本内容

注意,被删除的内容并没有真正删除,都放在了剪贴板中。将光标移动到指定位置处,按下 “p” 键,就可以将刚才删除的内容又粘贴到此处

Vim复制和粘贴文本

快捷键 功能描述
p 将剪贴板中的内容粘贴到光标后
P(大写) 将剪贴板中的内容粘贴到光标前
y 复制已选中的文本到剪贴板
yy 将光标所在行复制到剪贴板,此命令前可以加数字 n,可复制多行
yw 将光标位置的单词复制到剪贴板

Vim 保存退出文本

Vim 的保存和退出是在编辑模式中进行的,其常用命令如下表所示。

命令 功能描述
:wq 保存并退出 Vim 编辑器
:wq! 保存并强制退出 Vim 编辑器
:q 不保存就退出 Vim 编辑器
:q! 不保存,且强制退出 Vim 编辑器
:w 保存但是不退出 Vim 编辑器
:w! 强制保存文本
:w filename 另存到 filename 文件
x! 保存文本,并退出 Vim 编辑器,更通用的一个 vim 命令
ZZ 直接退出 Vim 编辑器

需要注意的是,“w!” 和 “wq!” 等类似的指令,通常用于对文件没有写权限的时候,但如果你是文件的所有者或者 root 用户,就可以强制执行。

Vim 可视化模式及其用法

Vim可视化模式

在 Vim 中,如果想选中目标文本,就需要调整 Vim 进入可视化模式,如下所示,通过在 Vim 命令模式下键入不同的键,可以进入不同的可视化模式。

Linux葵花宝典-无需自宫版_第23张图片

vim 命令模式下编辑文本的很多命令,在可视化模式下仍然可以使用

Linux葵花宝典-无需自宫版_第24张图片

多文件编辑

不管是vi还是vim都可以同时打开并编辑多个文件,如同在Windows中使用Office同时打开多个文件一样。但是由于vim拥有多行编辑的功能,因此使用它在多个文件之间切换编辑的时候更加方便。

[root@linux30 charPro]# vim vim_file1 vim_file2

同时打开vim_file1和vim_file2后,默认会打开第一个文件,也就是vim_file1,输入一些内容后,我们把光标定位到第二行,并按V键,这时进入多行选中模式,选中第二行和第三行,并进行复制操作(按y键)。这时刚刚选中的两行被复制到了缓冲区中,输入:n并按回车键,会切换至vim_file2,这时按p键,刚刚复制的内容将会粘贴到当前文件vim_file2中。

要想从文件vim_file2的界面回到vim_file1,只需要输入:N并按回车键即可。要想查看当前一共打开了几个文件,可以输入:files查看

4. Linux 文本处理(grep、sed、awk)

连接合并文件内容(cat命令)

cat 命令可以用来显示文本文件的内容,也可以把几个文件内容附加到另一个文件中,即连接合并文件。

cat 命令的基本格式如下:

[root@localhost ~]# cat [选项] 文件名
或者
[root@localhost ~]# cat 文件1 文件2 > 文件3

注意,cat 命令用于查看文件内容时,不论文件内容有多少,都会一次性显示。如果文件非常大,那么文件开头的内容就看不到了。不过 Linux 可以使用PgUp+上箭头组合键向上翻页,但是这种翻页是有极限的,如果文件足够长,那么还是无法看全文件的内容。

【例 】将文件 file1.txt 和 file2.txt 的内容合并后输出到文件 file3.txt 中。

[root@localhost base]# ls
file1.txt    file2.txt
[root@localhost base]# cat file1.txt
[root@localhost base]# cat file2.txt
[root@localhost base]# cat file1.txt file2.txt > file3.txt
[root@localhost base]# more file3.txt
[root@localhost base]# ls
file1.txt    file2.txt    file3.txt

分屏显示文件内容(more命令)

在看cat 命令时,有个疑问,即当使用 cat 命令查看文件内容时,如果文件过大,以至使用PgUp+上箭头组合键向上翻页也无法看全文件中的内容,该怎么办呢?这就需要使用 more 命令。

more 命令可以分页显示文本文件的内容,使用者可以逐页或者逐行阅读文件中内容,此命令的基本格式如下:

[root@localhost ~]# more [选项] 文件名

选项 含义
-f 计算行数时,以实际的行数,而不是自动换行过后的行数。
-p 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容。
-c 跟 -p 选项相似,不同的是先显示内容再清除其他旧资料。
-s 当遇到有连续两行以上的空白行时,就替换为一行的空白行。
-u 不显示下引号(根据环境变量 TERM 指定的终端而有所不同)。
+n 从第 n 行开始显示文件内容,n 代表数字。
-n 一次显示的行数,n 代表数字。。

常用操作

  • Enter 向下n行,可自定义。默认为1行
  • Ctrl+F 向下滚动一屏
  • 空格键 向下滚动一屏
  • Ctrl+B 返回上一屏
  • = 输出当前行的行号
  • :f 输出文件名和当前行的行号
  • V 调用vi编辑器
  • ! 命令, 调用Shell,并执行命令
  • q 退出more

查看文件内容(less命令)

less 命令的作用和 more 十分类似,都用来浏览文本文件中的内容

less 命令的基本格式如下:

[root@localhost ~]# less [选项] 文件名

Linux葵花宝典-无需自宫版_第25张图片

显示文件开头的内容(head命令)

head 命令可以显示指定文件前若干行的文件内容,其基本格式如下:

[root@localhost ~]# head [选项] 文件名

该命令常用选项以及各自的含义,如表 1 所示。

选项 含义
-n K 这里的 K 表示行数,该选项用来显示文件前 K 行的内容;如果使用 “-K” 作为参数,则表示除了文件最后 K 行外,显示剩余的全部内容。
-c K 这里的 K 表示字节数,该选项用来显示文件前 K 个字节的内容;如果使用 “-K”,则表示除了文件最后 K 字节的内容,显示剩余全部内容。
-v 显示文件名;

注意,如不设置显示的具体行数,则默认显示 10 行的文本数据。

【例 1】基本用法。

[root@localhost ~]# head anaconda-ks.cfg

head 命令默认显示文件的开头 10 行内容。如果想显示指定的行数,则只需使用 “-n” 选项即可,例如:

[root@localhost ~]# head -n 20 anaconda-ks.cfg

这是显示文件的开头 20 行内容,也可以直接写 “-行数”,例如:

[root@localhost ~]# head -20 anaconda-ks.cfg

显示文件结尾的内容(tail命令)

tail 命令和 head 命令正好相反,它用来查看文件末尾的数据,其基本格式如下:

[root@localhost ~]# tail [选项] 文件名

Linux葵花宝典-无需自宫版_第26张图片

管道

在Linux中存在着管道,它是一个固定大小的缓冲区,该缓冲区的大小为1页,即4K字节。管道是一种使用非常频繁的通信机制,我们可以用管道符“|”来连接进程,由管道连接起来的进程可以自动运行,如同有一个数据流一样,所以管道表现为输入输出重定向的一种方法,它可以把一个命令的输出内容当作下一个命令的输入内容,两个命令之间只需要使用管道符连接即可。

将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)

Linux 管道使用竖线|连接多个命令,这被shadow称为管道符。Linux 管道的具体语法格式如下:

command1 | command2
command1 | command2 [ | commandN... ]

当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入

为什么使用管道?

使用 mysqldump(一个数据库备份程序)来备份一个叫做 wiki 的数据库:

mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup
gzip -9 /tmp/wikidb.backup
scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/

上述这组命令主要做了如下任务:

  • mysqldump 命令用于将名为 wike 的数据库备份到文件 /tmp/wikidb.backup;其中-u-p选项分别指出数据库的用户名和密码。
  • gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。
  • scp 命令(secure copy,安全拷贝)用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。

上述三个命令依次执行。然而,如果使用管道的话,你就可以将 mysqldump、gzip、ssh 命令相连接,这样就避免了创建临时文件 /tmp/wikidb.backup,而且可以同时执行这些命令并达到相同的效果。

使用管道后的命令如下所示:

mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz"

这些使用了管道的命令有如下特点:

  • 命令的语法紧凑并且使用简单。
  • 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。
  • 从管道输出的标准错误会混合到一起。

grep(Linux三剑客之一)

很多时候,我们并不需要列出文件的全部内容,而是从文件中找到包含指定信息的那些行,要实现这个目的,可以使用 grep 命令

grep 命令的全称:global regular expressions print (全局正则表达式打印)

grep命令能够在一个或多个文件中,搜索某一特定的字符模式(也就是正则表达式),此模式可以是单一的字符、字符串、单词或句子。

grep 命令的基本格式如下:

[root@localhost ~]# grep [选项] 模式 文件名

这里的模式,要么是字符(串),要么是正则表达式。而此命令常用的选项以及各自的含义如表所示。

Linux葵花宝典-无需自宫版_第27张图片

注意,如果是搜索多个文件,grep 命令的搜索结果只显示文件中发现匹配模式的文件名;而如果搜索单个文件,grep 命令的结果将显示每一个包含匹配模式的行。

【例 1】假设有一份 emp.data 员工清单,现在要搜索此文件,找出职位为 CLERK 的所有员工,则执行命令如下:

[root@localhost ~]# grep CLERK emp.data
#忽略输出内容

而在此基础上,如果只想知道职位为 CLERK 的员工的人数,可以使用“-c”选项,执行命令如下:

[root@localhost ~]# grep -c CLERK emp.data
#忽略输出内容

【例 2】搜索 emp.data 文件,使用正则表达式找出以 78 开头的数据行,执行命令如下:

[root@localhost ~]# grep ^78 emp.data
#忽略输出内容

grep 命令支持如表所示的这几种正则表达式的元字符:

Linux葵花宝典-无需自宫版_第28张图片

sed (Linux三剑客之一)

Vim 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。

sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  1. 每次仅读取一行内容;
  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  3. 将执行结果输出。

当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

语法

sed [-hnV][-e
                    
                    

你可能感兴趣的:(实用技能,linux,运维,服务器)