Skip to content

Linux 检索·终端与 Vim

whereis 命令(全系统查询)

查询 目标 文件(它不搜索普通文件(如文本文件、配置文件等),仅针对二进制程序、源码和手册页)

shell
# 语法
whereis 文件名

# 示例
whereis nginx
# 结果: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/local/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz /usr/share/man/man3/nginx.3pm.gz
# 注意:此法不是模糊查询

which 命令(全系统查询)

查询 目标 可执行文件(若命令不存在或不在 $PATH 目录中,which 会返回空或报错)

shell
# 语法
which 文件名

# 示例
which nginx
# 结果:/usr/sbin/nginx
# 注意:此法不是模糊查询

locate 命令(全系统查询)

快速查找文件或目录

shell
# locate 是一个用于快速查找文件或目录的命令工具,它通过搜索预先构建的数据库(通常是 /var/lib/mlocate/mlocate.db)来快速定位文件,
# 相比 find 命令效率更高(因为 find 是实时搜索文件系统)

# 安装
yum -y install mlocate
# 构建数据库
updatedb

# 执行命令
locate 文件名 
locate 文件名 | grep 过滤字符

# 注意:此法是模糊查询,文件量很大,建议使用 grep 过滤

find 命令(指定路径查询)

它可以查找指定路径( / 为全系统查找)下的文件或目录,根据多种条件(如名称、大小、权限、修改时间等)搜索文件,并支持对找到的文件执行指定操作

  1. 语法
shell
# 注意:此法不是模糊查询

# 基础语法
find [搜索路径] [匹配条件] [操作]

# 选项
搜索路径:指定查找的起始目录(默认为当前目录 .)。
匹配条件:定义查找的过滤规则(如名称、类型、大小等)。
操作:对找到的文件执行的动作(如删除、复制、执行命令等,默认为输出文件路径)。
  1. 常见匹配条件
shell
# 按名称查找
find . -name "*.txt"  # 查找当前目录下,名称以 .txt 结尾的文件
find /home -iname "*.txt" # 查找 /home 目录下,名称以 .txt 结尾且忽略大小写匹配的文件

# 按文件类型查找
# -type f:普通文件
# -type d:目录
# -type l:符号链接
# -type s:套接字文件
find /home -type d  # 查找 /home 目录下,所有的目录

# 按大小查找
# 单位可以是 c(字节)、k(KB)、M(MB)、G(GB)
# + 表示大于,- 表示小于,无符号表示等于。
find /home -type f -size +100M  # 查找 /home 下大于 100MB 的文件

# 按时间查找
# 操作类型:-mtime 修改时间(内容变更)、-atime 访问时间(内容读取)、-ctime 状态时间(权限 / 属性变更)
# 时间类型:-mtime [+/-]天数、-mmin [+/-]分钟
find /home -type f -mtime -7  # 查找 /home 下 7 天内修改过的文件

# 按权限查找
# -perm 权限值:精确匹配权限(如 644、755)。
find / -type f -perm 777  # 全盘查找权限为 777 的文件

# 按用户/组查找
# -user 用户名、-group 组名、-nouer 查找没有所属者的文件(用的最多,用于查找垃圾文件)、-uid 用户ID、-gid 组 ID
find / -user root # 全盘查找属于 root 用户的文件

# 可组合查询
# 与
find . -name "*.sh" -type f # 查找 .sh 结尾的普通文件
# 或
find . -name "a.txt" -o -name "b.txt"  # 查找 a.txt 或 b.txt
# 非
find . ! -name "*.txt"  # 查找不是 .txt 的文件
  1. 常见操作
shell
# 删除文件
# -delete:直接删除找到的文件
find . -name "*.log" -mtime +30 -delete  # 删除当前目录下 30 天前的 .log 文件

# 对查询的事件,执行命令:拷贝、修改、新增、查看等
# -exec 命令 {} \;:{} 代表找到的文件路径,\; 是命令结束符。
find . -name "*.txt" -exec cp {} /tmp/docs/ \;  # 将找到的 .txt 文件复制到 /tmp/docs 目录
find . -type f -mtime -1 ! -user root  # 查找当前目录中 24 小时内修改过的、不属于 root 的普通文件
find /etc -name "*.conf" -size +1k # 查找 /etc 下所有以 .conf 结尾且大于 1KB 的文件

grep 搜索文件内容 和 结合管道符过滤命令结果

用于在文件或输入流中查找匹配指定模式(正则表达式)的行,并将匹配结果输出

  1. 查询规则
shell
# 基础语法
grep [选项] 模式 [文件...]

