欢迎光临
我们一直在努力

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

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 解析

程序调用操作系统

内核检查访问权限

允许或拒绝操作

赞(0)
未经允许不得转载:171主机测评 » Linux 基础指令(三):grep、压缩打包、系统信息与 Shell 运行原理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址