Linux 基础指令(三):grep、压缩打包、系统信息与 Shell 运行原理

🔥 星恒随风: 个人主页 ❄️ 个人专栏: 《指针合集》 | 《C语言基础》 | 《数据结构》 | 《机器学习导论》 | 《前端基础》 | 《python基础》 | 《C++从入门到入土》 | 《Linux的学习之旅》 ✨ 数据即知识,压缩即智能
文章目录
- [Linux 基础指令(三):grep、压缩打包、系统信息与 Shell 运行原理](#Linux 基础指令(三):grep、压缩打包、系统信息与 Shell 运行原理)
-
- 一、whereis:查找程序及其相关文件
-
- [1.1 whereis 能查什么?](#1.1 whereis 能查什么?)
- [1.2 whereis 与 which 的区别](#1.2 whereis 与 which 的区别)
- 二、alias:给命令设置别名
-
- [2.1 为什么需要别名?](#2.1 为什么需要别名?)
- [2.2 alias 的基本语法](#2.2 alias 的基本语法)
- [2.3 查看已有别名](#2.3 查看已有别名)
- [2.4 删除别名](#2.4 删除别名)
- [2.5 临时别名与永久别名](#2.5 临时别名与永久别名)
- [2.6 如何绕过别名?](#2.6 如何绕过别名?)
- 三、grep:从文本中筛选目标行
-
- [3.1 grep 是做什么的?](#3.1 grep 是做什么的?)
- [3.2 `-i`:忽略大小写](#3.2
-i:忽略大小写) - [3.3 `-n`:显示行号](#3.3
-n:显示行号) - [3.4 `-v`:反向匹配](#3.4
-v:反向匹配) - [3.5 组合选项](#3.5 组合选项)
- [3.6 grep 与管道配合](#3.6 grep 与管道配合)
- [3.7 递归搜索目录](#3.7 递归搜索目录)
- [四、zip 与 unzip:压缩和解压 ZIP 文件](#四、zip 与 unzip:压缩和解压 ZIP 文件)
-
- [4.1 压缩普通文件](#4.1 压缩普通文件)
- [4.2 递归压缩目录](#4.2 递归压缩目录)
- [4.3 查看 ZIP 包内容](#4.3 查看 ZIP 包内容)
- [4.4 解压到当前目录](#4.4 解压到当前目录)
- [4.5 解压到指定目录](#4.5 解压到指定目录)
- [4.6 覆盖问题](#4.6 覆盖问题)
- [五、rz 与 sz:本地和远程之间传输文件](#五、rz 与 sz:本地和远程之间传输文件)
-
- [5.1 上传文件](#5.1 上传文件)
- [5.2 下载文件](#5.2 下载文件)
- [六、tar:Linux 中常用的打包工具](#六、tar:Linux 中常用的打包工具)
-
- [6.1 打包和压缩不是完全相同的概念](#6.1 打包和压缩不是完全相同的概念)
- [6.2 tar 常用选项](#6.2 tar 常用选项)
- [6.3 创建 `.tar.gz` 压缩包](#6.3 创建
.tar.gz压缩包) - [6.4 查看压缩包内容](#6.4 查看压缩包内容)
- [6.5 解压到当前目录](#6.5 解压到当前目录)
- [6.6 解压到指定目录](#6.6 解压到指定目录)
- [6.7 只打包,不压缩](#6.7 只打包,不压缩)
- [6.8 排除指定文件](#6.8 排除指定文件)
- [6.9 tar 常见错误](#6.9 tar 常见错误)
- 七、bc:在终端中进行浮点计算
-
- [7.1 进入交互模式](#7.1 进入交互模式)
- [7.2 使用 scale 控制小数位](#7.2 使用 scale 控制小数位)
- [7.3 通过管道直接计算](#7.3 通过管道直接计算)
- [7.4 使用数学库](#7.4 使用数学库)
- [7.5 退出 bc](#7.5 退出 bc)
- 八、uname:查看内核与系统信息
-
- [8.1 查看内核版本](#8.1 查看内核版本)
- [8.2 查看全部信息](#8.2 查看全部信息)
- [8.3 查看硬件架构](#8.3 查看硬件架构)
- [8.4 查看发行版版本](#8.4 查看发行版版本)
- 九、终端中几个重要的快捷键
-
- [9.1 Tab:命令和路径补全](#9.1 Tab:命令和路径补全)
- [9.2 Ctrl + C:中止前台程序](#9.2 Ctrl + C:中止前台程序)
- [9.3 Ctrl + D:输入结束](#9.3 Ctrl + D:输入结束)
- [9.4 Ctrl + L:清理终端显示](#9.4 Ctrl + L:清理终端显示)
- [9.5 Ctrl + R:搜索历史命令](#9.5 Ctrl + R:搜索历史命令)
- 十、shutdown:关机与重启
-
- [10.1 立即关机](#10.1 立即关机)
- [10.2 立即重启](#10.2 立即重启)
- [10.3 延迟关机](#10.3 延迟关机)
- [10.4 取消计划任务](#10.4 取消计划任务)
- [10.5 常见替代命令](#10.5 常见替代命令)
- [十一、Shell 命令是怎样运行的?](#十一、Shell 命令是怎样运行的?)
-
- [11.1 Linux 内核不能直接面向普通用户操作](#11.1 Linux 内核不能直接面向普通用户操作)
- [11.2 Shell 是命令行解释器](#11.2 Shell 是命令行解释器)
- [11.3 Shell 与 Windows 图形界面的类比](#11.3 Shell 与 Windows 图形界面的类比)
- [11.4 常见 Shell](#11.4 常见 Shell)
- [11.5 为什么命令不存在?](#11.5 为什么命令不存在?)
- [十二、为什么 Linux 需要权限?](#十二、为什么 Linux 需要权限?)
-
- [12.1 超级用户和普通用户](#12.1 超级用户和普通用户)
- [12.2 查看当前用户](#12.2 查看当前用户)
- [12.3 切换用户](#12.3 切换用户)
- [12.4 三类文件访问者](#12.4 三类文件访问者)
- 十三、本篇总结
-
- [13.1 命令查找和简化](#13.1 命令查找和简化)
- [13.2 文本与压缩](#13.2 文本与压缩)
- [13.3 系统工具](#13.3 系统工具)
- [13.4 Shell 与权限入口](#13.4 Shell 与权限入口)
一、whereis:查找程序及其相关文件
1.1 whereis 能查什么?
前面已经学习了:
bash
which ls
which 主要在环境变量 PATH 中查找命令对应的可执行程序。
whereis 的范围更广,它通常用于查找:
text
可执行程序
源代码目录
man 手册文件
基本语法:
bash
whereis 命令名
例如:
bash
[root@xxx ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
输出中可能包含:
text
/usr/bin/ls
表示可执行程序。
text
/usr/share/man/man1/ls.1.gz
表示 ls 对应的手册页。
1.2 whereis 与 which 的区别
可以先简单记成:
text
which:查找当前 Shell 可能执行的外部命令
whereis:查找程序、手册等相关文件
对比:
bash
[root@xxx ~]# which ls
/usr/bin/ls
bash
[root@xxx ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
不过,命令还可能是:
text
Shell 内建命令
别名
Shell 函数
如果想判断一条命令到底是什么,更适合使用:
bash
type 命令名
例如:
bash
[root@xxx ~]# type -a pwd
pwd is a shell builtin
pwd is /usr/bin/pwd
二、alias:给命令设置别名
2.1 为什么需要别名?
有些命令比较长,而且经常重复使用。
例如:
bash
ls -a -l -n
如果每次都完整输入,会比较麻烦。
可以使用 alias 为它设置一个短名称:
bash
[root@xxx ~]# alias hello='ls -a -l -n'
以后输入:
bash
[root@xxx ~]# hello
Shell 会把它展开成:
bash
ls -a -l -n
2.2 alias 的基本语法
bash
alias 别名='原命令'
例如:
bash
[root@xxx ~]# alias ll='ls -alF'
[root@xxx ~]# alias cproj='cd /root/project'
执行:
bash
[root@xxx ~]# cproj
[root@xxx project]# pwd
/root/project
2.3 查看已有别名
直接执行:
bash
[root@xxx ~]# alias
可以查看当前 Shell 中定义的别名。
查看某个别名:
bash
[root@xxx ~]# alias ll
alias ll='ls -alF'
2.4 删除别名
bash
[root@xxx ~]# unalias hello
删除后,再执行:
bash
hello
Shell 就不会继续把它当作别名处理。
2.5 临时别名与永久别名
直接在终端中执行:
bash
alias ll='ls -alF'
通常只对当前 Shell 会话有效。
退出终端后,别名可能消失。
如果希望每次打开 Bash 都自动设置,可以把命令写入:
text
~/.bashrc
例如:
bash
echo "alias ll='ls -alF'" >> ~/.bashrc
然后重新加载:
bash
source ~/.bashrc
修改配置文件前,建议先备份:
bash
cp ~/.bashrc ~/.bashrc.backup
2.6 如何绕过别名?
假设 ls 被设置为:
bash
alias ls='ls --color=auto'
想临时调用外部程序,可以写:
bash
\ls
或者:
bash
command ls
三、grep:从文本中筛选目标行
3.1 grep 是做什么的?
grep 用于在文本中搜索指定模式,并输出匹配的行。
基本语法:
bash
grep [选项] 搜索内容 文件
例如,创建测试文件:
bash
[root@xxx ~]# cat > users.txt <<'EOF'
Alice Linux
Bob Windows
alice C++
Charlie Linux
EOF
查找包含 Linux 的行:
bash
[root@xxx ~]# grep 'Linux' users.txt
Alice Linux
Charlie Linux
3.2 -i:忽略大小写
默认情况下,Linux 命令通常区分大小写。
bash
[root@xxx ~]# grep 'alice' users.txt
alice C++
使用 -i:
bash
[root@xxx ~]# grep -i 'alice' users.txt
Alice Linux
alice C++
此时:
text
Alice
alice
ALICE
都会被视为匹配。
3.3 -n:显示行号
bash
[root@xxx ~]# grep -n 'Linux' users.txt
1:Alice Linux
4:Charlie Linux
前面的数字表示匹配内容位于文件的第几行。
3.4 -v:反向匹配
-v 表示输出不匹配的行:
bash
[root@xxx ~]# grep -v 'Linux' users.txt
Bob Windows
alice C++
可以把它理解为:
text
普通 grep:保留匹配项
grep -v:排除匹配项
3.5 组合选项
忽略大小写并显示行号:
bash
[root@xxx ~]# grep -in 'alice' users.txt
1:Alice Linux
3:alice C++
3.6 grep 与管道配合
查找当前目录列表中的 .txt 文件:
bash
[root@xxx ~]# ls -al | grep '\.txt'
查看进程时筛选某个程序:
bash
[root@xxx ~]# ps -ef | grep ssh
查看系统配置时排除注释和空行:
bash
grep -v '^#' config.txt | grep -v '^$'
其中:
text
^#:以 # 开头的行
^$:空行
3.7 递归搜索目录
除了 PPT 中的基础选项,实际工作中还经常使用:
bash
grep -r '目标字符串' 目录
例如:
bash
[root@xxx project]# grep -rn 'TODO' src
含义是:
text
-r:递归搜索子目录
-n:显示行号
这在查找项目代码中的函数名、错误信息和待办标记时很有用。
四、zip 与 unzip:压缩和解压 ZIP 文件
4.1 压缩普通文件
基本语法:
bash
zip 压缩包名称.zip 文件
例如:
bash
[root@xxx ~]# touch file1.txt file2.txt
[root@xxx ~]# zip files.zip file1.txt file2.txt
查看结果:
bash
[root@xxx ~]# ls
file1.txt file2.txt files.zip
4.2 递归压缩目录
创建测试目录:
bash
[root@xxx ~]# mkdir -p test2/src
[root@xxx ~]# touch test2/README.md test2/src/main.cpp
压缩整个目录:
bash
[root@xxx ~]# zip -r test2.zip test2
其中:
text
-r:递归处理目录中的文件和子目录
相比:
bash
zip test2.zip test2/*
直接使用:
bash
zip -r test2.zip test2
通常更加完整,也能保留最外层目录结构。
4.3 查看 ZIP 包内容
bash
[root@xxx ~]# unzip -l test2.zip
-l 表示只列出压缩包内容,不进行解压。
4.4 解压到当前目录
bash
[root@xxx ~]# unzip test2.zip
4.5 解压到指定目录
bash
[root@xxx ~]# mkdir extract
[root@xxx ~]# unzip test2.zip -d extract
其中:
text
-d:指定解压目录
4.6 覆盖问题
当目标文件已经存在时,unzip 可能询问是否覆盖。
可以根据需要选择:
text
y:覆盖当前文件
n:不覆盖当前文件
A:后续全部覆盖
N:后续全部不覆盖
不要在不清楚压缩包内容时直接覆盖已有项目。
五、rz 与 sz:本地和远程之间传输文件
PPT 中提到了 rz、sz 工具,它们主要用于支持 ZMODEM 的终端客户端与 Linux 主机之间传输文件。
在部分基于 RPM 的系统中,可以安装:
bash
[root@xxx ~]# dnf install -y lrzsz
旧系统也可能使用:
bash
yum install -y lrzsz
Debian 或 Ubuntu 可以使用:
bash
apt install -y lrzsz
5.1 上传文件
bash
[root@xxx ~]# rz
支持该功能的客户端通常会弹出文件选择窗口。
5.2 下载文件
bash
[root@xxx ~]# sz file.txt
不过,并不是所有终端都支持 rz 和 sz。
现在更通用的文件传输方式包括:
text
scp
sftp
rsync
Git
终端客户端自带文件管理器
因此,rz 和 sz 可以作为一种补充方式了解。
六、tar:Linux 中常用的打包工具
6.1 打包和压缩不是完全相同的概念
打包是把多个文件和目录组织成一个归档文件:
text
多个文件
↓
一个 tar 包
压缩是在数据编码层面减少文件体积:
text
tar 包
↓ gzip
tar.gz 文件
tar 可以单独打包,也可以配合 gzip、bzip2 等压缩工具。
6.2 tar 常用选项
| 选项 | 含义 |
|---|---|
-c |
创建归档文件 |
-x |
解开归档文件 |
-t |
查看归档文件内容 |
-z |
使用 gzip |
-j |
使用 bzip2 |
-v |
显示处理过程 |
-f |
指定归档文件名 |
-C |
切换到指定目录后再处理 |
可以把最常见的三组组合记成:
text
-c:创建
-t:查看
-x:解开
6.3 创建 .tar.gz 压缩包
bash
[root@xxx ~]# tar -czvf project.tar.gz project
选项含义:
text
-c:创建归档
-z:使用 gzip 压缩
-v:显示过程
-f:后面紧跟压缩包文件名
命令结构是:
text
tar -czvf 压缩包名称 要打包的目录
6.4 查看压缩包内容
bash
[root@xxx ~]# tar -tzvf project.tar.gz
此时不会真正解压,只会列出其中的文件。
6.5 解压到当前目录
bash
[root@xxx ~]# tar -xzvf project.tar.gz
6.6 解压到指定目录
bash
[root@xxx ~]# mkdir extract
[root@xxx ~]# tar -xzvf project.tar.gz -C extract
-C 后面的目标目录必须已经存在。
6.7 只打包,不压缩
bash
[root@xxx ~]# tar -cvf project.tar project
解包:
bash
[root@xxx ~]# tar -xvf project.tar
查看:
bash
[root@xxx ~]# tar -tvf project.tar
6.8 排除指定文件
bash
tar --exclude='project/build' \
-czvf project.tar.gz project
这个命令会打包 project,但排除:
text
project/build
6.9 tar 常见错误
忘记 -f
错误:
bash
tar -czv project.tar.gz project
应写成:
bash
tar -czvf project.tar.gz project
把文件名放错位置
更容易阅读的结构是:
bash
tar -czvf archive.tar.gz source
解压前不看内容
来源不明的压缩包,建议先执行:
bash
tar -tzvf archive.tar.gz
确认它会释放哪些文件,再决定解压位置。
七、bc:在终端中进行浮点计算
Shell 自带的整数运算不适合直接处理一般浮点数。
bc 是一个命令行计算器,可以进行浮点计算。
7.1 进入交互模式
bash
[root@xxx ~]# bc
输入:
text
1 + 2
输出:
text
3
输入:
text
10 / 3
默认可能只得到整数结果:
text
3
7.2 使用 scale 控制小数位
text
scale=4
10 / 3
输出:
text
3.3333
7.3 通过管道直接计算
bash
[root@xxx ~]# echo 'scale=4; 10 / 3' | bc
3.3333
计算圆面积:
bash
[root@xxx ~]# echo 'scale=4; 3.1415 * 5 * 5' | bc
78.5375
7.4 使用数学库
bash
[root@xxx ~]# echo 'scale=4; sqrt(2)' | bc -l
1.4142
-l 会加载标准数学库,并设置较高的默认精度。
7.5 退出 bc
在交互模式中输入:
text
quit
也可以按:
text
Ctrl + D
表示输入结束。
八、uname:查看内核与系统信息
8.1 查看内核版本
bash
[root@xxx ~]# uname -r
可能输出:
text
6.8.0-xx-generic
这里显示的是 Linux 内核版本,不一定等同于发行版版本。
8.2 查看全部信息
bash
[root@xxx ~]# uname -a
通常会输出:
text
内核名称
主机名
内核版本
编译信息
硬件架构
操作系统名称
8.3 查看硬件架构
bash
[root@xxx ~]# uname -m
x86_64
常见架构包括:
text
x86_64
aarch64
riscv64
8.4 查看发行版版本
uname 主要查看内核和硬件信息。
发行版信息更适合查看:
bash
[root@xxx ~]# cat /etc/os-release
系统安装了 lsb_release 时,也可以使用:
bash
[root@xxx ~]# lsb_release -a
需要区分:
text
uname -r:内核版本
/etc/os-release:发行版信息
九、终端中几个重要的快捷键
9.1 Tab:命令和路径补全
输入:
bash
[root@xxx ~]# cd /ro
按下 Tab,Shell 可能自动补全为:
bash
cd /root/
如果存在多个匹配项,连续按两次 Tab,通常会显示候选内容。
Tab 可以补全:
text
命令名称
文件名称
目录路径
部分命令参数
9.2 Ctrl + C:中止前台程序
例如执行:
bash
[root@xxx ~]# ping 127.0.0.1
程序会持续运行。
按下:
text
Ctrl + C
可以向前台程序发送中断信号,请求它终止。
9.3 Ctrl + D:输入结束
Ctrl + D 通常表示:
text
EOF
End Of File
输入结束
例如在 bc 中按 Ctrl + D 可以退出。
在空命令行提示符下,Ctrl + D 通常也能退出当前 Shell,效果类似:
bash
exit
9.4 Ctrl + L:清理终端显示
text
Ctrl + L
效果通常类似:
bash
clear
它只是清理当前终端显示,并不会删除之前执行过的命令记录。
9.5 Ctrl + R:搜索历史命令
按下:
text
Ctrl + R
再输入部分关键字,可以反向搜索历史命令。
例如输入:
text
tar
Shell 会尝试找到之前执行过的 tar 命令。
十、shutdown:关机与重启
10.1 立即关机
bash
[root@xxx ~]# shutdown -h now
其中:
text
-h:停止系统并关机
now:立即执行
10.2 立即重启
bash
[root@xxx ~]# shutdown -r now
其中:
text
-r:重启系统
10.3 延迟关机
十分钟后关机:
bash
[root@xxx ~]# shutdown -h +10
指定时间关机:
bash
[root@xxx ~]# shutdown -h 23:30
10.4 取消计划任务
bash
[root@xxx ~]# shutdown -c
10.5 常见替代命令
关机:
bash
poweroff
重启:
bash
reboot
这些命令通常需要管理员权限。
连接远程服务器时,不要随意执行关机或重启命令,否则可能造成:
text
SSH 连接断开
业务服务停止
未保存数据丢失
其他用户任务中断
十一、Shell 命令是怎样运行的?
11.1 Linux 内核不能直接面向普通用户操作
严格来说,Linux 指的是内核。
内核负责:
text
进程管理
内存管理
文件系统
设备管理
网络
系统调用
普通用户不会直接向内核提交底层数据结构,而是通过 Shell、图形界面和应用程序使用内核能力。
11.2 Shell 是命令行解释器
Shell 可以理解为:
text
用户与 Linux 内核之间的命令翻译层
执行:
bash
[root@xxx ~]# ls -l
大致过程如下:
text
用户输入 ls -l
↓
Shell 解析命令和参数
↓
判断是否为别名、函数或内建命令
↓
在 PATH 中寻找外部程序
↓
创建进程运行 /usr/bin/ls
↓
程序通过系统调用访问目录
↓
内核返回文件信息
↓
ls 格式化结果
↓
Shell 和终端将结果显示给用户
11.3 Shell 与 Windows 图形界面的类比
在 Windows 中,我们可能通过:
text
双击磁盘
点击文件夹
右键复制
点击删除
完成操作。
这并不是用户直接操作 Windows 内核,而是通过图形界面发出请求。
Linux Shell 承担类似角色,只不过交互形式由鼠标点击变成了文本命令。
11.4 常见 Shell
Linux 中常见的 Shell 包括:
text
Bash
Zsh
Fish
Dash
查看当前用户默认 Shell:
bash
[root@xxx ~]# echo "$SHELL"
/bin/bash
查看当前进程:
bash
[root@xxx ~]# echo "$0"
-bash
11.5 为什么命令不存在?
执行:
bash
[root@xxx ~]# mycommand
bash: mycommand: command not found
可能的原因包括:
text
命令没有安装
命令名拼写错误
程序所在目录不在 PATH 中
文件没有执行权限
当前目录不在 PATH 中
假设当前目录中存在:
text
hello.sh
通常不能只输入:
bash
hello.sh
而应明确写:
bash
./hello.sh
因为 Shell 默认不会自动在当前目录中寻找程序。
十二、为什么 Linux 需要权限?
Linux 是一个多用户系统。
一台主机中可能同时存在:
text
系统管理员
开发人员
运维人员
普通用户
系统服务账号
数据库账号
Web 服务账号
如果任何用户都能随意修改所有文件,就会产生严重问题:
text
普通用户删除系统文件
一个用户读取另一个用户的私人数据
Web 服务修改数据库配置
被入侵的程序控制整个系统
权限系统的目标就是回答两个问题:
text
谁正在访问?
他能够做什么?
12.1 超级用户和普通用户
Linux 用户可以粗略分成:
text
超级用户 root
普通用户
root 拥有很高的系统管理权限,终端提示符通常是:
bash
[root@xxx ~]#
普通用户提示符通常是:
bash
[student@xxx ~]$
区别之一是最后的符号:
text
#:通常表示 root
$:通常表示普通用户
12.2 查看当前用户
bash
[root@xxx ~]# whoami
root
查看用户和组信息:
bash
[root@xxx ~]# id
uid=0(root) gid=0(root) groups=0(root)
12.3 切换用户
bash
[root@xxx ~]# su - student
[student@xxx ~]$
其中:
text
su:切换用户
- :同时加载目标用户的登录环境
返回原用户:
bash
[student@xxx ~]$ exit
[root@xxx ~]#
12.4 三类文件访问者
对一个具体文件来说,Linux 会把访问者分成三类:
text
u:user,文件拥有者
g:group,文件所属组中的用户
o:others,其他用户
例如:
bash
[root@xxx ~]# ls -l demo.txt
-rw-r----- 1 root developers 120 Aug 2 18:00 demo.txt
这里:
text
拥有者:root
所属组:developers
其他用户:既不是 root,也不在 developers 组中的用户
后面的权限判断,就是分别为这三类用户设置:
text
读权限
写权限
执行权限
十三、本篇总结
本文介绍的内容可以分成四组。
13.1 命令查找和简化
text
whereis:查找程序和手册等相关文件
alias:为复杂命令设置短名称
13.2 文本与压缩
text
grep:筛选匹配行
zip/unzip:处理 ZIP 压缩包
tar:打包、查看和解包
13.3 系统工具
text
bc:终端计算器
uname:查看内核和硬件信息
shutdown:关机或重启
13.4 Shell 与权限入口
text
Shell 负责解释用户命令
内核负责执行底层资源管理
权限系统判断谁可以对文件做什么
整个流程可以看作:
text
用户输入命令
↓
Shell 解析
↓
程序调用操作系统
↓
内核检查访问权限
↓
允许或拒绝操作