# 选项
# 匹配文件内容
-i                            # 忽略大小写
-w                            # 只匹配完整单词
-x                            # 只匹配整行完全相同的内容(精确匹配一行)
-n                            # 显示匹配行的行号。
-v                            # 取反,反向匹配
-c                            # 统计匹配的行数(不统计匹配次数,一行多匹配只算一次)
-r -R                       # 递归搜索目录下的所有文件(包括子目录)
-l                            # 只输出包含匹配内容的文件名(而非具体行)。
-L                            # 反向输出不包含匹配内容的文件名。


# 模式
可以是普通字符串或正则表达式(默认支持基本正则表达式,加 -E 支持扩展正则表达式)。

# 文件
指定要搜索的文件,若不指定文件,则从标准输入(如管道 | 传递的内容)中读取。

# 示例
grep -i "hello" file.txt # 匹配行中出现 "Hello"、"HELLO" 的字符,并将行内容打印在控制台
  1. 通配符(find 命令的条件适用通配符,查文件)
shell
*                 匹配任意 多个 内容                        find . -name "abc*"                匹配abc开头的文件
?                 匹配任意 一个 内容                        find . -name "a?c"                 匹配a什么c的文件
[]                匹配[]中任意一个字符                      find . -name [abc]                 匹配abc任何一个的文件
[-]               匹配[]中任意范围内字符                    find . -name [a-z]                 匹配a-z的小写字母的文件
[^]               匹配[^]中任意一个字符                     find . -name [^0-9]                匹配非数字的文件
  1. 正则表达式(grep 命令的条件适用正则表达式,查文件内容)
shell
*                 匹配前一个字符重复0次,或任意次                           grep "abc*" file1
?                 匹配前一个字符重复0次,或1次                             grep "abc?" file1
[]                匹配[]中任意一个字符                                    grep [abc] file1
[-]               匹配[]中任意范围内字符                                  grep [a-z] file1
[^]               匹配[^]中任意一个字符                                   grep [^abc] file1
^                 匹配行首,限位符                                        grep ^abc file1
$                 匹配行尾,限位符                                        grep $abc file1
  1. 管道符(常用)

管道符文本流: 将目录里的所有文件。临时转化为文本流,再使用文本命令进行操作

shell
ls l /etc | more                         查询出etc目录下的所有文件,通过more命令,以文本的方式查看
netstat -tuln | grep 80                  查询服务器上开启的服务端口,再通过 grep 80 过滤出 80 端口(用于查询某一端口是否开启)
netstat -an | grep ESTABLISHED | wc l    查询服务器上所有服务,再通过 grep ESTABLISHED过滤出正在操作服务器的服务,再次通过wc过滤(用于查看有几人在操作服务器)
  1. 示例
