内容来自:Linux介绍
视频推荐:[Linux基础入门教程-linux命令-vim-gcc/g++ -动态库/静态库 -makefile-gdb调试](
目录
- day07
- 42、使用 grep 搜索文件内容
- 43、使用 locate 搜索文件
- 44、 vim 的安装和介绍
- vim的模式
- 45、命令模式下光标的移动
- 1、保存退出
- 2、代码格式化
- 3、光标移动
- 46、命令模式下的删除操作
- 47、命令模式下的撤销和反撤销、复制和粘贴操作
- 撤销和反撤销
- 复制和粘贴
- 48、命令模式下的可视模式操作
- 字符可视模式
- 行可视模式
- 块可视化模式
- 49、命令模式下的代码注释操作
- 50、命令模式下的字符替换
- 51、命令模式下的关键字搜索
- 52、在命令模式下查询 man 文档
day07
42、使用 grep 搜索文件内容
和
find
不同grep
命令用于查找文件里符合条件的字符串。grep
命令中有几个常用参数,下面介绍一下:
-r
:如果需要搜索目录中的文件内容, 需要进行递归操作, 必须指定该参数-i
:对应要搜索的关键字, 忽略字符大小写的差别-n
:在显示符合样式的那一行之前,标示出该行的列数编号
# 语法格式:
$ grep "搜索的内容" 搜索的路径/文件 参数
对应要搜索的文件内容,建议放到引号中,因为关键字中可能有特殊字符,或者有空格,从而导致解析错误。
关于引号,单双都可以,可根据自己的需求选择。
搜索举例:
# 搜索指定文件中是否有字符串 include
$ grep "include" a.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
# 不区分大小写进行搜索
$ grep "INCLUDE" a.c
$ grep "INCLUDE" a.c -i
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
# 搜索指定目录中哪些文件中包含字符串 include 并且显示关键字所在的行号
$ grep "include" ./ -rn
./a.c:1:#include <stdio.h>
./a.c:2:#include <unistd.h>
./a.c:3:#include <fcntl.h>
./luffy/get/e.c:1:#include <stdio.h>
./luffy/get/e.c:2:#include <unistd.h>
./luffy/get/e.c:3:#include <fcntl.h>
./luffy/c.c:1:#include <stdio.h>
./luffy/c.c:2:#include <unistd.h>
./luffy/c.c:3:#include <fcntl.h>
./ace/b.c:1:#include <stdio.h>
./ace/b.c:2:#include <unistd.h>
./ace/b.c:3:#include <fcntl.h>
./.bash_history:1449:grep "include" ./
./.bash_history:1451:grep "include" ./ -r
./.bash_history:1465:grep "include" a.c
43、使用 locate 搜索文件
我们可以将
locate
看作是一个简化版的find
, 使用这个命令我们可以根据文件名搜索本地的磁盘文件
, 但是locate的效率比find要高很多
。原因在于它不搜索具体目录,而是搜索一个本地的数据库文件,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
# 使用管理员权限更新本地数据库文件, root用户这样做
$ updatedb
# 非root用户需要加 sudo
$ sudo updatedb
locate
有一些常用参数, 使用之前先来介绍一下:
- 搜索所有目录下以某个关键字开头的文件
$ locate test # 搜索所有目录下以 test 开头的文件
- 搜索指定目录下以某个关键字开头的文件,
指定的目录必须要使用绝对路径
$ locate /home/robin/test # 指定搜索目录为 /home/robin/, 文件以 test 开头
- 搜索文件的时候,忽略文件名的大小写,使用参数
-i
$ locate TEST -i # 文件名以小写的test为前缀的文件也能被搜索到
- 列出前N个匹配到的文件名称或路径名称,使用参数
-n
$ locate test -n 5 # 搜索文件前缀为 test 的文件, 并且只显示5条信息
- 基于
正则表达式
进行文件名匹配,查找符合条件的文件,使用参数-r
# 使用该参数, 需要有正则表达式基础
$ locate -r "\.cpp$" # 搜索以 .cpp 结尾的文件
正则表达式小科普:
- 在正则表达式中
.
可以匹配任意一个非\n
的单字符- 上边的命令中使用转译字符
\
对特殊字符.
转译,就得到了普通的字符.
- 在正则表达式中
$
放到字符尾部,表示字符串必须以这个字符结尾,上边的命令中修饰的是字符p
- 正则表达式中的 字符
c
和后边的字符p
需要进行字节匹配,没有特殊含义- 通过上面的解释就能明白
\.cpp$
说的就是以.cpp
结尾的字符串
44、 vim 的安装和介绍
Vim
是 Linux 操作系统中一款功能强大的文本编辑器,支持安装各种插件。但是 vim 和 windows 中的文件编辑器所不同的是它没有 UI 界面,所有的操作都是通过键盘快捷键操作完成的,因此要想熟练使用vim
在 Linux 中进行文本编辑是有成本的,需要花费一定的时间去练习。如果我们拿到了一个纯净版的 Linux,里边是没有 vim 的,但是有一个类似的文本编辑器叫做
Vi
。vi编辑器的功能不是很强,可以这样理解vim
就是vi
的增强版。首先介绍一下如何在线安装vim,
软件安装需要管理员权限
:
-
Ubuntu
$ sudo apt install vim # 如果是root用户就不用加 sudo 了
-
CentOS
$ sudo yum install vim # 如果是root用户就不用加 sudo 了
vim安装完毕之后,可以先查看一下版本 (在线安装不能保证安装的软件是最新版本
)
$ vim --version
另外vim还提供了使用文档,直接在终端执行下面的命令就可以打开了
$ vimtutor
vim的模式
在vim中一共有三种模式,分别是 命令模式
,末行模式
,编辑模式
,当我们打开vim之后默认进入的是命令模式
。
- 命令模式:在该模式下我们可以进行
查看文件内容
,修改文件
,关键的搜索
等操作。 - 编辑模式:在该模式下主要对文件内容进行修改和内容添加。
- 末行模式:在该模式下可以进行
执行Linux命令
,保存文件
,进行行的跳转
,窗口分屏
等操作。
介绍的以上三种模式之间是可以相互切换的:
- 命令模式 -> 编辑模式 -> 命令模式
- 命令模式 -> 末行模式 -> 命令模式
编辑模式和末行模式之间是不能相互直接切换的
45、命令模式下光标的移动
通过 vim 打开一个文件,如果文件不存在,在退出的时候进行了保存,文件就会被创建出来
# 打开一个文件
$ vim 文件名
1、保存退出
直接在键盘上操作,通过键盘按两个连续的大写的Z (此处是大写的Z, 需要先按住 Shift 再操作哦
)
# 先按住 shift 键, 然后连续按两次 z
ZZ
2、代码格式化
在编码过程中,为了便于阅读和代码维护,代码都需要按照样式对其,如果代码格式凌乱,可以在命令模式下快速进行代码的格式化,让其看起来更加美观,这个操作需要在键盘上连续输入多个字符。
# 假设写的c/c+代码没有对齐, 通过该命令可以对齐代码
# 一定要注意最后一个字符是 大写的 G, 因此需要先按 shift
gg=G
3、光标移动
在vim中可以使用键盘上的方向键(
↑
,↓
,←
,→
)来移动光标,这种操作相对比较麻烦,有一种更加简便的操作方式,就是使用键盘上的h
,j
,k
,l
。
# 标准的移动光标的方法: 使用 h, j, k, l
光标上移
↑
|
光标左移 <-- h j k l --> 光标右移
|
↓
光标下移
除此之外我们还可以使用一些快捷键实现光标的快速跳转,常用的有:
快捷键 | 功能 | 备注 |
---|---|---|
0 | 光标移动到行首 | 无 |
$ | 光标移动到行尾部 | 选按两个键:shift + 4 |
gg | 光标移动到文件头 | 第一行的开始 |
G | 光标移动到文件尾部 | 最后一行的开始 |
nG | 行跳转 | n 代表要跳转到哪一行 |
n+回车 | 相对跳转 n 行 | 从光标所在当前行往下跳 n 行,n 对应的是一个整数 |
46、命令模式下的删除操作
在vim中是没有删除操作的,其实所谓的删除就是剪切,被删除的数据都可被粘贴到文档的任意位置,即便如此我们还是习惯性的将剪切操作称之为删除,常用的删除操作如下表所示:
快捷键 | 功能 | 备注 |
---|---|---|
x (小写) | 删除光标后边的字符 | vim中的光标比较宽会盖住后边的字符 |
X (大写) | 删除光标前边的字符 | 无 |
dw | 删除单词 | 要先把光标移动到单词的第一个字母上再删除, 否则单词只能被删除一部分 |
d0 | 删除光标前的字符串 | 从字符串开头到光标当前位置的字符串被删除了 |
d$ (D) | 删除光标后的字符串 | 从光标当前位置到字符串尾部的字符串被删除了, 使用 D 也行 |
dd | 删除光标所在行 | 无 |
ndd | 删除n行 | 从光标所在行开始删除n 行, n 对应的是一个整数 |
47、命令模式下的撤销和反撤销、复制和粘贴操作
撤销和反撤销
撤销和反撤销对应windows中的
ctrl+z
和ctrl+y
,但是在vim中使用这两个快捷键是不行的。
快捷键 | 功能 | 备注 |
---|---|---|
u | 撤销 | 等价于 windows 中的 ctrl+z |
ctrl+r | 反撤销 | 等价于 windows 中的 ctrl+y |
复制和粘贴
前边已经介绍了,在vim中做删除操作就相当于剪切,剪切或者复制之后的数据都可以用来做粘贴操作,在vim中对应的快捷键如下:
快捷键 | 功能 | 备注 |
---|---|---|
p | 粘贴到光标所在行的下边 | 小写 的 p |
P | 粘贴到光标所在行的上边 | 大写 的 P |
yy | 复制光标所在行 | 无 |
nyy | 从光标所在行向下复制 n 行 | n是要复制的行数, 代表一个整数 |
48、命令模式下的可视模式操作
在编辑文件的过程中,有时候需要删除或者需要复制的数据不整行的,而是一行中的某一部分,这时候可以使用可视模式进行文本的选择,之后再通过相关的快捷键对所选中的数据块进行复制或者删除操作。
有三种方式可以切换到可视模式:
v
: 进入的字符可视化模式(Characterwise visual mode),文本选择是以字符为单位的。V
:进入的行可视化模式(Linewise visual mode),文本选择是以行为单位的。ctrl-v
: 进入的块可视化模式(Blockwise visual mode),可以选择一个矩形内的文本。
进入到可视模式之后,就可以进行文本块的选择和复制以及删除了
快捷键 | 功能 | 备注 |
---|---|---|
h | 光标向左移动 | 移动光标用于可视模式下的数据块选择 |
j | 光标向下移动 | 移动光标用于可视模式下的数据块选择 |
k | 光标向上移动 | 移动光标用于可视模式下的数据块选择 |
l | 光标向右移动 | 移动光标用于可视模式下的数据块选择 |
d | 删除(剪切) | 删除可视模式下选中的数据块 |
y | 复制 | 复制可视模式下选中的数据块 |
p (小写) | 数据粘贴到光标的后边 | 粘贴在可视模式下复制或者剪切的数据块 |
P (大写) | 数据粘贴到光标的前边 | 粘贴在可视模式下复制或者剪切的数据块 |
字符可视模式
控制光标方向用来选择文件中的不规则数据块,可以对选中的文本信息进行复制和删除
# 进入到字符可视模式,直接在键盘上按 v 即可:
v
通过 v 切换到字符可视模式之后,在窗口的最下方会看到 -- VISUAL--
字样。
行可视模式
向下移动光标可以选择一整行,向上移动光标可以取消整行选择
# 进入行可视模式, 键盘上按 shift+v
V
通过 V 切换到行可视模式之后, 在窗口的最下方会看到 -- VISUAL LINE --
字样。
块可视化模式
通过向上,下移动光标控制矩形文本块的高度,通过向左,右移动光标控制矩形文本块的宽度。
# 进入块可视模式, 选择一个矩形文本块
ctrl+v
通过 ctrl+v 切换到块可视模式之后,在窗口的最下方会看到 -- VISUAL BLOCK --
字样。
49、命令模式下的代码注释操作
代码块注释可以使用块可视模式,具体操作步骤如下:
-
通过
ctrl+v
进入块可视模式 -
移动光标上移(k)或者下移(j),选中多个代码行的开头,如下图所示:
-
选择完毕后,按大写的的
I
键,此时下方会提示进入“insert” 模式,输入你要插入的注释符,例如: // -
最后按ESC键,你就会发现选中的多行代码已经被注释了
删除多行注释的方法,同样 Ctrl+v 进入列选择模式,移动光标把要删除的注释符选中,按下d,注释就被删除了。
50、命令模式下的字符替换
命令模式下的替换功能并不强,常用于某个单字符的替换。
快捷键 | 功能 | 备注 |
---|---|---|
r | 替换光标后的单个字符 | 无 |
R | 替换光标后的多个字符 | 按 esc 结束替换 |
51、命令模式下的关键字搜索
在vim的命令模式下一共有三种查找方式,首先需要在键盘上输入对应的字符,然后按回车键vim会进行关键字匹配,之后就可以通过
n
或者N
进行关键字之间的切换了。
搜索快捷键 | 关键字遍历 | 描述 | 备注 |
---|---|---|---|
/ | n | 从当前位置向下 | 直接按键盘上的 / 即可 |
N | 从当前位置向上 | ||
? | n | 从当前位置向上 | 直接按键盘上的 ? 即可, 需要使用组合键 |
N | 从当前位置向下 | ||
# | n | 从当前位置向上 | 光标需要先放在被搜索的关键字上, 键盘上按 # |
N | 从当前位置向下 |
关于 ?
和 #
都需要使用组合键,这点要注意一下。
下面总结一下这三种搜索方式:
- 使用
/
或者?
搜索效果一样,只是遍历关键字的时候的顺序是相反的 - 使用
#
必须先从被搜索的文件中找到要搜索的关键字,好处就是搜索的内容不需要通过键盘输入 - 以上两种搜索方式各有优劣,请根据实际情况选择使用。
52、在命令模式下查询 man 文档
man 文档,是Linux中默认自带的帮助文档, 作为程序猿可以通过这个文档来查询 shell 命令或者标准API函数或者系统自带的配置文件格式的说明等信息。
man文档一共有9个章节, 具体如下:
章节 | 说明 |
---|---|
section 1 | Linux提供的所有shell命令 |
section 2 | 系统函数(由内核提供的) |
section 3 | 库调函数(程序库中的函数) |
section 4 | 特殊文件(通常在/dev目录中可以找到) |
section 5 | 系统配置文件格式和约定,比如:/etc/passwd |
section 6 | 游戏(如果有的话) |
section 7 | 杂项(包括宏包和约定) |
section 8 | 系统管理命令(通常仅针对root用户) |
section 9 | 内核例程[非标准] |
# 打开 man 文档首页
$ man man
# 退出 man 文档,直接按键盘上的 q 即可
q
那么,我们如何通过 man 文档查询相关的shell命令或者函数等信息呢?
# 下边举几个例子:
# 查询第一章的shell命令
$ man 1 cp
# 查询第二章的系统函数 (如: read, write, open 等)
$ man 2 read
# 查询第三章的标准的库函数 (如: fread, fwrite, fopen 等)
$ man 3 fread
# 查询第五章的特殊的配置文件说明, 比如: /etc/passwd 或者 /etc/group
$ man 5 passwd
查询的时候章节号是可以省略的,只是查到的结果不精确。如果不写章节号,从第一章开始搜索查询的关键字,如果查询到了,直接就结束了。也就是说如果查询的是函数,但是这个函数和某个命令的名字是相同的,查询到第一章搜索就结束了。
如果当前是在 vim 的命令模式下,我们可以直接跳转到 man 文档:
- 找到要查看的函数,然后将光标放到该函数上
- 在键盘上依次输入:章节号(可选) + K
(shift+k)(大写的k)
,就会自动调整到 man 文档中了