第2章 新手必须掌握的 Linux 命令
章节简述
经验丰富的运维人员总能通过巧妙搭配适当的命令与参数,游刃有余地满足工作需求, 在迅速实现目标的同时,最大限度地节约系统资源。本章首先解读系统内核与 Shell 终端的交互作用,继而阐释 Bash 解释器的四大核心优势,并深入讲解命令、参数、对象的格式与应用技巧,让每位读者都能够准确地执行 Linux 命令。
本章精挑细选出 50 多个对初学者至关重要的 Linux 命令,涉及系统运行、状态监控、目录管理、文件处理、数据打包压缩及搜索等多个关键主题。我们将这些命令细分至各个小节, 使读者能够有条不紊地掌握这些基础命令,逐个“战胜”一条条的命令,为今后学习更复杂的命令和服务做好必要的知识铺垫。
此外,我们还特意搭建了配套站点(https://www.linuxcool.com),收集整理了 3000 余条常用命令。读者可将该站点添加到浏览器的收藏夹中,做到常看常新,这样一来,即使平时遇到陌生命令也不用再害怕了。
2.1 强大好用的 Shell
一台完整的计算机是由运算器、控制器、存储器、输入/输出等多种硬件设备共同组成的, 而能让这些硬件设备各司其职且又能协同运行的东西就是系统内核。Linux 系统内核负责管理硬件资源、保护系统安全、控制进程执行、管理内存,以及处理系统调用等关键任务,对系统的正常运行起着至关重要的作用。
与编辑、修改 Windows 系统的注册表类似,直接改动 Linux 的内核参数不仅对技术要求很高,而且稍有不慎还有可能导致系统直接崩溃。因此不建议大家直接编辑内核中的 参数,而是用基于系统调用接口开发出来的程序或服务来管理计算机,以满足日常的工作 需要。
如图 2-1 所示,人类是无法直接控制硬件的(想象一个人捧着块磁盘自言自语的滑稽场景),硬件设备由系统内核直接管理,但由于内核的复杂性,在访问时存在较大的风险,因此用户不能直接访问内核。虽然通过调用系统提供的 API 就能实现某个功能,但哪怕是实现“将一条信息通过互联网传输给别人”这样简单的任务,都要手动调用几十次 API,使用起来太不切实际。而最外层的服务程序则是最贴近于用户端的,这些服务程序是集成了大量 API 的完整软件,微信、QQ 就是这样的服务程序。
图2-1 用户与硬件
讲到这里,相信大家已经能明白服务程序在用户和硬件之间扮演的重要角色了。如果把整台计算机比喻成人类社会,那么服务程序就是一名翻译官,负责将用户提出的需求翻译成硬件能够接收的指令代码,然后再将处理结果以用户能够读懂的格式进行反馈。这样一来一回,用户就能使用硬件资源了。

看到被一层层“包裹”起来的硬件设备,大家有没有感觉像一只蜗牛的壳呢?英文中的“壳”叫作 Shell,业界也将用户终端程序称为Shell,方便好记。
Shell 是终端程序的统称,它充当了人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端程序,它就会调用相应的程序服务去完成某些工作。多数主流 Linux 系统,包括红帽 RHEL 系统默认使用 Bash(Bourne-Again Shell)作为终端解释器。Bash 不仅支持基本的命令执行,还提供脚本编程功能,允许用户编写复杂的批处理脚本,实现自动化任务。此外, Bash 支持历史命令跟踪、作业控制,以及强大的环境变量管理功能,这使其成为 Linux 环境中最受欢迎的 Shell 之一。总结来说,Bash 被广泛选择和使用,主要得益于它具备的四大核心优势:
可通过上下方向键调取执行过的 Linux 命令;
命令或参数仅需输入前几位就可以用 Tab 键补全;
具有强大的批处理脚本;
支持强大的环境变量管理功能。
回顾 Linux 系统的发展历史,20 世纪 70 年代,AT&T 公司对 UNIX 系统进行商业化运作,其中包含了当时被广泛使用的 sh(Bourne Shell)命令解释器。由于 GNU 项目秉持开源精神, 反对版权限制,因此迫切需要一个开源的替代品,随后 Bash 解释器于 1989 年应运而生。Bash 不仅实现了 Bourne Shell 的全部功能,还进行了大量改进,因此迅速赢得了运维专业人员的青睐。在今后的学习和工作中,大家可以细细体会 Linux 系统命令行的强大功能和魅力,真正从心底里爱上它们。
Tips :
Shell 与Bash 是包含与被包含的关系。举例来说,在社会中有翻译官这个职业,它是由许多从业者共同组成的职业名称,而Bash 则是其中一个出色的成员,是 Shell 终端程序中的一份子。
不可否认的是,Linux 系统中的一些图形化工具(比如逻辑卷管理器[Logical Volume Manager,LVM])确实非常好用,极大地降低了运维人员出错的概率,值得称赞。但是,很多图形化工具实际上是通过调用命令脚本来实现相应的功能,或往往只是为了完成特定任务而设计的,缺乏 Linux 命令原有的灵活性及可控性。再者,图形化工具相较于 Linux 命令行界面会更加消耗系统资源,因此经验丰富的运维人员甚至都不会在 Linux 系统中安装图形化工具,而是在进行运维工作时直接通过命令行模式远程连接过去。不得不说,这样做确实挺高效的。
2.2 执行命令的必备知识
既然 Linux 系统中已经有了 Bash 这么好用的“翻译官”,那么接下来就有必要好好学习一下怎么跟它沟通了。要想准确、高效地完成任务,仅依赖命令本身是不够的,还应该根据实际情况灵活调整命令的各种参数。
例如,在 Linux 系统中,虽然一些通用的工具或命令能够完成某些任务,但可能并不高效或精准。就像切寿司时用菜刀虽然也能完成切割,但会出现米粒撒落满地的情况,不能很好地满足特定需求。而专门的寿司刀,其设计上用于透气的圆孔等独特构造,是为了更好地适应切寿司这一场景而精心设置的特殊“参数”。同样,Linux 系统中有许多像寿司刀一样专门针对各种特定任务设计的命令和工具,它们有着各自独特的参数和功能。当你学完本书并具备一定的工作经验之后,一定能够领悟 Linux 命令的奥秘,明白如何根据不同的任务场景选择最合适的命令和参数,从而高效地完成工作。
常见的执行 Linux 命令的格式是下面这样的:
命令名称 [命令参数] [命令对象]
命令名称:就是语法中的“动词”,表达的是想要做的事情,例如创建用户、查看文件、重启系统等操作。
命令参数:用于对命令进行调整,让被“修改”过的命令能更好地贴合工作需求, 达到事半功倍的效果。就像买衣服一样,衣服的尺码总会感觉偏大或偏小,要么只能将就着穿,要么就再裁剪修改一下,而这种对命令进行“裁剪”的行为就是加参数。
例如创建一个指定 UID 编号为 888 的用户、仅查看文件的前 20 行等。命令参数可以使用长格式(完整的选项名称),也可以使用短格式(单个字母的缩写),两者分别用“--”与“-” 作为前缀,示例如表 2-1 所示。
表2-1 Linux 命令参数的长格式与短格式示例
格式种类 | 示例 |
---|---|
长格式 | man --help |
短格式 | man -h |
命令对象:一般指要处理的文件、目录、用户等资源名称,也就是命令执行后的“承受方”。例如创建一位叫小明的用户、查看一个叫工资表的文件、重启一个 IP 为192.168.10.10 的系统等。
Tips :
命令名称、命令参数与命令对象之间要用空格进行分隔,且字母严格区分大小写。
在 Linux 相关的图书中,我们会约定俗成地将可选择的、可加或可不加的、非必需的参数使用中括号引起来,例如“ls [命令对象]”;而命令所要求的、必须有的参数或对象值,则不带中括号。这样一来,读者可以更好地理解下文中出现的命令。
在初学 Linux 系统时不会执行命令大多是因为参数比较复杂,参数值需要随不同的命令和实际工作情况发生改变。因此,有读者现在可能会想:“Linux 系统中有那么多命令,我怎么知道某个命令是干吗用的?在日常工作中遇到了一个不熟悉的 Linux 命令,我又怎样才能知道它有哪些参数可用呢?”接下来,我们拿 man 这个命令作为本书中的第一个 Linux 命令向读者进行介绍。对于真正的零基础读者,可以通过图 2-2 到图 2-5 来学习如何在 RHEL 10 系统中执行 Linux 命令。
如图 2-2 所示,登录时应选择 Super User 选项,即root 管理员账户,随后输入设置过的密码,忘记的话可以返回去看图 1-40。
图2-2 切换至root管理员身份
如果使用 linuxprobe 用户登录系统,那么本章后面的一些命令会因为权限不足而无法执行,而我们需要有足够的权限才能完成接下来的实验。至于同学们关心的“root 管理员和普通用户有什么区别,在生产环境时又该如何选择”的疑问,将会在第 5 章慢慢讲给大家。
Tips :
登录成功后,如系统提示未注册,请单击右上角的×按钮关闭即可。除非你想付费购买红帽公司的订阅服务,获得最新软件或技术支持,否则没必要理会。后续我们会在本地构建软件仓库,各类实验可流畅进行,丝毫不受影响。
单击桌面左上角红帽形状的按钮,在弹出的菜单中选择命令行终端,即可打开 Bash 解释器,如图 2-3 所示。
图2-3 打开命令行终端
在命令行终端中输入 man man 命令,查看 man 命令自身的帮助信息,记得中间还有空格呦,如图 2-4 所示。
图2-4 查看man命令的帮助信息
敲击回车键后即可看到如图 2-5 所示的帮助信息。想要退出,则敲击键盘q 键即可。
图2-5 man命令的帮助信息
小试牛刀成功。大家是不是热情倍增?!不过还是要提醒大家,Linux 系统中的命令、参数、对象都是严格区分大小写的。比如,分别执行几次man 命令,大家能看得出哪个命令是正确的吗?
root@linuxprobe:~# Man
bash: Man: command not found...
Similar command is: 'man'
root@linuxprobe:~# MAN
bash: MAN: command not found...
Similar command is: 'man'
root@linuxprobe:~# man
What manual page do you want?
For example, try 'man man'.
执行man 命令后显示的常用按键及作用如表 2-2 所示。
表 2-2 常用按键及作用
按键 | 作用 |
---|---|
空格键 | 向下翻一页 |
Page Down | 向下翻一页 |
Page Up | 向上翻一页 |
Home | 直接前往首页 |
End | 直接前往尾页 |
/ | 从上至下搜索某个关键词,如/linux |
? | 从下至上搜索某个关键词,如?linux |
n | 定位到下一个搜索到的关键词 |
N | 定位到上一个搜索到的关键词 |
b | 向上翻一页 |
g | 跳转到第一页 |
h | 显示帮助界面 |
u | 向上滚动半页 |
d | 向下滚动半页 |
q | 退出帮助文档 |
一般来讲,使用man 命令查看到的帮助信息都会很长很多,如果读者不了解帮助文档的结构和操作方法,乍一看到这么多信息可能会感到相当困惑。man 命令的帮助信息的结构以及意义如表 2-3 所示。
表 2-3 man 命令的帮助信息的结构以及意义
结构名称 | 意义 |
---|---|
NAME | 命令的名称 |
SYNOPSIS | 参数的大致使用方法 |
DESCRIPTION | 介绍说明 |
EXAMPLES | 演示(附带简单说明) |
OVERVIEW | 概述 |
DEFAULTS | 默认的功能 |
OPTIONS | 具体的可用选项(带介绍) |
ENVIRONMENT | 环境变量 |
FILES | 用到的文件 |
SEE ALSO | 相关的资料 |
HISTORY | 维护历史与联系方式 |
需要多说一句的是,在输入命令前就已经存在的“root@linuxprobe:#”这部分内容是终端提示符,它用于向用户展示一些基本的信息—当前登录用户名为 root,简要的主机名是 linuxprobe,所在目录是(这里的~是指用户家目录,第 6 章会讲解),#表示管理员身份,如果是$则表示普通用户,相应的权限也会小一些。如图 2-6 所示。
图2-6 终端提示符示意图
额外的 4 个快捷键/组合键小技巧
在进行 Linux 运维工作时,掌握一些实用的快捷键和组合键,能够大幅提升工作效率, 让命令行操作更加便捷流畅。接下来,为大家详细介绍 4 个非常实用的快捷键/组合键小技巧, 熟练运用它们,将帮助你在 Linux 系统的命令行环境中游刃有余。
Tab键
在Bash 解释器的快捷键中,Tab 键绝对是使用频率最高的,它能够实现对命令、参数或文件的内容补全。例如,如果想执行 reboot 重启命令,但一时想不起该命令的完整拼写, 则可以这样输入:
root@linuxprobe:~# re<Tab键><Tab键>
read recode-sr-latin resizecons
readarray red resizepart
readelf rename resolvectl
readlink renew-dummy-cert restorecon
readonly renice restorecon_xattr
readprofile repquota return
realm rescan-scsi-bus.sh rev
realpath reset
reboot resize2fs
root@linuxprobe:~# reb<Tab键>
root@linuxprobe:~# reboot
在上面的实验中,先输入了两个字母 re,随后敲击了两下 Tab 键。由于以 re 开头的命令不止一个,所以系统将所有以 re 开头的命令全部显示了出来。而第二次输入 reb 后再敲击 Tab 键,由于此时没有以 reb 开头的其他命令,所以系统就显示出了完整的 reboot 重启命令。
对于文件名也是一样的操作—只需要输入前面的一部分名称,且不存在多个以这部分名称开头的文件名,系统就会自动补全。这样不仅速度快,而且避免了手动输入有可能出错的问题。
Ctrl+c组合键
当同时按下键盘上的 Ctrl 和字母 C 的时候,意味着终止当前进程的运行。假如执行了一个错误命令,或者是执行某个命令后迟迟无法结束,这时就可以冷静地按下 Ctrl+C 组合键,命令行终端的控制权会立刻回到我们手中。
下述命令的执行效果是每 1s 刷新一次系统负载情况(先不用管命令的作用),直到按下Ctrl+C 组合键时才停止运行。
root@linuxprobe:~# watch -n 1 uptime
Every 1.0s: uptime linuxprobe.com: Mon Mar 10 20:05:39 2025
20:05:10 up 46 min, 2 users, load average: 0.06, 0.05, 0.01
<Ctrl>+<c>
root@linuxprobe:~#
Ctrl+d组合键
当同时按下键盘上的 Ctrl 和字母 D 的时候,表示键盘输入结束。
Ctrl+l组合键
当同时按下键盘上的 Ctrl 和字母 L 的时候,会清空当前终端中已有的内容(相当于清屏操作)。
从现在开始,本书后面的内容都是重磅内容。本书将会带领读者掌握大约 200 个常用的Linux 命令,这些热门命令是以 www.linuxcool.com 的查询阅览数据为基础筛选出来的。当然, 将这些命令全都放到第 2 章讲完肯定不现实,所以刘遄老师根据十多年的运维经验优先筛选出了 50 多个高频使用的基础命令。由于后面的章节中会反复用到这些命令,因此大家需要好好学习并掌握它们,这样才能在后面的学习中游刃有余。加油!
2.3 常用系统工作命令
你现在阅读的这本书是刘遄老师在经历了数十期的培训授课后总结而成的,你可能无法在本节中找到某些之前见过的命令。但不用担心,之所以这样安排,原因是我们在努力地将Linux 命令与实战相结合,真正让你在实操中理解技术,而不是单纯地把命令堆砌到书中让你去硬背。
1.echo命令
echo 命令用于在终端设备上输出字符串或变量提取后的值,语法格式为“echo [字符串] [$变量]”。
这是 Linux 系统中最常用的命令之一,它的操作非常简单,执行“echo 字符串”或“echo $变量”就行,其中$符号的意思是提取变量的实际值,以便后续的输出操作。
例如,把指定字符串“LinuxProbe.com”输出到终端屏幕的命令为:
root@linuxprobe:~# echo LinuxProbe.com
该命令会在终端屏幕上显示如下信息:
LinuxProbe.com
下面使用“$变量”的方式提取出变量 SHELL 的值,并将其输出到屏幕上:
root@linuxprobe:~# echo $SHELL
/bin/bash
2.date命令
date 命令用于显示或设置系统的时间与日期,语法格式为“date [参数] [+指定的格式] [时间]”。
用户只需在强大的 date 命令后输入以“+”号开头的参数,即可按照指定格式输出系统的时间或日期,这样在日常工作时便可以把备份数据的命令与指定格式输出的时间信息结合到一起。例如,把打包后的文件自动按照“年-月-日”的格式打包成 backup-2025-05-18.tar.gz,用户只需要看一眼文件名就能大致了解每个文件的备份时间了。date 命令中常见的参数及其作用如表 2-4 所示。
表2-4 date 命令中常见的参数及其作用
参数 | 作用 |
---|---|
%S | 秒(00~59) |
%M | 分钟(00~59) |
%H | 小时(00~23) |
%I | 小时(00~12) |
%m | 月份(1~12) |
%p | 显示出 AM 或PM |
%a | 缩写的工作日名称(例如 Sun) |
%A | 完整的工作日名称(例如 Sunday) |
%b | 缩写的月份名称(例如 Jan) |
%B | 完整的月份名称(例如 January) |
%y | 简写年份(例如 25) |
%Y | 完整年份(例如 2025) |
%d | 本月中的第几天 |
%j | 今年中的第几天 |
%n | 换行符(相当于按下回车键) |
%t | 跳格(相当于按下 Tab 键) |
按照默认格式查看当前系统时间的 date 命令如下所示:
root@linuxprobe:~# date
Mon Mar 10 08:36:57 PM CST 2025
按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的 date 命令如下所示:
root@linuxprobe:~# date "+%Y-%m-%d %H:%M:%S"
2025-03-10 20:37:09
将系统的当前时间设置为 2025 年 5 月 18 日 8 点 30 分的 date 命令如下所示:
root@linuxprobe:~# date -s "20250518 8:30:00"
Sun May 18 08:30:00 AM CST 2025
date 命令中的参数%j 可用来查看今天是当年中的第几天。这个参数能够很好地区分备份时间的早晚,即数字越大,越靠近当前时间。该参数的使用方式以及显示结果如下所示:
root@linuxprobe:~# date "+%j"
138
3.timedatectl命令
timedatectl 命令用于设置系统的时间,英文全称为 time date control,语法格式为“timedatectl [参数]”。
发现电脑时间跟实际时间不符?如果只差几分钟的话,我们可以直接调整。但是,如果差几个小时,那么除了调整当前的时间,还有必要检查一下时区了。timedatectl 命令中常见的参数及作用如表 2-5 所示。
表 2-5 timedatectl 命令中常见的参数以及作用
参数 | 作用 |
---|---|
status | 显示状态信息 |
list-timezones | 列出已知时区 |
set-time | 设置系统时间 |
set-timezone | 设置生效时区 |
set-ntp | 设置 NTP 服务 |
查看系统时间与时区的方法如下:
root@linuxprobe:~# timedatectl status
Local time: Sun 2025-05-18 08:32:23 CST
Universal time: Sun 2025-05-18 00:32:23 UTC
RTC time: Mon 2025-03-10 12:39:43
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
NTP service: active
RTC in local TZ: no
如果你查到的时区不是上海(Asia/Shanghai),可以手动进行设置:
root@linuxprobe:~# timedatectl set-timezone Asia/Shanghai
如果时间还是不正确,可再手动修改系统日期,不过要记得先关闭 NTP 同步功能,否则手动修改后的时间可能会被自动同步回原来的时间:
root@linuxprobe:~# timedatectl set-ntp false
root@linuxprobe:~# timedatectl set-time 2025-05-18
而如果想修改时间的话,也很简单:
root@linuxprobe:~# timedatectl set-time 9:30
root@linuxprobe:~# date
Sun May 18 09:30:02 AM CST 2025
4.reboot命令
reboot 命令用于重启系统,输入该命令后按回车键执行即可。
由于重启计算机这种操作会涉及硬件资源的管理权限,普通用户在执行该命令时可能会被拒绝,因此最好是以 root 管理员的身份来重启。reboot 的命令如下:
root@linuxprobe:~# reboot
5.poweroff命令
poweroff 命令用于关闭系统,输入该命令后按回车键执行即可。
与上面相同,该命令也会涉及硬件资源的管理权限,因此最好还是以 root 管理员的身份来关闭计算机,其命令如下:
root@linuxprobe:~# poweroff
6.wget命令
wget 命令用于在终端命令行中下载网络文件,英文全称为 World Wide Web get,语法格式为“wget [参数] 网址”。
借助于 wget 命令,可以无须打开浏览器,直接在命令行界面中就能下载文件。如果你没有 Linux 系统的管理经验,当前只需了解一下 wget 命令的参数以及作用,然后看一眼下面的演示实验就够了,切记不要急于求成。后面章节将逐步讲解Linux 系统的配置管理方法, 可以在掌握了网卡的配置方法后再来进行这个实验。表 2-6 所示为wget 命令中的参数以及参数的作用。
表 2-6 wget 命令中的参数以及作用
参数 | 作用 |
---|---|
-b | 后台下载模式 |
-P | 下载到指定目录 |
参数 | 作用 |
-t | 最大尝试次数 |
-c | 断点续传 |
-p | 下载页面所需的资源(如 CSS、JS、图片等) |
Tips :
由于本实验需要从外部网络下载文件,但虚拟机默认是无法连接外网的,在操作后会提示响应超时的报错,因此可先不进行实操。
尝试使用 wget 命令从本书的配套站点中下载本书最新的PDF 格式的电子文档。执行该命令后的下载效果如下::
root@linuxprobe:~# wget https://www.linuxprobe.com/docs/LinuxProbe.pdf
--2025-05-18 09:36:47-- https://www.linuxprobe.com/docs/LinuxProbe.pdf
Resolving www.linuxprobe.com (www.linuxprobe.com)... 117.72.45.242
Connecting to www.linuxprobe.com (www.linuxprobe.com)|117.72.45.242|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 23335661 (22M) [application/pdf]
Saving to: ‘LinuxProbe.pdf’
LinuxProbe.pdf 100%[===================>] 22.25M 1.54MB/s in 14s
2025-05-18 09:37:02 (1.54 MB/s) - ‘LinuxProbe.pdf’ saved [23335661/23335661]
接下来,使用 wget 命令递归下载 www.linuxprobe.com 网站内的所有页面数据以及文件, 下载完后会自动保存到当前路径下一个名为 www.linuxprobe.com 的目录中。该命令的执行结果如下:
root@linuxprobe:~# wget -r -p https://www.linuxprobe.com
--2025-05-18 09:37:29-- https://www.linuxprobe.com/
Resolving www.linuxprobe.com (www.linuxprobe.com)... 117.72.45.242
Connecting to www.linuxprobe.com (www.linuxprobe.com)|117.72.45.242|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘www.linuxprobe.com/index.html’
www.linuxprobe.com/ [ <=> ] 67.40K --.-KB/s in 0.008s
………………省略部分输出信息………………
7.ps命令
ps 命令用于查看系统中的进程状态,英文全称为process status,语法格式为“ps [参数]”。
估计读者在第一次执行这个命令时都要惊呆一下—怎么会有这么多输出值,这可怎么看得过来?其实,高手通常会将 ps 命令与第 3 章的管道符技术搭配使用,用来抓取与某个指定服务进程相对应的 PID。ps 命令中的常见参数以及作用如表 2-7 所示。
表 2-7 ps 命令中的常见参数以及作用
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
Linux 系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在 Linux 系统中有 5 种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。
R(运行):进程正在运行或在运行队列中等待。
S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
D(不可中断):进程处于不可中断睡眠状态,通常因等待 IO 资源释放而无法终止。
Z(僵死):进程已经终止,但进程描述符依然存在,直到父进程调用 wait4()系统函数将进程释放。
T(停止):进程收到停止信号后停止运行。
除了上面 5 种常见的进程状态,进程还有可能是高优先级(<)、低优先级(N)、被锁进内存(L)、包含子进程(s)以及多线程(l)这 5 种补充形式。
执行 ps aux 命令后通常会看到如表 2-8 所示的进程状态。这里只列举了部分输出值, 且正常的输出值中不包括中文注释。
表 2-8 进程状态
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
用户 | 进程ID | CPU占用率 | 内存占用率 | 虚拟内存大小 | 常驻内存大小 | 终端 | 状态 | 启动时间 | 运行时间 | 命令 |
root | 1 | 0.3 | 0.6 | 52272 | 24944 | ? | Ss | 09:32 | 0:01 | /usr/lib/systemd/systemd --switched-root --system --deserialize=44 rhgb |
root | 2 | 0.0 | 0.0 | 0 | 0 | ? | S | 09:32 | 0:00 | [kthreadd] |
root | 3 | 0.0 | 0.0 | 0 | 0 | ? | S | 09:32 | 0:00 | [pool_workqueue_release] |
root | 4 | 0.0 | 0.0 | 0 | 0 | ? | I | 09:32 | 0:00 | [kworker/R-rcu_gp] |
root | 5 | 0.0 | 0.0 | 0 | 0 | ? | I | 09:32 | 0:00 | [kworker/R-sync_wq] |
root | 6 | 0.0 | 0.0 | 0 | 0 | ? | I | 09:32 | 0:00 | [kworker/R-slub_flushwq] |
root | 9 | 0.0 | 0.0 | 0 | 0 | ? | I | 09:32 | 0:00 | [kworker/0:0H-events_highpri] |
root | 10 | 0.0 | 0.0 | 0 | 0 | ? | I | 09:32 | 0:00 | [kworker/0:1-events] |
Tips :
前面讲道,Linux 系统中的命令参数有长短格式之分,长格式和长格式之间不能合并, 长格式和短格式之间也不能合并,但短格式和短格式之间是可以合并的,合并后仅保留一个减号(-)即可。另外,ps 命令可允许参数不加减号(-),因此可直接写成 ps aux 的样子。
8.pstree命令
pstree 命令用于以树状图的形式展示进程之间的关系,英文全称为 process tree,输入该命令后按回车键执行即可。
前文提到,在执行 ps 命令后,产生的信息量太大又没有规律,很难让人再想看第二眼。如果想让进程以树状图的形式有层次地展示出进程之间的关系,则可以使用pstree 命令:
root@linuxprobe:~# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
├─NetworkManager───3*[{NetworkManager}]
├─VGAuthService
├─accounts-daemon───3*[{accounts-daemon}]
├─atd
├─auditd─┬─sedispatch
│ └─2*[{auditd}]
├─avahi-daemon───avahi-daemon
├─colord───3*[{colord}]
………………省略部分输出信息………………
9.top命令
top 命令用于动态地监视进程活动及系统负载等信息,输入该命令后按回车键执行即可。前面介绍的命令都是静态地查看系统状态,不能实时滚动最新数据,而 top 命令能够动态地查看系统状态,因此完全可以将它看作是 Linux 中“强化版的 Windows 任务管理器”。
top 是个相当好用的实时进程监控工具,该命令的运行界面如图 2-7 所示。
图2-7 top命令的运行界面
在图 2-7 中,top 命令执行结果的前 5 行为系统整体的统计信息,所代表的含义如下。
第 1 行:系统时间、运行时间、登录终端数、系统负载(3 个数值分别为 1 分钟、5 分钟、15 分钟内的平均值,数值越小意味着负载越低)。
第 2 行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
第 3 行:用户占用资源百分比、系统内核占用资源百分比、已调整优先级的进程的资源占比、空闲资源百分比等。其中数据均为 CPU 数据并以百分比格式显示,例如“99.9 id”意味着有 99.9%的 CPU 资源处于空闲。
第 4 行:物理内存总量、空闲内存量、已使用内存量、用于内核缓存的内存量。
第 5 行:虚拟内存总量、空闲虚拟内存量、已使用虚拟内存量、预加载的内存量。
10.nice命令
nice 命令用于调整进程的优先级,语法格式为“nice -n 优先级数字 服务名称”。
在top 命令输出的结果中,PR 和 NI 值代表的是进程的优先级,数字越低(取值范围是−20~19),优先级越高。在日常的生产工作中,可以将一些不重要进程的优先级调低,让紧迫的服务更多地利用 CPU 和内存资源,以达到合理分配系统资源的目的。例如将bash 服务的优先级调整到最高:
root@linuxprobe:~# nice -n -20 bash
11.pidof命令
pidof 命令用于查询某个指定服务进程的 PID,语法格式为“pidof [参数] 服务名称”。
每个进程在其生命周期内的进程号(PID)是唯一的,可以用于区分正在运行的进程。例如,执行如下命令查询本机上 sshd 服务程序的 PID:
root@linuxprobe:~# pidof sshd
1340
12.kill命令
kill 命令用于终止某个指定 PID 的服务进程,语法格式为“kill [参数] 进程的 PID”。
接下来,使用 kill 命令把上面用 pidof 命令查询到的 PID 所代表的进程终止掉,其命令如下所示。这种操作的效果等同于强制停止sshd 服务。
root@linuxprobe:~# kill 1340
但有时系统会提示进程无法被终止,此时可以添加参数-9(SIGKILL 信号),此信号为系统中强制终止进程的最高级别命令,进程无法抗拒:
root@linuxprobe:~# kill -9 1340
13.killall命令
killall 命令用于终止指定服务名称对应的所有进程,语法格式为“killall [参数] 服务名称”。
通常来讲,复杂的服务程序会有多个进程协同为用户提供服务,如果用 kill 命令逐个结束这些进程会比较麻烦,此时可以使用 killall 命令来批量结束某个服务程序带有的全部进程。
下面以 httpd 服务程序为例,演示如何终止其所有进程。由于 RHEL 10 系统默认没有安装httpd 服务程序,因此大家此时只需看操作过程和输出结果即可,等学习了相关内容之后再来实践。
root@linuxprobe:~# pidof httpd
13581 13580 13579 13578 13577 13576
root@linuxprobe:~# killall httpd
root@linuxprobe:~# pidof httpd
root@linuxprobe:~#
如果在系统终端中执行一个命令后想尝试停止它,可以同时按下 Ctrl+C 组合键发送SIGINT 信号,即可立即终止该命令的进程。或者,如果有些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执行命令时在末尾添加一个&符号,这样命令将进入系统后台执行。
2.4 系统状态检测命令
作为一名合格的运维人员,要想更快、更好地了解 Linux 服务器,必须具备快速查看系统运行状态的能力,因此接下来会逐个讲解与网卡/网络、系统内核、系统负载、内存使用情况、当前启用终端数量、历史登录记录、命令执行记录以及救援诊断等相关命令的使用方法。这些命令都超级实用,还请读者用心学习,加以掌握。
1.ifconfig命令
ifconfig 命令用于获取网卡配置与网络状态等信息,英文全称为 interface configurator, 语法格式为“ifconfig [参数] [网络设备]”。
使用ifconfig 命令查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet 参数后面的 IP 地址、ether 参数后面的网卡物理地址(又称为 MAC 地址),以及 RX 的接收数据包的个数、TX 的发送数据包的个数、累计流量。
root@linuxprobe:~# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.31.255
inet6 fe80::20c:29ff:fee5:e733 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e5:e7:33 txqueuelen 1000 (Ethernet)
RX packets 27660 bytes 27151953 (25.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9449 bytes 652999 (637.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 120 bytes 10704 (10.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 120 bytes 10704 (10.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在 RHEL 5、RHEL 6 系统及其他大多数早期的Linux 系统中,网卡的名称一直都是 eth0、eth1、eth2、……;在 RHEL 7 中则变成了类似于 eno16777736 这样的名字;而在 RHEL 8、9、10 系统中网卡的最新名称类似于 ens160、ens192 这样,所以经验丰富的运维老手光看网卡名称大致就能猜出系统的版本了。
2.uname命令
uname 命令用于查看系统内核版本与系统架构等信息,英文全称为 UNIX Name,语法格式为“uname [参数]”。
在使用 uname 命令时,一般要固定搭配-a 参数来完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、编译时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息:
root@linuxprobe:~# uname -a
Linux linuxprobe.com 6.12.0-55.9.1.el10….x86_64 #1 SMP PREEMPT_DYNAMIC Mon Sep 23 04:19:12 EDT 2025 x86_64 GNU/Linux
顺带一提,如果要查看当前系统版本的详细信息,则需要查看 redhat-release 文件, 其命令以及相应的结果如下:
root@linuxprobe:~# cat /etc/redhat-release
Red Hat Enterprise Linux release 10.0
3.uptime命令
uptime 命令用于查看系统的负载信息,输入该命令后按回车键执行即可。
uptime 命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近 1 分钟、5 分钟、15 分钟内的压力情况(下面加粗的信息部分),负载值越低越好:
root@linuxprobe:~# uptime
09:55:09 up 22 min, 2 users, load average: 0.06, 0.05, 0.06
当然,“负载值越低越好”是对运维人员来讲的,越低表示越安全省心。但是公司购置的硬件设备如果长期处于空闲状态,则明显是一种资源浪费,老板也不会开心。所以建议负载值保持在 1 左右,在生产环境中不要超过 5 就好。
对了,上面讲的都是 CPU 单核心的负载情况,如果你的计算机的 CPU 有 4 个核心,那么数值到达 4.00 时才意味着满负载运行,一般建议负载值不超过核心数的两倍。
4.free命令
free 命令用于显示当前系统中内存的使用量信息,语法格式为“free [参数]”。
为了保证 Linux 系统不会因资源耗尽而突然宕机,运维人员需要时刻关注内存的使用量。在使用 free 命令时,可以结合使用-h 参数以更人性化的方式输出当前内存的实时使用量信息。表 2-9 所示为在刘遄老师的计算机上执行 free -h 命令之后的输出信息。需要注意的是,输出信息中的中文注释是作者自行添加的内容,实际输出时没有相应的参数解释。
root@linuxprobe:~# free -h
表 2-9 执行 free-h 命令后的输出信息
内存总量 | 已用量 | 空闲量 | 共享使用的内容存量 | 缓存的内存量 | 可用量 | |
---|---|---|---|---|---|---|
total | used | free | shared | buff/cache | available | |
Mem: | 3.8Gi | 1.5Gi | 1.8Gi | 14Mi | 773Mi | 2.3Gi |
Swap: | 2.0Gi | 0B | 2.0Gi |
如果不使用-h(易读模式)查看内存使用量情况,则默认以 KB 为单位。这样一来,服务器如果有几百 GB 的内存,则换算下来就会是一大长串的数字,真不利于阅读。
5.who命令
who 命令用于查看当前登录主机的用户终端信息,输入该命令后按回车键执行即可。
这 3 个简单的字母可以快速显示出所有正在登录本机的用户名称以及他们正在开启的终端信息;如果有远程用户,还会显示远程用户的 IP 地址。表 2-10 所示为执行 who 命令后的结果。
root@linuxprobe:~# who
表 2-10 执行 who 命令的结果
登录的用户名 | 终端设备 | 登录系统的时间 |
---|---|---|
root | seat0 | 2025-05-18 09:36(login screen) |
root | tty2 | 2025-05-18 09:36(tty2) |
6.last命令
last 命令用于查看主机的历史登录记录,输入该命令后按回车键执行即可。
Linux 系统会将每次的登录信息都记录到日志文件中,如果哪天想翻阅了,直接执行这条命令就行:
root@linuxprobe:~# last
root tty2 tty2 Sun May 18 09:36 still logged in
root seat0 login screen Sun May 18 09:36 still logged in
reboot system boot 6.11.0-0.rc5.23. Sun May 18 09:32 still running
root tty2 tty2 Sun May 18 09:31 - down (00:01)
root seat0 login screen Sun May 18 09:31 - down (00:01)
wtmp begins Sun Mar 9 02:33:32 2025
7.ping命令
ping 命令用于测试主机之间的网络连通性,语法格式为“ping [参数] 主机地址”。
即便大家没有学习过 Linux 系统,相信也肯定见过别人使用 ping 命令。执行 ping 命令时,系统会使用 ICMP 向远端主机发出要求回应的信息,若连接远端主机的网络没有问题, 远端主机会回应该信息。由此可见,ping 命令可用于判断远端主机是否在线并且网络是否正常。ping 命令的常见参数以及作用如表 2-11 所示。
表 2-11 ping 命令的常见参数以及作用
参数 | 作用 |
---|---|
-c | 总共发送次数 |
-i | 每次间隔时间(秒) |
-W | 最长等待时间(秒) |
使用 ping 命令测试一台在线的主机(其 IP 地址为 192.168.10.10),得到的回应是这样的:
root@linuxprobe:~# ping -c 4 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.042 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3090ms
rtt min/avg/max/mdev = 0.042/0.050/0.054/0.004 ms
测试一台不在线的主机(其IP 地址为 192.168.10.20),得到的回应是这样的:
root@linuxprobe:~# ping -c 4 192.168.10.20
PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
From 192.168.10.10 icmp_seq=1 Destination Host Unreachable
From 192.168.10.10 icmp_seq=2 Destination Host Unreachable
From 192.168.10.10 icmp_seq=3 Destination Host Unreachable
From 192.168.10.10 icmp_seq=4 Destination Host Unreachable
--- 192.168.10.20 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3051ms
pipe 3
细心的同学一定注意到了-c 参数,这是因为在 Windows 系统下执行 ping 命令时,默认只会发送 4 次数据包,而 Linux 系统下的 ping 命令会一直执行下去,需要运维人员手动限制次数。
8.tracepath命令
tracepath 命令用于显示数据包到达目的主机时途中经过的所有路由信息,语法格式为“tracepath [参数] IP 地址或域名”。
当两台主机之间无法正常 ping 通时,要考虑两台主机之间是否有错误的路由信息,导致数据被某一台设备错误地丢弃。这时便可以使用 tracepath 命令追踪数据包到达目的主机时途中的所有路由信息,以分析是哪台设备出了问题。下面的情况就很清晰了:
root@linuxprobe:~# tracepath www.linuxprobe.com
1?: [LOCALHOST] pmtu 1500
1: no reply
2: 11.223.0.189 5.954ms asymm 1
3: 11.223.0.14 6.256ms asymm 2
4: 11.220.159.62 3.313ms asymm 3
5: 116.251.107.13 1.841ms
6: 140.205.50.237 2.416ms asymm 5
7: 101.95.211.117 2.772ms
8: 101.95.208.45 40.839ms
9: 101.95.218.217 13.898ms asymm 8
10: 202.97.81.162 8.113ms asymm 9
11: 221.229.193.238 15.693ms asymm 10
12: no reply
13: no reply
14: no reply
15: no reply
16: no reply
………………省略部分输出信息………………
9.netstat命令
netstat 命令用于显示网络连接、路由表、接口状态等网络相关信息,英文全称为network status,语法格式为“netstat [参数]”。
只要 netstat 命令使用得当,便可以查看到网络状态的方方面面信息。我们找出一些常用的参数让大家感受一下,如表 2-12 所示。
表 2-12 netstat 命令的常用参数以及作用
参数 | 作用 |
---|---|
-a | 显示所有连接中的 Socket |
-p | 显示正在使用的 Socket 信息 |
-t | 显示 TCP 的连接状态 |
-u | 显示 UDP 的连接状态 |
-n | 使用 IP 地址,不使用域名 |
-l | 仅列出正在监听的服务状态 |
-i | 显示网卡列表信息 |
-r | 显示路由表信息 |
使用netstat 命令显示详细的网络状况:
root@linuxprobe:~# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 [::]:websm [::]:* LISTEN
udp 0 0 linuxprobe.com:bootpc _gateway:bootps ESTABLISHED
udp 0 0 0.0.0.0:39400 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp6 0 0 [::]:47721 [::]:*
udp6 0 0 [::]:mdns [::]:*
………………省略部分输出信息………………
使用netstat 命令显示网卡列表:
root@linuxprobe:~# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
ens160 1500 32543 0 0 0 9508 0 0 0 BMRU
lo 65536 126 0 0 0 126 0 0 0 LRU
10.history命令
history 命令用于显示执行过的命令历史,语法格式为“history [参数]”。
history 命令应该是运维人员最喜欢的命令之一。执行 history 命令能显示出当前用户在本机上执行过的最近 1000 条命令记录。如果觉得 1000 条不够用,可以自定义/etc/profile 文件中的 HISTSIZE 变量值。在使用 history 命令时,可以使用-c 参数清空所有的命令历史记录。还可以使用“!编码数字”的方式来重复执行某一次的命令。总之,history 命令有很多有趣的玩法等待大家去开发。
root@linuxprobe:~# history
1 ifconfig
2 uname -a
3 cat /etc/redhat-release
4 uptime
5 free -h
6 who
7 last
8 ping -c 192.168.10.10
9 ping -c 192.168.10.20
10 tracepath www.linuxprobe.com
11 netstat -a
12 netstat -i
13 history
root@linuxprobe:~# !3
cat /etc/redhat-release
Red Hat Enterprise Linux release 10
历史命令会被保存到用户家目录中的.bash_history 文件中。Linux 系统中以点(.) 开头的文件均代表隐藏文件,这些文件大多数为系统服务文件,可以用 cat 命令查看其文件内容:
root@linuxprobe:~# cat ~/.bash_history
要清空当前用户在本机上执行的 Linux 命令历史记录信息,可执行如下命令:
root@linuxprobe:~# history -c
11.sos命令
sos 命令用于收集系统配置及架构信息并输出诊断文档,语法格式为“sos [参数]”。
当 Linux 系统出现故障,需要联系技术支持人员时,大多数时候都要先使用这个命令简单收集系统的运行状态和服务配置信息,以便让技术支持人员能够远程解决一些小问题,抑或让他们能提前了解某些复杂问题。sos 命令的常用参数以及作用如表 2-13 所示。
表 2-13 sos 命令的常用参数以及作用
参数 | 作用 |
---|---|
report | 收集整理并输出报告 |
clean | 混淆报告中的敏感信息 |
help | 显示详细的帮助信息 |
collect | 同时从多个节点收集报告 |
root@linuxprobe:~# sos report
sosreport (version 4.8.2)
This command will collect diagnostic and configuration information from
this Red Hat Enterprise Linux system and installed applications.
An archive containing the collected information will be generated in
/var/tmp/sos.4p3s8647 and may be provided to a Red Hat support
representative.
Any information provided to Red Hat will be treated in accordance with
the published support policies at:
Distribution Website : https://www.redhat.com/
Commercial Support : https://access.redhat.com/
The generated archive may contain data considered sensitive and its
content should be reviewed by the originating organization before being
passed to any third party.
No changes will be made to system configuration.
Press ENTER to continue, or CTRL-C to quit.此处敲回车
Optionally, please enter the case id that you are generating this report for []: 此处再敲回车
Setting up archive ...
Setting up plugins ...
………………省略部分输出信息………………
Creating compressed archive...
Your sosreport has been generated and saved in:
/var/tmp/sosreport-linuxprobe-2025-05-18-xqbxbhp.tar.xz
Size 18.45MiB
Owner root
sha256 16cfa2860460de92daa5923a84e60b4889afe15522fa5c81ee18606e5fd512b0
Please send this file to your support representative.
Tips : sos 命令有点像是远程问诊。假如我们今天有点咳嗽发烧不舒服,可以先从网上搜索相关症状的病因,如果仅仅是感冒的话那就多喝水,这就免去了到医院挂号看病的车马劳顿之苦;如果怀疑出了大毛病,再请专业人员进行处理也不迟。
2.5 查找定位文件命令
在 Linux 系统的日常操作中,查找定位文件是一项基础且重要的任务,而在进行文件查找定位前,了解工作目录的概念至关重要。工作目录指的是用户当前在系统中所处的位置。由于工作目录会牵涉系统存储结构相关的知识,因此第 6 章将详细讲解这部分内容。读者只需简单了解一下这里的操作实验即可,如果不能完全掌握也没有关系,毕竟 Linux 系统的知识体系太过庞大,每一位初学人员都需要经历这么一段时期。
1.pwd命令
pwd 命令用于显示用户当前所处的工作目录,英文全称为 print working directory,输入该命令后按回车键执行即可。
使用pwd 命令查看当前所处的工作目录:
root@linuxprobe:~# pwd
/root
2.cd命令
cd 命令用于切换当前的工作路径,英文全称为 change directory,语法格式为“cd [参数] [目录]”。
这个命令应该是最常用的一个 Linux 命令了。可以通过 cd 命令迅速、灵活地切换到不同的工作目录。除了常见的切换目录方式,还可以使用 cd -命令返回到上一次所处的目录,使用 cd ..命令进入上级目录,以及使用 cd ~命令切换到当前用户的家目录,抑或使用cd ~username 命令切换到其他用户的家目录(就像在游戏中使用了“回城”技能一样)。例如,使用下述的 cd 命令切换到/etc 目录中:
root@linuxprobe:~# cd /etc
同样的道理,可使用下述命令切换到/bin目录中:
root@linuxprobe:/etc# cd /bin
此时,要返回上一次的目录(即/etc 目录),可执行如下命令:
root@linuxprobe:/bin# cd -
/etc
root@linuxprobe:/etc#
还可以通过下面的命令快速切换到用户的家目录:
root@linuxprobe:/etc# cd ~
root@linuxprobe:~#
Tips :
随着切换目录的操作,命令提示符也在发生变化,例如 root@linuxprobe:/etc#就是在告诉我们当前处于/etc 中。
3.ls命令
ls 命令用于显示目录中的文件信息,英文全称为 list,语法格式为“ls [参数] [文件名]”。当所处的工作目录不同时,看到的文件肯定也不同。使用ls 命令的-a 参数可以看到全
部文件(包括隐藏文件),使用-l 参数能够查看文件的属性、大小等详细信息。将这两个参数整合之后再执行 ls 命令,即可查看当前目录中的所有文件并输出这些文件的属性信息:
root@linuxprobe:~# ls -al
total 40
dr-xr-x---. 15 root root 4096 May 18 09:37 .
dr-xr-xr-x. 18 root root 235 Mar 8 20:02 ..
-rw-r--r--. 1 root root 769 Mar 10 20:04 1.txt
-rw-------. 1 root root 1019 Mar 8 20:06 anaconda-ks.cfg
-rw-------. 1 root root 652 May 18 09:32 .bash_history
-rw-r--r--. 1 root root 18 Jun 24 2024 .bash_logout
-rw-r--r--. 1 root root 141 Jun 24 2024 .bash_profile
-rw-r--r--. 1 root root 429 Jun 24 2024 .bashrc
drwx------. 8 root root 117 Mar 10 20:01 .cache
drwx------. 11 root root 4096 May 18 09:47 .config
………………省略部分输出信息………………
如果想要查看目录属性信息,则需要额外添加一个-d 参数。例如,可使用如下命令查看/etc 目录的权限与属性信息:
root@linuxprobe:~# ls -ld /etc
drwxr-xr-x. 134 root root 8192 May 18 09:33 /etc
4.tree命令
tree 命令用于以树状图的形式列出目录内容及结构,输入该命令后按回车键执行即可。
虽然 ls 命令可以很便捷地查看目录内有哪些文件,但无法直观地获取目录内文件的层次结构。比如,假如目录 A 中有个 B,B 中又有个 C,那么 ls 命令就只能看到最外面的 A 目录,显然有些时候这不太够用。tree 命令则能够以树状图的形式列出目录内所有文件的结构。我们来对比一下两者的区别。
使用ls 命令查看目录内的文件:
root@linuxprobe:~# ls
A Desktop Downloads Pictures Templates
anaconda-ks.cfg Documents Music Public Videos
使用tree 命令查看目录内的文件以及结构:
root@linuxprobe:~# tree
.
├── A
│ └── B
│ └── C
├── anaconda-ks.cfg
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
├── Public
├── Templates
└── Videos
12 directories, 1 file
5.find命令
find 命令用于按照指定条件查找文件及目录,语法格式为“find [查找范围] 寻找条件”。
本书中曾多次提到“Linux 系统中的一切都是文件”,接下来就要见证这句话的分量了。在 Linux 系统中,搜索工作一般都是通过 find 命令完成的,它可以使用不同的文件特性作为寻找条件(如文件名、大小、修改时间、权限等信息),一旦匹配成功则默认将信息显示到屏幕上。find 命令的参数以及作用如表 2-14 所示。
表 2-14 find 命令的参数以及作用
参数 | 作用 |
---|---|
-name | 匹配名称 |
-perm | 匹配权限(+mode 为完全匹配,-mode 为包含即可) |
-user | 匹配所有者 |
-group | 匹配所属组 |
-mtime -n +n | 匹配修改内容的时间(-n 指 n 天以内,+n 指 n 天以前) |
-atime -n +n | 匹配访问文件的时间(-n 指 n 天以内,+n 指 n 天以前) |
-ctime -n +n | 匹配修改文件权限的时间(-n 指 n 天以内,+n 指 n 天以前) |
-nouser | 匹配无所有者的文件 |
-nogroup | 匹配无所属组的文件 |
-newer f1 !f2 | 匹配比文件 f1 新但比 f2 旧的文件 |
-type b/d/c/p/l/f | 匹配文件类型(后面的字母依次表示块设备、目录、字符设备、管道、链接 文件、普通文件) |
-size | 匹配文件的大小(+50k 为查找超过 50KB 的文件,而-50k 为查找小于 50KB 的文件) |
-prune | 忽略某个目录 |
-exec …… ; | 后面可跟用于进一步处理搜索结果的命令(下文会有演示) |
这里需要重点讲解-exec 参数的重要作用。这个参数用于把 find 命令搜索到的结果交由紧随其后的命令作进一步处理。它十分类似于第 3 章将要讲解的管道符技术,并且由于 find 命令对参数有特殊要求,因此虽然 exec 是长格式形式,但它的前面依然只需要一个减号(-)。
根据文件系统层次标准(Filesystem Hierarchy Standard),Linux 系统中的配置文件会保存到/etc 目录中(详见第 6 章)。如果要想获取该目录中所有以 host 开头的文件列表,可以执行如下命令:
root@linuxprobe:~# find /etc -name "host*"
/etc/nvme/hostnqn
/etc/nvme/hostid
/etc/host.conf
/etc/hosts
/etc/avahi/hosts
/etc/hostname
如果要在整个系统内搜索权限中包含 SUID 权限的所有文件(详见第 5 章),只需使用-4000 即可:
root@linuxprobe:~# find / -perm -4000
/usr/bin/umount
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/mount
/usr/bin/fusermount3
………………省略部分输出信息………………
Tips :
进阶实验在整个文件系统中找出所有归属于 linuxprobe 用户的文件并复制到/root/findresults 目录中。
该实验的重点是“-exec ;”参数,其中的表示 find 命令搜索出的每一个文件,并且命令的结尾必须是“;”。完成该实验的具体命令如下:
root@linuxprobe:~# mkdir /root/findresults
root@linuxprobe:~# find / -user linuxprobe -exec cp -a {} /root/findresults \;
6.locate命令
locate 命令用于按照名称快速搜索文件所对应的位置,语法格式为“locate [参数] 对象”。
使用 find 命令进行全盘搜索虽然更准确,但是效率有点低。如果仅仅是想找一些常见的且又知道大概名称的文件,不如试试 locate 命令。在使用 locate 命令时,先使用 updatedb 命令生成一个索引库文件,这个库文件的名字是/var/lib/plocate/plocate.db,后续在使用locate 命令搜索文件时就是在该库中进行查找操作,速度会快很多。
第一次使用 locate 命令之前,记得先执行 updatedb 命令生成索引数据库,然后再进行查找:
root@linuxprobe:~# updatedb
root@linuxprobe:~# ls -l /var/lib/plocate/plocate.db
-rw-r-----. 1 root plocate 2527288 May 18 10:25 /var/lib/plocate/plocate.db
使用locate 命令搜索出所有包含 whereis 名称的文件所在的位置:
root@linuxprobe:~# locate whereis
/usr/bin/whereis
/usr/share/bash-completion/completions/whereis
/usr/share/man/man1/whereis.1.gz
7.whereis命令
whereis 命令用于按照名称快速搜索二进制程序(命令)、源代码以及帮助文件所对应的位置,语法格式为“whereis 命令名称”。
简单来说,whereis 命令也是基于 updatedb 命令生成的索引库文件进行搜索,它与locate 命令的区别是不关心那些相同名称的文件,仅仅是快速找到对应的命令文件及其帮助文件所在的位置。
下面使用 whereis 命令分别查找出 ls 和pwd 命令所在的位置:
root@linuxprobe:~# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
root@linuxprobe:~# whereis pwd
pwd: /usr/bin/pwd /usr/share/man/man1/pwd.1.gz
8.which命令
which 命令用于按照指定名称快速搜索二进制程序(命令)对应的位置,语法格式为“which 命令名称”。
which 命令是在 PATH 变量指定的路径中,按照指定条件搜索命令所在的路径。也就是说,如果我们既不关心同名文件(find 与 locate),也不关心命令所对应的源代码和帮助文件(whereis),仅仅是想找到命令本身所在的路径,那么这个 which 命令就太合适了。下面查找一下 locate 和whereis 命令所对应的路径:
root@linuxprobe:~# which locate
/usr/bin/locate
root@linuxprobe:~# which whereis
/usr/bin/whereis
2.6 文本文件编辑命令
通过前面几个小节的学习,读者应该已经掌握了切换工作目录及对文件进行管理的方法。在 Linux 系统中,一切都是文件,对服务程序进行配置自然也就是编辑程序的配置文件。如果不能熟练地查阅系统或服务的配置文件,后续工作时可就真的要尴尬了。本节将讲解几条用于查看文本文件内容的命令。至于相对比较复杂的文本编辑器工具,将在第 4 章与 Shell 脚本一起讲解。
1.cat命令
cat 命令用于查看纯文本文件(内容较少的文件),英文全称为 concatenate,语法格式为“cat [参数] 文件名”。
Linux 系统中有多个用于查看文本内容的命令,每个命令都有自己的特点,比如这个 cat 命令就是用于查看内容较少的纯文本文件。cat 这个命令也很好记,因为 cat 在英语中是“猫” 的意思,小猫咪是不是给你一种娇小、可爱的感觉呢?
如果在查看文本内容时还想顺便显示行号的话,不妨在 cat 命令后面追加一个-n 参数:
root@linuxprobe:~# cat -n anaconda-ks.cfg
1 # Generated by Anaconda 40.22.3.12
2 # Generated by pykickstart v3.52.5
3 #version=RHEL10
4 # Use graphical install
5 graphical
6
7 %addon com_redhat_kdump --disable
8
9 %end
………………省略部分输出信息………………
2.more命令
more 命令用于查看纯文本文件(内容较多的文件),语法格式为“more [参数] 文件名”。如果需要阅读长篇小说或者非常长的配置文件,那么“小猫咪”可就不合适了。因为一
旦使用 cat 命令阅读长篇的文本内容,信息就会在屏幕上快速翻滚,导致自己还没有来得及看到,内容就已经翻篇了。因此对于长篇的文本内容,推荐使用 more 命令查看。more 命令会在屏幕最下面使用百分比的形式来提示你已经阅读了多少内容;还可以使用空格键或回车键向下翻页:
root@linuxprobe:~# more anaconda-ks.cfg
# Generated by Anaconda 40.22.3.12
# Generated by pykickstart v3.52.5
#version=RHEL10
# Use graphical install
graphical
%addon com_redhat_kdump --disable
%end
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=ens160 --ipv6=auto --activate
network --hostname=linuxprobe.com
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
%packages
@^graphical-server-environment
--More--(48%)
3.head命令
head 命令用于查看纯文本文件的前 N 行,语法格式为“head [参数] 文件名”。
在阅读文本内容时,谁也难以保证会按照从头到尾的顺序看完整个文件。如果只想查看文本中前 10 行的内容,该怎么办呢?head 命令就能派上用场了:
root@linuxprobe:~# head -n 10 anaconda-ks.cfg
# Generated by Anaconda 40.22.3.12
# Generated by pykickstart v3.52.5
#version=RHEL10
# Use graphical install
graphical
%addon com_redhat_kdump --disable
%end
4.tail命令
tail 命令用于查看纯文本文件的后 N 行或持续刷新文件的最新内容,语法格式为“tail [参数] 文件名”。
我们可能还会遇到另外一种情况,比如需要查看文本内容的最后 10 行,这时就需要用到 tail 命令了。tail 命令的操作方法与head 命令非常相似,只需要执行“tail -n 10 文件名”命令就可以达到这样的效果:
root@linuxprobe:~# tail -n 10 anaconda-ks.cfg
autopart
# Partition clearing information
clearpart --none --initlabel
# System timezone
timezone Asia/Shanghai --utc
# Root password
rootpw --iscrypted --allow-ssh $y$j9T$9ksHS/agdH0v1Da0mwbUp6Kg$G.cHNWJ1EJEaBWJxwahrFRlQkqRs82A0ajf32ZTB.PB
user --groups=wheel --name=linuxprobe --password=$y$j9T$nv/rjZ.6xpHhLADJDvIa3uGH$f623oMdVJdxy/QygxwnuZc0FsAdcj8amW9
tail 命令最强悍的功能是能够持续刷新一个文件的内容,当想要实时查看最新的日志文件时,这特别有用,此时的命令格式为“tail -f 文件名”:
root@linuxprobe:~# tail -f /var/log/messages
May 18 10:28:07 linuxprobe systemd[1]: packagekit.service: Deactivated successfully.
May 18 10:28:43 linuxprobe systemd[1]: Starting packagekit.service - PackageKit Daemon...
May 18 10:28:43 linuxprobe packagekitd[9218]: g_path_get_basename: assertion 'file_name != NULL' failed
May 18 10:28:43 linuxprobe systemd[1]: Started packagekit.service - PackageKit Daemon.
May 18 10:28:43 linuxprobe packagekitd[9218]: Skipping refresh of media: Cannot update read-only repo
May 18 10:29:13 linuxprobe ptyxis[2945]: context mismatch in svga_surface_destroy
May 18 10:29:13 linuxprobe ptyxis[2945]: context mismatch in svga_surface_destroy
May 18 10:29:13 linuxprobe ptyxis[2945]: context mismatch in svga_surface_destroy
5.tr命令
tr 命令用于替换文本内容中的字符,英文全称为 translate,语法格式为“tr 原始字符目标字符”。
在很多时候,我们想要快速地替换文本中的一些词汇,或者是想把整个文本内容都进 行替换。如果手工替换,难免工作量太大,在需要处理大批量的内容时,进行手工替换更 是不现实。这时,就可以先使用 cat 命令读取待处理的文本,然后通过管道符(详见第 3 章)把这些文本内容传递给 tr 命令进行替换操作。例如,把某个文本内容中的英文全部替换为大写:
root@linuxprobe:~# cat anaconda-ks.cfg | tr 'a-z' 'A-Z'
# GENERATED BY ANACONDA 40.22.3.12
# GENERATED BY PYKICKSTART V3.52.5
#VERSION=RHEL10
# USE GRAPHICAL INSTALL
GRAPHICAL
%ADDON COM_REDHAT_KDUMP --DISABLE
%END
# KEYBOARD LAYOUTS
KEYBOARD --VCKEYMAP=US --XLAYOUTS='US'
# SYSTEM LANGUAGE
LANG EN_US.UTF-8
………………省略部分输出信息………………
6.wc命令
wc 命令用于统计指定文本文件的行数、字数或字节数,英文全称为word count,语法格式为“wc [参数] 文件名”。
每次我在课堂上讲到这个命令时,总有同学会联想到一种公共设施,其实这两者毫无关联。wc 命令用于统计文本的行数、字数、字节数等。如果为了方便自己记住这个命令的作用, 也可以这样联想—上厕所时好无聊,无聊到数完了手中的如厕读物上有多少行字。wc 命令的参数以及相应的作用如表 2-15 所示。
表 2-15 wc 命令的参数以及作用
参数 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
在 Linux 系统中,/etc/passwd 是用于保存所有用户信息的文件,要统计当前系统中有多少个用户,可以使用下面的命令进行查询,是不是很神奇:
root@linuxprobe:~# wc -l /etc/passwd
38 /etc/passwd
7.stat命令
stat 命令用于查看文件的具体存储细节和时间等信息,英文全称为status,语法格式为“stat 文件名”。
大家都知道,文件有一个修改时间。其实,Linux 系统中的文件包含 3 种时间状态,分别是Access Time(内容最后一次被访问的时间,简称为 Atime),Modify Time(内容最后一次被修改的时间,简称为 Mtime)以及 Change Time(文件属性最后一次被修改的时间,简称为 Ctime)。
下面使用 stat 命令查看文件的这 3 种时间状态信息:
root@linuxprobe:~# stat anaconda-ks.cfg
File: anaconda-ks.cfg
Size: 1019 Blocks: 8 IO Block: 4096 regular file
Device: 253,0 Inode: 33826925 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2025-05-18 10:05:30.651095368 +0800
Modify: 2025-03-08 20:06:44.282103236 +0800
Change: 2025-03-08 20:06:44.282103236 +0800
Birth: 2025-03-08 20:06:44.235103234 +0800
8.grep命令
grep 命令用于根据指定的模式(如字符串、正则表达式等)来搜索和提取对应的文本内容,英文全称为 Global Regular Expression Print,语法格式为“grep [参数] 模式 文件名”。
grep 命令是用途最广泛的文本搜索匹配工具。它虽然有很多参数,但是大多数基本上都用不到。有鉴于此,经过深思熟虑的提炼,这里只讲 grep 命令两个最常用的参数。
-n 参数:用来显示搜索到的信息的行号。
-v 参数:用于反选信息(即没有包含关键词的所有信息行)。
这两个参数几乎能完成你日后 80%的工作需要,至于其他上百个参数,即使以后在工作期间遇到了,再使用 man grep 命令查询也来得及。
grep 命令中的常见参数以及作用如表 2-16 所示。
表 2-16 grep 命令中的常见参数以及作用
参数 | 作用 |
---|---|
-b | 将可执行文件(binary)当作文本文件(text)来搜索 |
-c | 仅显示找到的行数 |
-i | 忽略大小写 |
-n | 显示行号 |
-v | 反向选择—仅列出没有“关键词”的行 |
在 Linux 系统中,/etc/passwd 文件保存着所有的用户信息,而一旦用户的登录终端被设置为/sbin/nologin,则不再允许登录系统,因此可以使用 grep 命令查找出当前系统中不允许登录系统的所有用户的信息:
root@linuxprobe:~# grep /sbin/nologin /etc/passwd
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
………………省略部分输出信息………………
9.cut命令
cut 命令用于按“列”提取文本内容,语法格式为“cut [参数] 文件名”。
系统文件在保存用户数据信息时,每一项值之间是采用冒号来间隔的,先查看一下:
root@linuxprobe:~# head -n 2 /etc/passwd
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
一般而言,按基于“行”的方式提取数据是比较简单的,只需要设置好要搜索的关键词即可。但是如果按“列”搜索,不仅要使用-f 参数设置需要查看的列数,还需要使用-d 参数设置间隔符号。
接下来使用下述命令尝试提取 passwd 文件中的用户名信息,即提取以冒号(:)为间隔符号的第一列内容:
root@linuxprobe:~# cut -d : -f 1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
………………省略部分输出信息………………
10.diff命令
diff 命令用于比较多个文件之间内容的差异,英文全称为 difference,语法格式为“diff [参数] 文件名 A 文件名 B”。
在使用 diff 命令时,不仅可以使用--brief 参数确认两个文件是否相同,还可以使用-c 参数详细比较多个文件的差异之处。这绝对是判断文件是否被篡改的有力神器。例如,先使用cat 命令分别查看 diff_A.txt 和diff_B.txt 文件的内容,然后进行比较:
root@linuxprobe:~# cat diff_A.txt
Welcome to linuxprobe.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
root@linuxprobe:~# cat diff_B.txt
Welcome tooo linuxprobe.com
Red Hat certified
Free Linux LeSSonS
////////.....////////
Professional guidance
Linux Course
接下来使用 diff --brief 命令显示比较后的结果,判断文件是否相同:
root@linuxprobe:~# diff --brief diff_A.txt diff_B.txt
Files diff_A.txt and diff_B.txt differ
最后使用带有-c 参数的 diff 命令来描述文件内容具体的不同:
root@linuxprobe:~# diff -c diff_A.txt diff_B.txt
*** diff_A.txt 2025-05-18 10:34:30.829180338 +0800
--- diff_B.txt 2025-05-18 10:34:40.334180802 +0800
***************
*** 1,5 ****
! Welcome to linuxprobe.com
Red Hat certified
! Free Linux Lessons
Professional guidance
Linux Course
--- 1,7 ----
! Welcome tooo linuxprobe.com
!
Red Hat certified
! Free Linux LeSSonS
! ////////.....////////
Professional guidance
Linux Course
11.uniq命令
uniq 命令用于去除文本中连续的重复行,英文全称为unique,语法格式为“uniq [参数] 文件名”。
由 uniq 命令的英文全称 unique(独特的,唯一的)可知,该命令的作用是去除文本文件中连续的重复行,中间不能夹杂其他文本行(非相邻的默认不会去重)—去除了重复的,保留的都是唯一的,自然也就是“独特的”“唯一的”了。
我们使用 uniq 命令对两个文本内容进行操作,区别一目了然:
root@linuxprobe:~# cat uniq.txt
Welcome to linuxprobe.com
Welcome to linuxprobe.com
Welcome to linuxprobe.com
Welcome to linuxprobe.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
root@linuxprobe:~# uniq uniq.txt
Welcome to linuxprobe.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
12.sort命令
sort 命令用于对文本内容进行排序,语法格式为“sort [参数] 文件名”。
有时文本中的内容顺序不正确,一行行地手动修改实在太麻烦。此时使用 sort 命令就再合适不过了,它能够对文本内容进行排序。这个命令千万不能只讲理论,一定要借助实战让大家一看就懂。sort 命令的参数及其作用如表 2-17 所示。
表 2-17 sort 命令的参数及其作用
参数 | 作用 |
---|---|
-f | 忽略大小写 |
-b | 忽略缩进与空格 |
-n | 以数值型排序 |
-r | 反向排序 |
-u | 去除重复行 |
-t | 指定间隔符 |
-k | 设置字段范围 |
首先,在执行 sort 命令后默认会按照字母顺序进行排序,非常方便:
root@linuxprobe:~# cat fruit.txt
banana
pear
apple
orange
raspberry
root@linuxprobe:~# sort fruit.txt
apple
banana
orange
pear
raspberry
此外,与 uniq 命令不同,sort 命令是无论内容行之间是否夹杂有其他内容,只要有两个完全一样的内容行,立马就可以使用-u 参数进行去重操作:
root@linuxprobe:~# cat sort.txt
Welcome to linuxprobe.com
Red Hat certified
Welcome to linuxprobe.com
Free Linux Lessons
Linux Course
root@linuxprobe:~# sort -u sort.txt
Free Linux Lessons
Linux Course
Red Hat certified
Welcome to linuxprobe.com
想对数字进行排序?一点问题都没有,而且完全不用担心出现“1 大于 20”这种问题(因为有些命令只比较数字的第一位,忽略了十、百、千的位):
root@linuxprobe:~# cat number.txt
45
12
3
98
82
67
24
56
9
root@linuxprobe:~# sort -n number.txt
3
9
12
24
45
56
67
82
98
最后,我们挑战一个“高难度”的小实验。下面的内容节选自/etc/passwd 文件中的前 5 个字段,并且进行了混乱排序。
root@linuxprobe:~# cat user.txt
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon
polkitd:x:998:996:User for polkitd
geoclue:x:997:995:User for geoclue
rtkit:x:172:172:RealtimeKit
pulse:x:171:171:PulseAudio System Daemon
qemu:x:107:107:qemu user
usbmuxd:x:113:113:usbmuxd user
unbound:x:996:991:Unbound DNS resolver
rpc:x:32:32:Rpcbind Daemon
gluster:x:995:990:GlusterFS daemons
不难看出,上面其实是 5 个字段,各个字段之间使用冒号进行间隔,如果想以第 3 个字段中的数字作为排序依据,那么可以用-t 参数指定间隔符,用-k 参数指定第几列,用-n 参数进行数字排序来搞定:
root@linuxprobe:~# sort -t : -k 3 -n user.txt
rpc:x:32:32:Rpcbind Daemon
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon
qemu:x:107:107:qemu user
usbmuxd:x:113:113:usbmuxd user
pulse:x:171:171:PulseAudio System Daemon
rtkit:x:172:172:RealtimeKit
gluster:x:995:990:GlusterFS daemons
unbound:x:996:991:Unbound DNS resolver
geoclue:x:997:995:User for geoclue
polkitd:x:998:996:User for polkitd
2.7 文件目录管理命令
目前为止,读者学习Linux 命令的过程就像是在夯实地基,虽然表面上“高楼未起”,但其实大家的内功已经相当深厚了。有了上面的知识铺垫,我们将在本节介绍 Linux 系统日常运维工作中最常用的命令,实现对文件的创建、修改、复制、剪切、更名与删除等操作。
1.touch命令
touch 命令用于创建空白文件或设置文件的时间,语法格式为“touch [参数] 文件名”。在创建空白的文本文件方面,这个 touch 命令相当简洁,简洁到没有必要铺开来讲。
比如,touch linuxprobe 命令可以创建出一个名为 linuxprobe 的空白文本文件。对touch 命令来讲,有难度的操作主要是体现在设置文件内容的修改时间(Mtime)、文件权限或属性的更改时间(Ctime)与文件的访问时间(Atime)上面。touch 命令的参数及其作用如表 2-18 所示。
表 2-18 touch 命令的参数及其作用
参数 | 作用 |
---|---|
-a | 仅修改“访问时间”(Atime) |
-m | 仅修改“修改时间”(Mtime) |
-d | 同时修改 Atime 与 Mtime |
接下来,先使用 ls 命令查看一个文件的修改时间,随后修改这个文件,再查看一下文件的修改时间,看是否发生了变化:
root@linuxprobe:~# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1019 Mar 8 20:06 anaconda-ks.cfg
root@linuxprobe:~# echo "Visit LinuxProbe.com to learn linux" >> anaconda-ks.cfg
root@linuxprobe:~# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1062 May 18 10:38 anaconda-ks.cfg
如果不想让别人知道我们修改了它,那么这时就可以用 touch 命令把修改后的文件时间设置成修改之前的时间(很多黑客就是这样做的呢):
root@linuxprobe:~# touch -d "2025-05-18 15:44" anaconda-ks.cfg
root@linuxprobe:~# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1062 May 18 2025 anaconda-ks.cfg
2.mkdir命令
mkdir 命令用于创建空白的目录,英文全称为 make directory ,语法格式为“mkdir [参数] 目录名称”。
除了能创建单个空白目录外,mkdir 命令还可以结合-p 参数递归创建出具有嵌套层叠关系的文件目录:
root@linuxprobe:~# mkdir linuxprobe
root@linuxprobe:~# cd linuxprobe
root@linuxprobe:~/linuxprobe# mkdir -p a/b/c/d/e
root@linuxprobe:~/linuxprobe# cd a
root@linuxprobe:~/linuxprobe/a# cd b
root@linuxprobe:~/linuxprobe/a/b#
3.cp命令
cp 命令用于复制文件或目录,英文全称为 copy,语法格式为“cp [参数] 源文件名目标文件名”。
大家对文件复制操作应该不陌生,几乎每天都会用到。在 Linux 系统中,复制操作具体分为 3 种情况:
如果目标文件是目录,则会把源文件复制到该目录中;
如果目标文件也是普通文件,则会询问是否要覆盖它;
如果目标文件不存在,则执行正常的复制操作。
复制命令基本不会出错,唯一需要记住的就是在复制目录时要加上-r 参数。cp 命令的参数及其作用如表 2-19 所示。
表 2-19 cp 命令的参数及其作用
参数 | 作用 |
---|---|
-p | 保留原始文件的属性 |
-d | 若对象为符号链接,则保留符号链接本身,而不是复制其指向的文件 |
-r | 递归持续复制(用于目录) |
-i | 若目标文件存在,则询问是否覆盖 |
-a | 相当于-pdr(p、d、r 为上述参数) |
接下来,使用 touch 命令创建一个名为install.log 的普通空白文件,然后将其复制为一份名为 x.log 的备份文件,最后再使用 ls 命令查看目录中的文件:
root@linuxprobe:~# touch install.log
root@linuxprobe:~# cp install.log x.log
root@linuxprobe:~# ls
install.log x.log
4.mv命令
mv 命令用于剪切或重命名文件,英文全称为 move,语法格式为“mv [参数] 源文件名目标文件名”。
剪切操作不同于复制操作,因为它默认会把源文件删除,只保留剪切后的文件。如果在同一个目录中将某个文件剪切后还粘贴到当前目录下,其实也就是对该文件进行了重命名操作:
root@linuxprobe:~# mv x.log linux.log
root@linuxprobe:~# ls
install.log linux.log
5.rm命令
rm 命令用于删除文件或目录,英文全称为 remove,语法格式为“rm [参数] 文件名称”。
在 Linux 系统中删除文件时,系统会默认向你询问是否要执行删除操作,如果不想总是看到这种反复的确认信息,可在 rm 命令后跟上-f 参数执行强制删除操作。另外,要想删除一个目录, 需要在 rm 命令后面加一个-r 参数,否则删除不掉。rm 命令的参数及其作用如表 2-20 所示。
表 2-20 rm 命令的参数及其作用
参数 | 作用 |
---|---|
-f | 强制执行 |
-i | 删除前询问 |
-r | 删除目录 |
-v | 显示过程 |
下面尝试删除前面创建的 install.log 和linux.log 文件,大家感受一下加与不加-f 参数的区别:
root@linuxprobe:~# rm install.log
rm: remove regular empty file 'install.log'? y
root@linuxprobe:~# rm -f linux.log
root@linuxprobe:~# ls
root@linuxprobe:~#
6.dd命令
dd 命令用于按照指定大小和个数的数据块复制文件或转换文件,语法格式为“dd if=参数值 of=参数值 count=参数值 bs=参数值”。
dd 命令是一个比较重要而且比较有特色的命令,它能够让用户按照指定大小和个数的数据块来复制文件的内容。当然,如果愿意的话,还可以在复制过程中转换其中的数据。Linux 系统中有一个名为/dev/zero 的设备文件,每次在课堂上解释它时总会延伸出富含思辨性的理论探讨。因为这个文件不占用系统存储空间,但却可以提供无穷无尽的数据,因此常常使用它作为 dd 命令的输入文件,以生成一个指定大小的文件。dd 命令的参数及其作用如表 2-21 所示。
表 2-21 dd 命令的参数及其作用
参数 | 作用 |
---|---|
if | 输入的文件名称 |
of | 输出的文件名称 |
bs | 设置每个“块”的大小 |
count | 设置要复制的“块”的个数 |
例如,用 dd 命令从/dev/zero 设备文件中取出一个大小为 560MB 的数据块,然后保存成名为 560_file 的文件。在理解了这个命令后,以后就能随意创建任意大小的文件了:
root@linuxprobe:~# dd if=/dev/zero of=560_file count=1 bs=560M
1+0 records in
1+0 records out
587202560 bytes (587 MB, 560 MiB) copied, 14.7741 s, 39.7 MB/s
dd 命令的功能也绝不仅限于复制文件这么简单。如果想把光驱设备中的光盘制作成.iso 格式的镜像文件,在 Windows 系统中需要借助第三方软件才能做到,但在 Linux 系统中可以直接使用 dd 命令压制出光盘镜像文件,将它变成一个可立即使用的 ISO 镜像:
root@linuxprobe:~# dd if=/dev/cdrom of=RHEL-server-10.0-x86_64-LinuxProbe.Com.iso
13554816+0 records in
13554816+0 records out
6940065792 bytes (6.9 GB, 6.5 GiB) copied, 131.439 s, 52.8 MB/s
考虑到有些读者会纠结 bs 块大小与 count 块个数的关系,下面举一个吃货的例子进行解释。假设小明的饭量(即需求)是一个固定的值,用来盛饭的勺子的大小是 bs 块的大小,而用勺子盛饭的次数则是 count 块的个数。小明要想吃饱(满足需求),则需要在勺子大小(bs 块大小)与用勺子盛饭的次数(count 块个数)之间进行平衡。勺子越大,用勺子盛饭的次数就越少。由上可见,bs 与count 都是用来指定容量的大小,只要能满足需求,可随意组合搭配方式。
7.file命令
file 命令用于查看文件的类型,语法格式为“file 文件名”。
在 Linux 系统中,由于文本、目录、设备等所有这些一切都统称为文件,但是它们又不像 Windows 系统那样都有后缀,因此很难通过文件名一眼判断出具体的文件类型,这时就需要使用 file 命令来查看文件类型了。
root@linuxprobe:~# file anaconda-ks.cfg
anaconda-ks.cfg: ASCII text
root@linuxprobe:~# file /dev/sda
/dev/sda: block special (8/0)
Tips :
在 Windows 系统中打开文件时,一般是通过用户双击鼠标完成的,系统会自行判断用户双击的文件是什么类型,因此需要有后缀进行区别。而 Linux 系统则是根据用户执行的命令来调用文件,例如执行cat 命令查看文本,执行bash 命令执行脚本等,所以也就不需要强制让用户给文件设置后缀了。
8.tar命令
tar 命令用于对文件进行打包压缩或解压,语法格式为“tar [参数] [文件或目录名]”。
在网络上,人们越来越倾向于传输压缩格式的文件,原因是压缩文件的体积小,在网速相同的情况下,体积越小则传输时间越短。在 Linux 系统中,主要使用的是.tar、.tar.gz 或.tar.bz2 格式,大家不用担心格式太多而记不住,其实这些格式大部分都是由tar 命令生成的。tar 命令的参数及其作用如表 2-22 所示。
表 2-22 tar 命令的参数及其作用
参数 | 作用 |
---|---|
-c | 创建压缩文件 |
-x | 解开压缩文件 |
-t | 查看压缩包内有哪些文件 |
-z | 用 gzip 格式进行压缩或解压 |
-j | 用 bzip2 格式进行压缩或解压 |
-v | 显示压缩或解压的过程 |
-f | 目标文件名 |
-p | 保留原始权限与属性 |
-P | 保留绝对路径 |
-C | 指定解压到的目标目录 |
首先,-c 参数用于创建压缩文件,-x 参数用于解压文件,因此这两个参数不能同时使用。其次,-z 参数指定使用 gzip 格式压缩或解压文件,-j 参数指定使用 bzip2 格式压缩或解压文件。用户使用时则是根据文件的后缀来决定应使用何种格式的参数进行解压。在执行某些压缩或解压操作时,可能需要花费数个小时,如果屏幕一直没有输出,一方面我们不好判断打包的进度情况,另一方面也会怀疑系统宕机了,因此非常推荐使用-v 参数向用户不断显示压缩或解压的过程。-C 参数用于指定要解压到哪个指定的目录。-f 参数特别重要, 必须紧跟目标文件名,其他参数的位置没有强制要求。
刘遄老师一般使用“tar –czvf 压缩包名称.tar.gz 要打包的目录”命令把指定的文件进行打包压缩;相应的解压命令为“tar –xzvf 压缩包名称.tar.gz”。下面我们逐个演示打包压缩与解压的操作,先使用 tar 命令把/etc 目录以.gzip 格式进行打包压缩,并把文件命名为 etc.tar.gz:
root@linuxprobe:~# tar czvf etc.tar.gz /etc
tar: Removing leading `/' from member names
/etc/
/etc/mtab
/etc/fstab
/etc/crypttab
/etc/lvm/
/etc/lvm/devices/
/etc/lvm/devices/system.devices
/etc/lvm/archive/
………………省略部分输出信息………………
接下来将打包后的压缩文件指定解压到/root/etc 目录中(先使用 mkdir 命令创建/root/etc 目录):
root@linuxprobe:~# mkdir /root/etc
root@linuxprobe:~# tar xzvf etc.tar.gz -C /root/etc
etc/
etc/mtab
etc/fstab
etc/crypttab
etc/lvm/
etc/lvm/devices/
etc/lvm/devices/system.devices
etc/lvm/archive/
………………省略部分输出信息………………
在本章最后再多提几句,很多读者初次接触到本书时都担心因为自己的英语不好而导致学不会 Linux 系统,其实大可不必担心,因为我们的图书、培训课程甚至红帽考题都是中文的。而在学习完本章后你也一定发现,以后要使用的是 Linux 命令,而绝不是纯粹的英语单词。即便它们的拼写 100%相同,最终用处肯定也是不一样的。因此就学习 Linux 系统技术来讲,你跟英语达人绝对都是站在同一起跑线上的,更何况你选择了一本适合你的 Linux 教材。
休息一下,然后开始学习第 3 章吧!
复习题
-
在 RHEL 10 及众多的 Linux 系统中,最常使用的 Shell 终端是什么?
答:Bash(Bourne-Again Shell)解释器。
-
执行Linux 系统命令时,添加参数的目的是什么?
答:为了让 Linux 系统命令能够更贴合用户的实际需求进行工作。
-
Linux 系统命令、命令参数及命令对象之间,应该使用什么来间隔?
答:应该使用一个或多个空格进行间隔。
-
请写出用echo 命令把 SHELL 变量值输出到屏幕终端的命令。
答:echo $SHELL。
-
请尝试使用 Linux 系统命令关闭 PID 为 5529 的服务进程。
答:执行 kill 5529 命令即可;若知道服务名称,则可以使用 killall 命令进行关闭。
-
使用ifconfig 命令查看网络状态信息时,需要重点查看的 4 项信息分别是什么?
答:分别是网卡名称、IP 地址、网卡物理地址以及 RX/TX 的收发流量数据大小。
-
使用uptime 命令查看系统负载时,对应的负载数值如果是 0.91、0.56、0.32,那么最近 15 分钟内负载压力最大的是哪个时间段?
答:通过负载数值可以看出,最近 1 分钟内的负载压力是最大的。
-
使用 history 命令查看历史命令的执行记录时,命令前面的编码数字除了排序外还有什么用处?
答:可以用“!编码数字”的命令格式重复执行某一次的命令记录,从而避免了重复输入较长命令的麻烦。
-
若想查看的文件具有较长的内容,那么使用 cat、more、head、tail 中的哪个命令最合适?
答:如果文件内容较长,使用 more 命令;反之使用 cat 命令。
-
在使用mkdir 命令创建有嵌套关系的目录时,应该加上什么参数?
答:应该加上-p 递归迭代参数,从而自动创建有嵌套关系的目录。