shell
# 查询文件中内容
grep "hello" file.txt     # 列出 file.txt 文件中,hello 字符出现的行
grep -i "hello" file.txt  # 列出 file.txt 文件中,hello 字符出现的行,忽略大小写
grep -w "hello" file.txt  # 列出 file.txt 文件中,hello 完整单词字符出现的行
grep -x "hello" file.txt  # 列出 file.txt 文件中,hello 整行只是 hello 字符出现的行
grep -n "hello" file.txt  # 列出 file.txt 文件中,hello 字符出现的行,外加行号
grep -v "hello" file.txt  # 列出 file.txt 文件中,hello 字符 没 出现的行
grep -o "hello" file.txt  # 列出 file.txt 文件中,hello 字符出现的行,且只列 hello 值
grep -c "hello" file.txt  # 列出 file.txt 文件中,hello 字符出现的行数
grep -r "hello" ./www/    # 列出 递归搜索 当前www 目录下的所有文件,hello 字符出现的行
grep -l "hello" /home/*   # 列出 /home/ 目录中,文件中含有 hello 字符内容的文件名
grep -L "hello" /home/*   # 列出 /home/ 目录中,文件中 不 含有 hello 字符内容的文件名

grep -rn --include="*.txt" "hello" ./ # 列出当前目录下的所有.txt文件中含有 hello 字符内容的行和行号

# 管道符 - 过滤命令
ls | grep ".txt"           # ls 命令输出结果中,过滤出含有 .txt 的内容(查找当前目录下的所有 txt 文件名)
ls l /etc | more           # 查询出etc目录下的所有文件,通过more命令,以文本的方式查看
netstat -tuln | grep 80    # 查询服务器上开启的服务端口,再通过 grep 80 过滤出 80 端口(用于查询某一端口是否开启)
netstat -an | grep ESTABLISHED | wc l    # 查询服务器上所有服务,再通过 grep ESTABLISHED过滤出正在操作服务器的服务,再次通过wc过滤(用于查看有几人在操作服务器)

总结

  1. 若模式包含空格或特殊字符(如 $、*、( 等),需用单引号 ' 或双引号 " 包裹(单引号可避免 Shell 解析)
  2. 正则表达式中,. 匹配任意单个字符,* 匹配前一个字符 0 次或多次,^ 匹配行首,$ 匹配行尾。
  3. grep 通常结合 | 管道使用,用于过滤命令结果

在 Linux 系统中,终端管理是日常操作和系统管理的重要部分,涉及终端的创建、切换、会话管理、多窗口 / 标签操作等

终端操作

shell
# CentOS 默认提供 6 个虚拟控制台(TTY),可通过快捷键切换
六个本地字符终端:tty1     tty2     tty3     tty4      tty5      tty6

# 切换终端
切换字符终端命令:alt+f1   alt+f2   alt+f3   alt+f4    alt+f5    alt+f6 # windows
切换字符终端命令:cmd+1    cmd+2    cmd+3    cmd+4     cmd+5     cmd+6  # mac

# 新建终端
Ctrl + Shift + T # windows
command + T # mac

# 垂直 / 水平分割窗口
Ctrl + Shift + E    # 垂直
Ctrl + Shift + O    # 水平
command + O # mac

# 终端命令
Tab # 自动补全命令 / 文件名
ctrl + a  # 将光标移到命令行头
ctrl + e  # 将光标移到命令行尾
ctrl + c  # 强制终止当前命令
ctrl + l  # 清屏,相当于 clear
ctrl + u  # 删除和剪切命令行光标之前的内容
ctrl + y  # 粘贴 ctrl+u 剪切的命令
ctrl + r  # 从历史命令中搜索
ctrl + d  # 退出当前终端
ctrl + z  # 暂停并放入后台
ctrl + s  # 暂停屏幕输出
ctrl + q  # 恢复屏幕输出

# 将字符输出到终端
echo "内容"  # \n 是换行,\字符\ 是转义 , -e 是支持控制字符

终端通信(消息、邮件)

  1. 查看当前有哪些用户在使用终端
shell
# 基础语法
w 

# 结果
USER     TTY     FROM                   LOGIN@      IDLE       JCPU        PCPU        WHAT
用户     终端    远程ip(本地为 -                                                   做了什么
  1. 向指定在线用户发送消息 write

在 Linux 系统中,write 命令用于向其他登录用户的终端发送消息。它允许用户之间在终端上进行实时的文本交流,消息会直接显示在接收方的终端上(无论对方当前在做什么操作)

shell
# 基础语法
write [目标用户名] [目标用户终端号]  # [目标用户名] 为 w 结果中的 USER 列,[目标用户终端号] 为 w 结果中的 TTY 列
回车,建立会话
输入发送的内容
完成后,ctrl + D 终端会话
  1. 向所有在线用户发送消息,包括自己 wall
shell
# 基础语法
wall
回车,建立会话
输入发送的内容
完成后,ctrl + D 终端会话
  1. mail 命令,向其他用户发送邮件(用户可以是离线状态,上线后手动查看)
shell
# 基础语法
mail 用户名    # 向用户发送邮件
回车,建立会话
输入发送的内容:subject 是标题,下面是内容,使用 . 来结束输入,完成后 ctrl + D 发送

# 基础语法
mail       # 用户查看收到的邮件(只能手动查看)
回车,建立会话:会显示邮箱列表,输入对应的第一列索引即可查看邮箱中对应标题的信息详情

# 删除邮箱
d 标题

# 保存邮件
s 标题

# 查看标题列表
h 回车

# 退出邮件会话
quit 回车 退出并保存
exit 回车 退出不保存

# 邮件的保存位置
/var/spool/mail/user1

# 发送指定文件给某个用户(很常见)
mail -s 指定邮件标题 目标用户 < 文件路径
mail -s "我发的邮件是给你看的" root < /root/xxx.txt

vi 和 vim 编辑器

vi 是 1976 年诞生的基础编辑器,预装在几乎所有 Unix/Linux 系统中,功能简洁。vim(Vi Improved)则在 vi 的基础上开发,保留了所有 vi 操作,同时新增了大量实用功能,目前已成为主流。

vim 特点

  • 完全兼容 vi 所有功能
  • 语法高亮:不同文件类型(如代码、配置)显示不同颜色
  • 代码缩进:自动对齐代码,支持自定义缩进规则
  • 搜索高亮:搜索结果自动标色,便于定位
  • 撤销 / 重做:支持多步撤销(vi 仅支持单步撤销)

进入文件编辑模式

shell
vim fileName        # 有文件则进入,没有则创建文件进入

vim 三种模式

vim 的三种模式:命令模式、输入模式、编辑模式

  1. 命令模式

控制台输入:vim fileName ,默认进入命令模式,输入以下命令从命令模式进入输入模式

shell
a            # 光标所在字符后插入(追加)
A            # 光标所在行尾处插入
i            # 光标所在字符前插入(插入)
I            # 光标所在行首处插入
o            # 光标下插入新行(新行)
O            # 光标上插入新行
  1. 输入模式

在输入模式下,可执行录入文本等操作,按 ESC 键,从输入模式进入命令模式

  1. 编辑模式

在命令模式下,输入英文冒号:进入编辑模式,编辑模式下的常见命令如下:

shell
w             # 保存不退出
q             # 退出不保存
wq            # 保存并退出(快捷键 shift+zz)
q!            # 强制退出不保存 (用于修改数据后,强制不保存退出)(所有人)
wq!           # 强制保存并退出 (用于文件没有写权限的时候,修改后,保存退出)(管理员和文件当前所属者)

命令模式下的常见操作

注意:以下命令都是在命令模式下执行的,不可在插入模式下执行

  1. 控制移动光标
shell
           # 光标上下左右移动
gg                # 光标移动到文件头
shift + g         # 光标移动到文件尾
^                 # 光标移动到行首
$                 # 光标移动到行尾
:n                # 移动到第几行
  1. 删除、剪切字符
shell
x                 # 删除单个字母
nx                # 删除n个字母
dd                # 删除单行,或者剪切单行
ndd               # 删除多行,或者剪切多行
:nl,n2d           # 删除指定范围内的字符,或者剪切范围内字符
dG                # 从光标所在行删除到行尾,放在行首就是清空文件
  1. 复制(整行)
shell
yy                # 复制光标所在行
nyy               # 复制多行
  1. 粘贴(整行)
shell
p                  # 粘贴到光标前
shift + p          # 粘贴到光标后
  1. 撤销
shell
u                  # 撤销
ctrl+r             # 反撤销
  1. 查找
shell
/查找内容           # 从光标所在处向下查找
?查找内容           # 从光标所在处向上查找
n                  # 下一个
shift + n          # 上一个
  1. 替换
shell
:1,100s/old/new/g          # 替换第一行到第十行的所有old为new
:%s/old/new/g              # 替换整个文件old为new

:1,10s/^/#/g               # 注释1 ~ 10 行
:1,10s/^#//g               # 取消1 ~ 10 行注释

vim 常见配置命令

临时修改 vim 编辑器的展示

shell
:set nu                    # 显示行号
:set nonu                  # 取消行号
:syntax on                 # 显示特殊内容颜色
:syntax off                # 不显示特殊内容颜色

vim 常见操作

  1. 把其他文件的内容导入到光标位置,在命令模式下,光标先放在要粘贴的位置,执行
shell
:r /xxx/xxx/文件名         # 把文件内容导入到光标位置
  1. 在 vim 中执行系统命令,且不影响 vim 操作,在 insert 编辑模式下,输入
shell
:!系统命令                 # 比如,:!date, 在vim编辑器中,使用系统命令,并按任意键返回到vim编辑器中
  1. 将系统命令的结果导入到 vim 编辑器中光标所在位置
shell
:r !命令                    # 比如,:r !date ,将系统时间写入到光标所在位置
  1. 注释快捷键设置,在命令行配置只是临时生效,系统重启将失效,永久生效需要写入配置文件:~/.vimvc 5.
shell
 # 自定义快捷键语法::map 快捷键 快捷键执行的命令
:map ctrl+p I#<ESC>          # 按ctrl+p时,在行首加上 # 注释
:map ctrl+b ctrl+x           # 按ctrl+b时,删除行首第一个字母,取消注释
  1. 字符串模板,可以把一些常用的长字符串设置成模板,方便编辑时使用,用于提升编辑效率,比如:邮箱
shell
:ab 源字符 替换为字符                 # 字符替换
:ab myemail 872831515@qq.com         # 当在文档中插入 myemail 时,会自动转化为 872831515@qq.com,建议源字符特殊且长一些否则影响编辑
  1. 多文件打开,在vim中可同时打开多个文件
shell
vim -o /xxx/file1 /xxx/file2         # 小写的o,上下分屏打开两个文件,按ctrl + w 上下箭头进行文件切换
vim -O /xxx/file1 /xxx/file2         # 大写的O,左右分屏打开两个文件,按ctrl + w 左右箭头进行文件切换

注意事项

  1. 当vim编辑器执行的过程中意外关闭了文件,会生成对应文件的.swp文件,再次进入时显示文件已经打开,原因是服务器备份了之前修改的文件
shell
# 解决方式一: 覆盖文件
vim -r 文件名           

# 解决方式二:查看并删除swp文件
ls -la
rm -rf .文件名.swp
  1. 所有命令必须在英文键盘下输入才生效