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

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



