🔍搜索⌘K

Linux 常用命令与核心选项全解析:从基础操作到系统管理

概述

在 Linux 上干活,命令行是绕不开的工具。但常用命令好几十个,每个还带一堆选项,新手很容易记混参数、用错地方,轻则效率低,重则误操作。

这篇文章按 “基础工具 → 文件管理 → 进程控制 → 磁盘与分区 → 用户与权限 → 软件管理 → 定时任务” 这 7 块,把高频命令捋一遍。每个命令都讲四样:它是干啥的、常用选项是啥、怎么实战、有啥坑(比如 rm -rf 怎么用才安全、userdel -r 会删掉多少数据),帮你把命令串成体系,既好记又不容易踩雷。

一、基础工具命令:认识命令本质与系统信息

这类命令是 Linux 操作的 “入门钥匙”,帮你判断命令类型、查看帮助文档、管理命令历史,是后续所有操作的基础。

1. type:判断命令类型(内建 / 外部命令)

这个命令用来区分一个命令到底是“Shell 内建命令”(像 cd、echo)还是“外部命令”(像 ls、cp),两类命令行为不太一样,搞清楚了才好排查问题。

常用选项:

  • -a:把匹配到的命令路径都列出来(内建的和外部的都算)。

实战示例:

# 1. 判断 echo 命令类型(内建+外部命令)
type echo
# 预期输出:echo is a shell builtin(说明是内建命令)
type -a echo
# 预期输出:
# echo is a shell builtin
# echo is /bin/echo(同时显示外部命令路径)

# 2. 判断 ls 命令类型(仅外部命令)
type ls
# 预期输出:ls is /bin/ls

2. echo:输出文本与环境变量

echo 就是打印字符串、环境变量,或者通过转义字符控制输出格式(比如换行、制表符)。

常用选项:

  • -n:输出完不换行(默认输出后会自动换行)。
  • -e:启用转义字符解析(支持 \n 换行、\t 制表符等)。

实战示例:

# 1. 基本输出(默认换行)
echo "Hello Linux"
# 预期输出:Hello Linux(后接换行)

# 2. 不换行输出(-n)
echo -n "Enter your name: "
read name  # 配合 read 命令实现“输入提示不换行”
# 预期效果:提示文字后光标紧跟,等待用户输入

# 3. 解析转义字符(-e)
echo -e "Name:\t$name\nAge:\t25"  # \t 制表符,\n 换行
# 预期输出:
# Name:    (用户输入的名字)
# Age:     25

3. man:查看命令帮助文档

man 是 Linux 自带的 “说明书”,查命令的详细用法、选项、示例全靠它,遇到问题第一个就该翻它。

常用选项:

  • -k:按关键词模糊搜相关命令(比如搜 “主机名” 相关的命令)。

实战示例:

# 1. 查看 hostname 命令的完整帮助(进入 man 页面,按 q 退出)
man hostname

# 2. 模糊搜索“hostname”相关的所有命令(-k)
man -k hostname
# 预期输出:所有包含 hostname 关键词的命令(如 hostname、hostnamectl)

使用技巧:进 man 页面之后,按 /关键词 能搜索内容,按 n 看下一个匹配,按 q 退出。

4. history:管理命令历史记录

history 用来查看、保存、清除之前跑过的命令,省得复杂命令重复手敲。

它的机制是这样的:命令历史默认存在家目录的 .bash_history 文件里;当前这次会话输入的命令先搁在内存,等 Shell 退出时才写进文件;而且普通用户只能看自己的历史。

常用选项:

  • -a:强行把当前会话的命令历史写进 .bash_history(不用等 Shell 退出)。
  • -c:清空当前会话的命令历史(只清内存里的,文件里的得手动删)。

实战示例:

# 1. 查看最近执行的 10 条命令(默认显示所有历史,加数字限制条数)
history 10

# 2. 强制保存历史记录到文件(-a)
history -a
# 场景:执行敏感操作前,先保存历史,避免意外丢失

# 3. 清空当前会话历史(-c)
history -c
# 注意:仅清空内存中的记录,文件中的历史需手动删除(rm ~/.bash_history)

实用技巧:按 Ctrl+R 能搜历史命令(输入关键词,再按 Ctrl+R 切换匹配结果),比手动翻找快得多。

5. alias:设置命令别名(简化复杂操作)

alias 是给常用命令(尤其是带长选项的)起个简写,效率立马上来(比如 alias ll=‘ls -l’)。

别名分两种:临时的只在当前 Shell 会话里有效,退出就没了;想永久生效得写进 ~/.bashrc 或者 /etc/bashrc(后者是全局的)。

实战示例:

# 1. 查看已有的别名(如系统默认的 ll 别名)
alias ll
# 预期输出:alias ll='ls -l'

# 2. 设置临时别名(当前会话有效)
alias rm='rm -i'  # 删除文件时自动提示(避免误删)
alias dfh='df -h'  # 简写 df 命令,按人类可读格式显示磁盘

# 3. 设置永久别名(写入 .bashrc)
echo "alias ll='ls -alF'" >> ~/.bashrc  # 追加到用户配置文件
source ~/.bashrc  # 立即生效(无需重启 Shell)

二、文件与目录管理命令:操作文件 / 文件夹的核心

这类命令是 Linux 最高频的操作,覆盖 “创建 / 查看 / 复制 / 删除 / 移动” 文件与目录,重点是把带安全选项的用法(比如 cp -i、rm -i)记牢。

1. ls:列出目录内容

ls 用来查看目录下文件 / 文件夹的名字、权限、大小、修改时间这些信息。

高频的选项组合:

选项功能说明常用组合
-l长格式显示(权限、属主、大小、修改时间)ls -l(简写 ll)
-a显示隐藏文件(以 . 开头的文件)ls -a
-R递归显示子目录内容ls -lR(查看目录树)
-t按修改时间排序(最新的在前)ls -lt(查看最近修改的文件)
-r倒序排序(配合 -t 实现 “oldest first”)ls -ltr(查看最早修改的文件)
-i显示文件的 inode 编号(文件系统中唯一标识)ls -i(排查硬链接时用)
-F给不同类型文件加后缀(/ 表示目录,* 表示可执行文件)ls -lF(快速区分文件类型)

实战示例:

# 1. 查看当前目录所有文件(含隐藏文件)的详细信息
ls -alF
# 输出包含:权限、硬链接数、属主、属组、大小、修改时间、文件名+类型后缀

# 2. 查看 /var/log 目录下最近修改的 5 个文件
ls -lt /var/log | head -n 6  # head -n 6 取前 6 行(含标题行)

# 3. 递归查看 /etc 目录下所有 .conf 配置文件
ls -lR /etc | grep "\.conf$"

2. cp:复制文件 / 目录

cp 用来把文件或目录复制到目标路径,支持递归复制、覆盖提示、强制复制。

常用选项:

  • -i:覆盖前先问一句(interactive,保命选项,避免误覆盖);
  • -r/-R:递归复制目录(复制文件夹必须加,不然报错);
  • -f:强制复制(force,忽略不存在的文件,覆盖时不提示,慎用);
  • -p:保留文件的属性(权限、修改时间、属主等,备份文件常用)。

实战示例:

# 1. 复制单个文件(带覆盖提示,-i)
cp -i ~/document.txt /tmp/
# 若 /tmp/ 已存在 document.txt,会提示:cp: overwrite '/tmp/document.txt'? y/n

# 2. 递归复制目录(-r)
cp -r ~/projects/ /backup/  # 复制 projects 目录及所有子内容到 /backup/
# 安全写法:目标目录加 /,明确是“复制到该目录下”
cp -r ~/projects/ /backup/projects/  # 若目标目录不存在,会自动创建

# 3. 备份配置文件(保留属性,-p)
cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# 复制后,备份文件的权限、修改时间与原文件一致

注意事项:复制目录时,目标路径末尾加不加 / 效果不一样:

  • cp -r dirA dirB:若 dirB 不存在,创建 dirB 并把 dirA 内容放进去;
  • cp -r dirA dirB/:若 dirB 已存在,把 dirA 及其内容放进 dirB 下。

3. rm:删除文件 / 目录

rm 用来删文件或目录,这是个风险挺高的命令,安全选项一定要记熟。

常用选项:

  • -i:删除前提示(安全必备,避免误删);
  • -r/-R:递归删除目录(删文件夹必须加);
  • -f:强制删除(忽略不存在的文件,不提示,生产环境慎用)。

实战示例:

# 1. 删除单个文件(带提示,-i)
rm -i ~/old_file.txt
# 提示:rm: remove regular file 'old_file.txt'? y/n

# 2. 删除目录(递归+提示,-ri)
rm -ri ~/old_dir/
# 逐个提示是否删除目录下的文件,确认后递归删除

# 3. 强制删除(-f,仅在确认文件无用时使用)
rm -f /tmp/temp_file*  # 删除 /tmp 下所有 temp_file 开头的临时文件

安全警告:

  • 千万别直接跑 rm -rf /(删根目录,系统当场完蛋);
  • 生产环境建议给 rm 设个别名 alias rm=‘rm -i’(防手滑);
  • 删重要文件前,最好先挪到临时回收站(比如 mv file ~/trash/)而不是直接删。

4. mkdir:创建目录

mkdir 用来建空目录,支持一口气建多级目录(不用一级一级手动建)。

常用选项:

  • -p:递归建多级目录(路径里父目录不存在就自动建)。

实战示例:

# 1. 创建单个目录
mkdir ~/docs

# 2. 递归创建多级目录(-p,常用)
mkdir -p ~/projects/linux/commands  # 即使 projects、linux 不存在,也会自动创建
# 若不加 -p,会报错:mkdir: cannot create directory ‘projects/linux/commands’: No such file or directory

# 3. 同时创建多个目录
mkdir ~/docs/{note,report,backup}  # 批量创建 note、report、backup 三个子目录

5. cat/tail:查看文件内容

cat 和 tail 都是看文件内容的,分工不同:

  • cat:看小文件的完整内容(文件太大时会瞬间刷屏,不推荐);
  • tail:看文件末尾内容(默认最后 10 行),还能实时跟着文件更新(比如看日志)。

cat 常用选项:

  • -n:显示行号(含空行);
  • -b:显示行号(不含空行)。

tail 常用选项:

  • -n N/-N:看最后 N 行(比如 -n 5 或 -5 看最后 5 行);
  • -n +N/+N:从第 N 行开始看到文件末尾;
  • -f:实时跟着文件更新(follow,看日志高频用)。

实战示例:

# 1. 查看文件并显示行号(cat -n)
cat -n /etc/passwd  # 查看用户配置文件,每行带编号

# 2. 查看文件最后 5 行(tail -5)
tail -5 /var/log/syslog  # 查看系统日志的最新 5 条记录

# 3. 从第 10 行开始查看文件(tail +10)
tail +10 /etc/profile  # 跳过前 9 行,查看第 10 行及以后内容

# 4. 实时跟踪日志(tail -f,运维高频)
tail -f /var/log/nginx/access.log  # 实时查看 Nginx 访问日志,按 Ctrl+C 退出

三、进程控制命令:管理系统中的运行程序

这类命令用来查看、干掉进程,或者调进程的优先级,专治 “程序卡死”“资源占用过高” 这些毛病。

1. ps:查看进程状态

ps 列出系统里的进程信息(进程 ID、状态、占用资源等),支持多种输出格式,不同场景用不同的组合。

ps 在 Linux 里支持 3 种风格的选项(写法不一样),实战里常用这些组合:

命令组合风格功能说明
ps -efUnix 风格显示所有进程的完整信息(PID、PPID、UID、启动时间、命令等)
ps -eflUnix 风格比 -ef 多显示进程优先级(NI)、CPU 占用率(% C)等细节
ps auxBSD 风格显示所有进程的用户、CPU / 内存占用率、状态(STAT)、启动时间等
ps —forestGNU 风格以树形结构显示进程(清晰展示父进程与子进程的关系,如查看服务的子进程)
ps -p PID -o 字段通用查看指定进程(PID)的特定字段(如 PID、PPID、NI、命令)

实战示例:

# 1. 查看所有进程的完整信息(常用)
ps -ef | grep nginx  # 查看所有 nginx 相关进程

# 2. 以树形结构查看进程(展示父子关系)
ps --forest -ef | grep docker  # 查看 docker 进程及其子进程的树形结构

# 3. 查看指定进程的特定信息(如 PID=1234 的进程)
ps -p 1234 -o pid,ppid,ni,cmd  # 仅显示 PID、PPID(父进程 ID)、NI(优先级)、命令

STAT 字段里那些字母代表进程当前的状态:

  • R:运行中(正在占用或等着用 CPU);
  • S:睡眠中(等某个事件完成,比如 I/O 操作);
  • D:不可中断睡眠(通常跟磁盘 I/O 有关,kill 也干不掉);
  • Z:僵尸进程(进程已结束,但父进程没回收资源,得杀父进程才能清掉);
  • T:暂停状态(被 Ctrl+Z 或者 kill -STOP 暂停了)。

2. kill/killall/pkill:终止进程

这三个都是给进程发信号,实现“终止”“暂停”“重启”之类的操作,区别只在于“按什么方式指定目标”。

命令目标指定方式核心特点适用场景
kill进程 ID(PID)需先通过 ps 等命令获取 PID,仅能针对单个或多个 PID 操作终止已知 PID 的单个 / 少量进程
killall进程名(如 nginx)直接通过进程名终止所有匹配进程,支持通配符(如 killall nginx*)终止同名的多个进程
pkill进程名 / 属性(如用户)比 killall 更灵活,支持按进程名、用户、终端等属性过滤(如 pkill -u user1)按条件批量终止进程

常用的信号(数字和对应功能):

  • 1(SIGHUP):重启进程(比如重载配置,进程不终止);
  • 9(SIGKILL):强制终止(进程抓不住,必死);
  • 15(SIGTERM):默认信号,让进程正常退出(进程可以自己先清理资源)。

实战示例:

# 1. kill:通过 PID 终止进程(强制终止,-9)
ps -ef | grep nginx  # 先获取 nginx 主进程 PID(如 1234)
kill -9 1234         # 强制终止 PID=1234 的进程

# 2. killall:通过进程名终止所有匹配进程
killall -9 nginx     # 强制终止所有 nginx 进程(无需查 PID)
killall -1 nginx     # 重启所有 nginx 进程(重载配置)

# 3. pkill:按条件终止进程(如终止用户 user1 的所有进程)
pkill -u user1       # 终止 user1 发起的所有进程
pkill -f "python app.py"  # 按完整命令行匹配(终止运行 "python app.py" 的进程)

注意事项:

  • 优先用 15(默认)或 1 信号,别上来就用 9(强制终止可能让数据丢了,比如数据库进程);
  • killall 在不同系统(CentOS、Ubuntu 等)上行为可能不一样,批量操作前先用 killall -l 进程名 看看会匹配到哪些进程。

3. nice/renice:调整进程优先级

Linux 里进程的调度优先级由“nice 值”控制,值越小优先级越高(越容易抢到 CPU)。nice 用来在启动时就设好优先级,renice 用来调已经在跑的进程的优先级。

nice 值有几个规则:范围从 -20(优先级最高)到 19(最低);普通用户只能设 0~19(也就是只能调低自己进程的优先级),不能设负数;root 才能设任意值(包括负数,把优先级提上去)。

实战示例:

# 1. nice:启动进程时设置优先级(nice 值 5,优先级较低)
nice -n 5 ./data-processing.sh  # 以 nice=5 启动脚本(适合非紧急任务)
nice --10 ./web-server.sh       # 以 nice=-10 启动服务(仅 root 可用,高优先级)

# 2. renice:调整已运行进程的优先级(将 PID=1234 的进程 nice 值改为 10)
renice -n 10 -p 1234  # -p 指定 PID
renice -n -5 -u user1  # 调整 user1 所有进程的 nice 值为 -5(仅 root 可用)

什么时候用:像后台数据备份、日志分析这种不急的活,给个高一点的 nice 值(比如 10),别让它抢 CPU;Web 服务、数据库这类核心进程,给个低 nice 值(比如 -5),让它优先拿到 CPU。

4. jobs/fg/bg:管理后台任务

在 Shell 会话里,可以把进程丢到“后台”跑(不占着命令行),或者从后台调回“前台”,适合长时间运行的任务(比如脚本、下载)。

几个核心概念:

  • 前台任务:占着当前命令行,得等它跑完才能输新命令;
  • 后台任务:在后台跑,不挡命令行,但还是依赖当前这个 Shell 会话(会话一关,任务就跟着没了);
  • 任务 ID(% N):Shell 给后台任务编的号(比如 %1 是第一个后台任务),跟系统的 PID 不是一回事。

实战示例:

# 1. 将任务放入后台(命令后加 &)
./long-task.sh &  # 启动脚本并放入后台,输出任务 ID 和 PID(如 [1] 1234)

# 2. jobs:查看后台任务状态
jobs              # 显示所有后台任务(RUNNING:运行中,STOPPED:暂停)
jobs -l           # 额外显示任务的 PID
# 预期输出:
# [1]+  Running                 ./long-task.sh &

# 3. fg:将后台任务调回前台
fg %1             # 将任务 1 调回前台(若只有一个后台任务,可直接用 fg)
# 注:调回前台后,按 Ctrl+C 可终止任务,按 Ctrl+Z 可暂停任务

# 4. bg:将暂停的后台任务恢复运行
Ctrl+Z            # 暂停当前前台任务(如运行中的 ./long-task.sh)
jobs              # 查看暂停的任务(状态为 STOPPED)
bg %1             # 将暂停的任务 1 恢复为后台运行

注意事项:

  • 后台任务依赖当前 Shell 会话,要是想“关了会话还在跑”,得用 nohup 或者 screen(比如 nohup ./long-task.sh &);
  • 暂停的任务(STOPPED)得用 bg 恢复,或者用 fg 调回前台继续,直接关 Shell 会把它干掉。

5. coproc:创建协同进程(高级)

coproc 用来创建一个“后台协同进程”,并且跟当前 Shell 建立管道通信(可以双向传数据),适合需要跟后台进程交互的场景(比如实时处理数据)。

实战示例:

# 1. 基本用法:创建压缩文件的协同进程
coproc ZIP_PROC { zip -r backup.zip ./docs; }  # 后台压缩 docs 目录,进程名为 ZIP_PROC
# 查看进程状态(coproc 会创建子 Shell 运行任务)
ps -ef | grep zip

# 2. 带括号的格式(支持复杂命令)
coproc (tar -czf - ./logs | gzip -d > logs.tar)  # 先压缩再解压,演示管道通信

注意事项:

  • coproc 是 Bash 4.0+ 才有的功能,老版本 Bash 不支持;
  • 协同进程的输出可以通过 $COPROC[0](标准输出)和 $COPROC[1](标准输入)访问,适合写高级脚本,日常运维用得不多。

四、磁盘与分区管理命令:查看磁盘状态与管理存储

这类命令用来“看磁盘占用”“挂载 / 卸载分区”“建文件系统”“管 LVM(逻辑卷)”,是服务器存储运维的核心家伙。

1. df:查看磁盘空间使用情况

df 显示文件系统的磁盘空间占用(总容量、已用、可用、挂载点),常用来查磁盘是不是满了。

常用选项:

  • -h:按 “人类可读格式” 显示(KB、MB、GB,基于 1024 算);
  • -H:也是 “人类可读格式”,但基于 1000 算(跟 Windows 一致);
  • -t:只看指定文件系统类型的分区(比如 ext4、xfs);
  • -T:显示文件系统类型(比如 ext4、tmpfs)。

实战示例:

# 1. 查看所有分区的磁盘占用(人类可读格式,-h)
df -h
# 预期输出(关键列):
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   20G   27G  43% /
# /dev/sdb1       100G   10G   85G  11% /data

# 2. 仅查看 ext4 和 xfs 类型的分区(-t)
df -h -t ext4 -t xfs

# 3. 查看 /data 分区的详细信息(含文件系统类型,-T)
df -hT /data

注意事项:

  • df 显示的“已用空间”可能含系统预留空间(默认 5%,只有 root 能用),普通用户看到的“可用空间”会比实际小一点;
  • 哪个分区 Use% 快到 100% 了,就得赶紧清(删日志、清临时文件),不然系统写不进数据。

2. du:查看文件 / 目录占用空间

du 显示单个文件或目录占了多少磁盘空间(跟 df 不同,df 看分区整体,du 看具体文件 / 目录)。

常用选项:

  • -s:只看总大小(summary,不列子目录 / 文件的明细);
  • -h:人类可读格式;
  • -a:显示所有文件(含子目录下的单个文件,默认只显示目录);
  • —max-depth=N:限制递归深度(比如 —max-depth=1 只看当前目录下的一级目录 / 文件)。

实战示例:

# 1. 查看当前目录总占用空间(-sh)
du -sh
# 预期输出:2.5G	.

# 2. 查看当前目录下所有一级目录的占用(--max-depth=1)
du -sh --max-depth=1 *
# 预期输出:
# 1.2G	docs
# 800M	logs
# 500M	tmp

# 3. 查看单个文件的大小(-h)
du -h /var/log/syslog
# 预期输出:1.2M	/var/log/syslog

# 4. 按大小排序,找出当前目录下最大的 5 个文件/目录
du -sh * | sort -hr | head -n 5  # sort -hr:按人类可读格式倒序排序

实用技巧:配合 find 找大文件(比如找 /home 下大于 100MB 的文件):

find /home -type f -size +100M -exec du -sh {} \;

3. mount/umount:挂载 / 卸载文件系统

mount 和 umount 干的是相反的事:

  • mount:把磁盘分区、U 盘、ISO 文件等“挂”到 Linux 的目录树里(不挂载就用不了);
  • umount:把挂好的文件系统“卸”下来(卸之前得确保没进程在访问这个目录,不然报错)。

mount 常用选项:

  • -t:指定文件系统类型(比如 ext4、xfs、ntfs-3g(Windows 分区)、iso9660(ISO 文件));
  • -o:指定挂载选项(比如 ro(只读)、rw(读写,默认)、noexec(禁止跑这个目录下的程序));
  • -a:按 /etc/fstab 的配置,把没挂的全挂上(系统开机时自动执行)。

实战示例:

# 1. 挂载磁盘分区(/dev/sdb1 挂载到 /mnt/data,ext4 格式,只读)
mount -t ext4 -o ro /dev/sdb1 /mnt/data
# 验证挂载:查看 /mnt/data 目录下的内容,或用 df -h 查看

# 2. 挂载 ISO 文件(loop 设备,模拟光盘)
mount -t iso9660 -o loop /tmp/ubuntu.iso /mnt/iso
# 注:-o loop 用于把“普通文件”当块设备挂

# 3. 永久挂载(写入 /etc/fstab,系统重启后自动挂载)
# 步骤1:查看分区的 UUID(避免设备名变化导致挂载失败)
blkid /dev/sdb1  # 输出 UUID="xxxx-xxxx-xxxx-xxxx"
# 步骤2:编辑 /etc/fstab,添加一行(格式:UUID=xxx 挂载点 类型 选项 0 0)
echo 'UUID=xxxx-xxxx-xxxx-xxxx /mnt/data ext4 defaults 0 0' >> /etc/fstab
# 步骤3:测试挂载(无需重启)
mount -a

# 4. umount:卸载文件系统(指定设备或挂载点)
umount /dev/sdb1  # 通过设备卸载
umount /mnt/data  # 通过挂载点卸载(推荐,更明确)

umount 常见问题:

  • 报错 umount: /mnt/data: target is busy.(目标忙):
    1. 看看是哪个进程在访问这个目录:fuser -m /mnt/data(会显示占用进程的 PID);
    2. 干掉它:kill -9 PID;
    3. 再卸一次:umount /mnt/data。

4. fdisk/gdisk/parted:分区管理

这三个命令用来在磁盘上建、删、调分区,区别在支持的分区表格式不一样,得按磁盘大小和需要来选:

命令支持分区表格式最大磁盘支持核心特点适用场景
fdiskMBR2TB经典工具,操作简单,支持大多数 Linux 系统2TB 以下磁盘,传统 MBR 分区
gdiskGPT无限制(支持 18EB)支持 GPT 分区表,操作逻辑与 fdisk 类似,适合大磁盘2TB 以上磁盘,GPT 分区
partedMBR/GPT无限制支持两种分区表,命令更接近 “自然语言”,可交互式或非交互式操作,功能更全面需灵活切换分区表格式的场景

实战示例(以 fdisk 为例,建 MBR 分区):

# 1. 查看系统中的磁盘(确认目标磁盘,如 /dev/sdb)
lsblk  # 列出所有块设备(磁盘、分区)
fdisk -l /dev/sdb  # 查看 /dev/sdb 磁盘的详细信息(是否已有分区)

# 2. 进入 fdisk 交互式界面(操作 /dev/sdb,需 root 权限)
fdisk /dev/sdb

# 3. 核心操作(fdisk 交互命令)
# - n:创建新分区(按提示选择“主分区/扩展分区”“分区号”“起始扇区”“大小”)
# - p:查看当前分区表(确认分区是否创建成功)
# - d:删除分区(谨慎使用,需指定分区号)
# - w:保存修改并退出(必须执行,否则所有操作无效)
# - q:放弃修改并退出

# 示例流程(创建一个 50GB 的主分区):
# 输入 n → 选择 p(主分区)→ 分区号 1 → 起始扇区默认(按 Enter)→ 输入 +50G(分区大小)→ 输入 p 查看 → 输入 w 保存退出

注意事项:

  • 分区操作会清空磁盘上的所有数据,动手前一定先备份重要数据;
  • 对已挂载的磁盘,得先卸掉所有分区(umount /dev/sdb*),再分区;
  • 分区完之后,得用 mkfs 建文件系统(比如 mkfs -t ext4 /dev/sdb1),才能挂载使用。

5. lvm 相关命令:逻辑卷管理(高级存储)

LVM(Logical Volume Manager,逻辑卷管理)是 Linux 里一套很灵活的存储方案,能把多个物理磁盘 / 分区(PV)揉成一个卷组(VG),再从卷组里切逻辑卷(LV),支持“动态扩容 / 缩容”“跨磁盘整合”,解决了传统分区“大小固定、改不了”的毛病。

几个核心概念:

  • PV(Physical Volume,物理卷):最底层的存储单元(比如 /dev/sdb1、/dev/sdc1),得先初始化才能进 LVM;
  • VG(Volume Group,卷组):把多个 PV 揉成一个“存储池”,可以动态加 / 减 PV;
  • LV(Logical Volume,逻辑卷):从 VG 里切出来的“虚拟分区”,能直接格式化挂载用,大小还能动态调整。

按流程走的常用 LVM 命令组合:

操作流程命令组合核心作用
1. 创建 PVpvcreate /dev/sdb1 /dev/sdc1将物理分区初始化为 PV,纳入 LVM 管理
2. 创建 VGvgcreate vg00 /dev/sdb1 /dev/sdc1将 PV 整合为卷组 vg00,形成存储池
3. 创建 LVlvcreate -L 20G -n lv_data vg00从 vg00 中划分 20GB 的逻辑卷,命名为 lv_data(路径:/dev/vg00/lv_data)
4. 格式化与挂载 LVmkfs -t ext4 /dev/vg00/lv_data && mount /dev/vg00/lv_data /data格式化 LV 为 ext4 格式,挂载到 /data 目录
5. 扩展 LV(扩容)lvextend -L 30G /dev/vg00/lv_data && resize2fs /dev/vg00/lv_data先扩展 LV 大小到 30GB,再调整文件系统大小(ext4 用 resize2fs,xfs 用 xfs_growfs)
6. 查看 LVM 状态pvdisplay/vgdisplay/lvdisplay分别查看 PV、VG、LV 的详细信息(大小、状态、关联关系)

实战示例(完整 LVM 创建流程):

# 1. 初始化物理卷(PV)
pvcreate /dev/sdb1 /dev/sdc1  # 将 /dev/sdb1 和 /dev/sdc1 初始化为 PV
pvdisplay                     # 验证 PV 创建结果(查看 PV 大小、状态)

# 2. 创建卷组(VG)
vgcreate vg00 /dev/sdb1 /dev/sdc1  # 卷组命名为 vg00,包含两个 PV
vgdisplay vg00                    # 查看 vg00 的总容量、剩余容量

# 3. 创建逻辑卷(LV)
lvcreate -L 20G -n lv_data vg00  # 划分 20GB 逻辑卷 lv_data
lvdisplay /dev/vg00/lv_data      # 查看 lv_data 的路径、大小

# 4. 格式化并挂载 LV(日常使用)
mkfs -t ext4 /dev/vg00/lv_data   # 格式化为 ext4 文件系统
mkdir /data                       # 创建挂载点
mount /dev/vg00/lv_data /data     # 挂载 LV 到 /data
echo '/dev/vg00/lv_data /data ext4 defaults 0 0' >> /etc/fstab  # 永久挂载

# 5. 扩展 LV(后续扩容需求)
# 步骤1:先扩展 LV 大小(从 20GB 到 30GB)
lvextend -L 30G /dev/vg00/lv_data
# 步骤2:调整文件系统大小(ext4 用 resize2fs,xfs 用 xfs_growfs)
resize2fs /dev/vg00/lv_data
# 验证扩容结果
df -h /data  # 查看 /data 分区大小是否变为 30GB

注意事项:

  • 缩容 LV 得先卸载分区再查文件系统(e2fsck -f /dev/vg00/lv_data),风险不小,建议能扩容就别缩容;
  • XFS 文件系统只支持扩容,不支持缩容,要缩容只能备份数据后重建 LV;
  • 扩完 LV 必须执行“文件系统调整命令”(比如 resize2fs),不然文件系统认不出新增的空间。

6. 其他磁盘工具命令

命令功能定位实战示例
lsblk以树形结构列出所有块设备(磁盘、分区、LV),直观展示存储设备关系lsblk # 查看所有设备的层级关系(如 /dev/sda 包含 /dev/sda1、/dev/sda2)
mkfs创建文件系统(格式化分区 / LV),支持 ext4、xfs、vfat 等格式mkfs -t xfs /dev/vg00/lv_data # 格式化 LV 为 xfs 格式
fsck检查并修复文件系统错误(如断电导致的磁盘损坏),需卸载后执行umount /data && fsck -a -t ext4 /dev/vg00/lv_data # 自动修复 ext4 错误
blkid查看块设备的 UUID 和文件系统类型(用于 /etc/fstab 永久挂载,避免设备名变化)blkid /dev/sdb1 # 查看 /dev/sdb1 的 UUID(如 UUID=“a1b2c3d4-1234-5678-90ab-cdef01234567”)

五、用户与权限管理命令:控制访问与安全

Linux 是多用户系统,用户和权限管理是系统安全的核心。这类命令用来“建 / 删用户”“管用户组”“改文件权限”,免得别人乱访问。

1. 用户管理:useradd/userdel/usermod/passwd

(1)useradd:创建用户

常用选项:

  • -m:建用户时顺手建主目录(/home/用户名),不加的话得手动建;
  • -d:指定自定义主目录(比如 -d /opt/user1);
  • -s:指定用户的默认登录 Shell(比如 -s /bin/bash,/sbin/nologin 表示禁止登录);
  • -G:把用户加进指定附加组(比如 -G sudo 给 sudo 权限);
  • -D:查看或修改 useradd 的默认配置(比如默认 Shell、主目录路径)。

实战示例:

# 1. 创建普通用户(带主目录,默认 Shell)
useradd -m user1  # 自动创建 /home/user1 目录,默认 Shell 为 /bin/bash
passwd user1      # 为 user1 设置密码(需输入两次,密码不可见)

# 2. 创建禁止登录的系统用户(用于运行服务)
useradd -s /sbin/nologin -M nginx  # -M 不创建主目录,-s 指定禁止登录 Shell
# 场景:用于 Nginx 服务进程,避免用户直接登录系统

# 3. 查看 useradd 默认配置
useradd -D
# 预期输出:默认主目录(/home)、默认 Shell(/bin/bash)、默认组(100)等

(2)userdel:删除用户

常用选项:

  • -r:删用户时把主目录(/home/用户名)和邮件目录(/var/spool/mail/用户名)一起删掉,慎用。

实战示例:

# 1. 仅删除用户(保留主目录,安全操作)
userdel user1

# 2. 彻底删除用户及主目录(-r,需确认主目录无重要数据)
userdel -r user1
# 警告:若主目录包含其他用户依赖的文件,删除后会导致数据丢失!

(3)usermod:修改用户属性

常用选项:

  • -c:改用户备注信息(姓名、部门之类);
  • -s:改默认登录 Shell(比如 -s /bin/zsh);
  • -g:改用户的主组(得先有这个组);
  • -aG:把用户追加进附加组(不覆盖原有附加组,比如 -aG sudo user1 给 sudo 权限);
  • -L/-U:锁定 / 解锁用户(锁了就登不进,比如 -L user1)。

实战示例:

# 1. 赋予用户 sudo 权限(加入 sudo 附加组)
usermod -aG sudo user1
# 验证:切换到 user1,执行 sudo ls,看是否需要输入密码(配置 sudoers 可免密)

# 2. 锁定用户(禁止登录)
usermod -L user1
# 验证:su - user1 会提示“密码错误”(实际密码没变,只是账户被锁)

# 3. 解锁用户
usermod -U user1

(4)passwd:修改用户密码

常用选项:

  • -e:强制用户下次登录时改密码(常用来发初始密码,让用户自己改);
  • -l/-u:锁定 / 解锁用户密码(跟 usermod -L 类似,但只影响密码登录)。

实战示例:

# 1. 管理员修改其他用户密码(无需输入旧密码)
passwd user1  # 输入新密码两次(密码强度需符合系统要求,如长度≥8位、含大小写)

# 2. 强制用户下次登录修改密码(-e)
passwd -e user1
# 效果:user1 下次登录时,会提示“您的密码已过期,请设置新密码”

2. 组管理:groupadd/groupmod/groupdel

Linux 里用户组分“主组”(用户默认所属、建用户时自动建的)和“附加组”(额外加进去的,用来共享权限),组管理命令就是维护这些组的。

实战示例:

# 1. 创建新组(如开发组 dev)
groupadd dev

# 2. 修改组名(将 dev 改为 develop)
groupmod -n develop dev

# 3. 修改组的 GID(组唯一标识,如将 GID 改为 1005)
groupmod -g 1005 develop

# 4. 删除组(需确保组内无用户,否则需先调整用户组)
groupdel develop
# 若报错“groupdel: cannot remove the primary group of user 'user1'”,需先将 user1 的主组改为其他组(usermod -g users user1)

3. 权限管理:chmod/chown/chgrp/setfacl

Linux 文件权限分“所有者(u)”“所属组(g)”“其他用户(o)”三类,每类有“读(r=4)、写(w=2)、执行(x=1)”三种权限,权限管理命令就是调这些规则的。

(1)chmod:修改文件 / 目录权限

权限有两种表示法:

  • 数字格式:三位数字(比如 755 → 所有者 rwx(4+2+1)、所属组 rx(4+1)、其他 rx(4+1));
  • 符号格式:用 u/g/o/a(所有者 / 所属组 / 其他 / 所有)+ +/-/=(加 / 减 / 设)+ r/w/x(比如 chmod u+x file 给所有者加执行权限)。

实战示例:

# 1. 数字格式修改权限(常用)
chmod 755 script.sh  # 所有者 rwx,所属组 rx,其他 rx(脚本文件常用权限)
chmod 644 config.conf  # 所有者 rw,所属组 r,其他 r(配置文件常用权限)
chmod 700 ~/private/  # 仅所有者可读写执行,其他用户没权限(私有目录)

# 2. 符号格式修改权限(灵活)
chmod u+x script.sh  # 给所有者添加执行权限
chmod g-w config.conf  # 移除所属组的写权限
chmod o=r config.conf  # 给其他用户设成仅读权限
chmod a+x script.sh  # 给所有用户添加执行权限(a=all)

# 3. 递归修改目录权限(-R)
chmod -R 755 /opt/app/  # 递归修改 /opt/app 目录及所有子文件的权限为 755

(2)chown:修改文件 / 目录的所有者与所属组

基本格式是 chown [所有者]:[所属组] 文件/目录,冒号也能用点代替,要是只改所属组,所有者可以省略(比如 chown :dev file)。

实战示例:

# 1. 仅修改所有者
chown user1 file.txt  # 将 file.txt 的所有者改为 user1

# 2. 仅修改所属组
chown :dev file.txt  # 将 file.txt 的所属组改为 dev

# 3. 同时修改所有者和所属组
chown user1:dev file.txt  # 所有者改为 user1,所属组改为 dev

# 4. 递归修改目录(-R,常用于权限交接)
chown -R user1:dev /opt/project/  # 递归修改项目目录的所有者和所属组

(3)chgrp:仅修改所属组(简化版 chown)

chgrp 专门用来改文件 / 目录的所属组,语法比 chown :组 更直白。

实战示例:

chgrp dev file.txt  # 将 file.txt 的所属组改为 dev
chgrp -R dev /opt/project/  # 递归修改目录所属组

(4)setfacl/getfacl:设置 ACL 权限(精细控制)

传统权限只支持“所有者、所属组、其他”三类用户,ACL(Access Control List)可以对“单个用户、多个组”设独立权限(比如单独给 user2 写权限,不用把他加进所属组),是复杂场景下的权限解法。

setfacl 常用选项:

  • -m:加 / 改 ACL 规则(比如 -m u:user2:rw file 给 user2 设 rw 权限);
  • -x:删指定的 ACL 规则(比如 -x u:user2 file 删掉 user2 的 ACL 权限);
  • -d:给目录设默认 ACL(目录下新建文件自动继承,比如 -d g:dev:rw dir);
  • -R:递归把 ACL 规则应用到目录及子文件。

实战示例:

# 1. 给单个用户设置 ACL 权限
setfacl -m u:user2:rw file.txt  # 给 user2 单独设 rw 权限(即使 user2 不在所属组)
getfacl file.txt  # 查看 ACL 权限(验证是否生效)

# 2. 给组设置 ACL 权限
setfacl -m g:test:r file.txt  # 给 test 组设 r 权限

# 3. 设置目录默认 ACL(新建文件自动继承)
setfacl -d -m g:dev:rw /opt/shared/  # 共享目录 /opt/shared 下新建的文件,自动给 dev 组 rw 权限

# 4. 递归删除 ACL 权限
setfacl -R -x u:user2 /opt/shared/  # 递归删除 user2 在 /opt/shared 下的所有 ACL 权限

六、软件包管理命令:dpkg 与 apt(Debian/Ubuntu 系列)

Linux 软件包管理分“Debian 系”(.deb 包,比如 Ubuntu、Debian)和“RPM 系”(.rpm 包,比如 CentOS、RHEL)。这篇文章聚焦 Debian 系最常用的 dpkg(底层工具)和 apt(高层工具),覆盖“安装、卸载、更新、搜索”软件全流程。

1. dpkg:底层 DEB 包管理工具

dpkg 是直接操作 .deb 包文件的底层工具,负责“安装、删除、查询”单个 DEB 包,但它不自动处理依赖关系(得自己搞定依赖),适合离线安装。

常用选项:

选项功能说明
-i安装 DEB 包文件(如 dpkg -i package.deb)
-L列出已安装包的所有文件路径(如 dpkg -L nginx 查看 nginx 安装的文件)
—search查找指定文件属于哪个已安装包(如 dpkg —search /usr/sbin/nginx)
-r移除已安装包(保留配置文件,如 dpkg -r nginx)
-P彻底移除已安装包(删除配置文件,如 dpkg -P nginx,等价于 apt purge)
-l列出所有已安装包的状态(如 dpkg -l | grep nginx 查看 nginx 安装状态)

实战示例:

# 1. 离线安装 DEB 包(需提前下载 .deb 文件)
dpkg -i ~/downloads/nginx_1.24.0-1ubuntu1_amd64.deb
# 若报错“依赖关系未满足”,需先执行 apt -f install 修复依赖

# 2. 查看 nginx 包安装的所有文件路径
dpkg -L nginx
# 预期输出:/usr/sbin/nginx(二进制文件)、/etc/nginx(配置目录)、/var/log/nginx(日志目录)等

# 3. 查找 /usr/bin/ls 属于哪个包(验证系统工具归属)
dpkg --search /usr/bin/ls
# 预期输出:coreutils: /usr/bin/ls(说明 ls 属于 coreutils 包)

# 4. 彻底卸载 nginx(删除配置文件)
dpkg -P nginx

注意事项:

  • dpkg -i 装包时若报“依赖缺失”,跑 apt -f install 自动补依赖(apt 会把缺的包装上);
  • 优先用 apt(而不是上来就 dpkg),免得自己处理依赖麻烦。

2. apt:高层软件包管理工具(推荐)

apt 是 Debian 系 Linux 里最常用的高层工具,把 apt-get(安装 / 更新)、apt-cache(搜索 / 查询)的功能都合在一起,支持“自动处理依赖”“从软件源更新包索引”,操作更简洁、交互更友好,日常管软件首选它。

常用操作对应命令:

操作需求命令示例功能说明
1. 更新软件源索引apt update从 /etc/apt/sources.list 配置的软件源,同步最新的包版本信息(不更新软件)
2. 升级已安装软件apt upgrade升级所有已安装软件到最新版本(不删除旧包,不安装新依赖包)
3. 完整升级(含依赖调整)apt full-upgrade升级软件时,允许删除旧包、安装新依赖包(适合跨版本升级,如 Ubuntu 22.04→24.04)
4. 安装软件包apt install nginx安装 nginx 及其所有依赖包,支持批量安装(如 apt install nginx mysql)
5. 卸载软件包(保留配置)apt remove nginx卸载 nginx,但保留 /etc/nginx 等配置文件(后续重装可复用配置)
6. 彻底卸载软件包apt purge nginx卸载 nginx 并删除所有配置文件(完全清理,无残留)
7. 搜索软件包apt search “web server”按关键词搜索软件包(如搜索 “web server” 相关的 nginx、apache)
8. 查看软件包详情apt show nginx显示 nginx 包的版本、依赖、描述、安装大小等详细信息
9. 清理无用依赖apt autoremove自动删除 “已安装但不再被需要的依赖包”(如软件卸载后残留的依赖)
10. 清理下载的包文件apt autoclean清理 /var/cache/apt/archives 中过时的 .deb 包文件(保留最新版本)

实战示例(常用流程):

# 1. 日常更新系统(先更新索引,再升级软件,最后清理无用依赖)
sudo apt update -y        # -y 自动确认,避免手动输入 y
sudo apt upgrade -y
sudo apt autoremove -y

# 2. 安装并配置 nginx(完整流程)
sudo apt install nginx -y  # 安装 nginx
sudo systemctl start nginx # 启动 nginx 服务
apt show nginx             # 查看 nginx 安装详情(如版本、依赖)

# 3. 搜索并安装 MySQL(按关键词搜索)
apt search mysql-server    # 搜索 MySQL 服务器相关包
sudo apt install mysql-server -y  # 安装 MySQL 服务

# 4. 彻底卸载 MySQL(清理配置和依赖)
sudo apt purge mysql-server -y
sudo apt autoremove -y     # 清理 MySQL 残留的依赖包

实用技巧:

  • 装特定版本:apt install nginx=1.24.0-1ubuntu1(得先用 apt show nginx 看有哪些版本);
  • 禁止软件自动升级:apt-mark hold nginx(把 nginx 版本锁住,免得 apt upgrade 误升),解锁用 apt-mark unhold nginx。

七、定时任务命令:at 与 crontab(自动化操作)

Linux 定时任务用来“按指定时间自动执行命令 / 脚本”,分“一次性任务”(at)和“周期性任务”(crontab),是运维自动化的核心(比如定时备份、清日志)。

1. at:执行一次性定时任务

at 安排“只跑一次”的任务(比如“今天 18:00 执行备份脚本”“明早 2 点重启服务”),跑完自动清除,不重复。

常用选项:

  • -f:指定要执行的脚本文档(比如 at -f backup.sh 18:00);
  • -M:禁止任务执行时发邮件通知(默认会把输出发到当前用户邮箱);
  • -t:按 “YYYYMMDDHHMM” 格式指定时间(比如 at -t 202406010200 -f restart.sh 表示 2024 年 6 月 1 日 2 点执行)。

支持的时间格式:

  • 绝对时间:18:00(今天 18 点)、2024-06-01 18:00(指定日期时间);
  • 相对时间:now + 1 hour(1 小时后)、now + 30 minutes(30 分钟后)、tomorrow 2:00(明早 2 点)。

实战示例:

# 1. 1 小时后执行备份脚本(交互式输入任务)
at now + 1 hour
# 进入 at 编辑界面,输入要执行的命令:
# /home/user1/scripts/backup.sh
# 按 Ctrl+D 保存退出(会提示任务 ID,如 job 1 at 2024-05-30 17:30)

# 2. 指定时间执行脚本(通过 -f 读取脚本文件)
at -f /home/user1/scripts/backup.sh 2024-06-01 02:00
# 场景:明早 2 点执行备份,避免占用白天资源

# 3. 查看等待执行的 at 任务
atq  # 显示任务 ID、执行时间、用户(如 1	Thu May 30 17:30:00 2024 a user1)

# 4. 删除等待执行的 at 任务(按任务 ID)
atrm 1  # 删除任务 ID 为 1 的 at 任务

注意事项:

  • at 任务依赖 atd 服务,得先确保它启动了(systemctl start atd,并设置开机启动 systemctl enable atd);
  • 任务执行的输出默认发到用户邮箱(用 mail 命令能看),不需要通知就加 -M。

2. crontab:执行周期性定时任务

crontab 安排“周期性重复”的任务(比如“每天凌晨 3 点备份”“每周日 22 点清日志”“每小时查一次服务状态”),是运维里最常用的定时任务工具,依赖 cron 服务。

几个核心概念:

  • crontab 文件:每个用户有自己独立的 crontab 文件(存在 /var/spool/cron/crontabs/ 下),记着周期性任务;
  • 时间表达式:由 5 个字段组成,代表“分 时 日 月 周”,字段间用空格隔开,支持通配符(* 所有值、/ 步长、- 范围、, 多个值)。

时间表达式格式:

字段位置含义取值范围特殊符号说明
1分钟0-59*/5 表示每 5 分钟,10-20 表示 10-20 分钟,10,20 表示 10 和 20 分钟
2小时0-23*/2 表示每 2 小时,3-5 表示 3-5 点
3日1-311,15 表示每月 1 号和 15 号
4月1-12 或 Jan-Dec*/3 表示每 3 个月
5周0-7 或 Sun-Sat(0 和 7 均为周日)0,6 表示每周日和周六

常用的时间表达式示例:

时间需求时间表达式说明
每天凌晨 3 点0 3 * * *分钟 0,小时 3,日 / 月 / 周任意
每 5 分钟执行一次_/5 _ * * *分钟每 5 步,其他字段任意
每周一到周五 18:3030 18 * * 1-5分钟 30,小时 18,周 1-5(周一到周五)
每月 1 号和 15 号 22 点0 22 1,15 * *分钟 0,小时 22,日 1 和 15,月 / 周任意

crontab 核心命令:

命令功能说明
crontab -l列出当前用户的所有定时任务(查看已配置的任务)
crontab -e编辑当前用户的定时任务(打开 vim 编辑器,添加 / 修改任务)
crontab -r删除当前用户的所有定时任务(谨慎使用,无确认步骤)
crontab -u 用户名 -l查看指定用户的定时任务(仅 root 可用,如 crontab -u user1 -l)

实战示例(配置定时备份任务):

# 1. 编辑当前用户的定时任务(crontab -e)
crontab -e
# 进入 vim 编辑器,添加以下内容(每天凌晨 3 点执行备份脚本,输出日志到 /var/log/backup.log):
0 3 * * * /home/user1/scripts/backup.sh >> /var/log/backup.log 2>&1
# 说明:
# >> /var/log/backup.log:将标准输出(stdout)追加到日志文件
# 2>&1:将标准错误(stderr)重定向到标准输出,确保错误信息也写入日志

# 2. 查看已配置的定时任务
crontab -l
# 预期输出:0 3 * * * /home/user1/scripts/backup.sh >> /var/log/backup.log 2>&1

# 3. 查看 cron 服务状态(确保任务能正常执行)
systemctl status cron
# 若服务未启动,执行:systemctl start cron && systemctl enable cron(设置开机启动)

# 4. 排查任务执行情况(查看日志)
tail -f /var/log/backup.log  # 实时查看备份日志
grep CRON /var/log/syslog    # 查看 cron 服务的系统日志(确认任务是否触发)

注意事项:

  • 定时任务的环境变量跟当前 Shell 不一样(比如 PATH 可能不含你的自定义路径),脚本里建议用绝对路径(比如 /usr/bin/mysqldump 而不是 mysqldump);
  • 别让任务时间重叠(比如备份要 1 小时,就别设成每 30 分钟跑一次);
  • 敏感任务(比如数据库备份)建议加上“执行结果通知”(任务结束后发邮件给管理员)。

八、其他高频工具命令:补充日常操作场景

除了上面那些核心分类,下面这些命令覆盖“文本处理、时间管理、临时文件、权限提升”等高频场景,是提效的关键。

1. 文本处理:grep/sort/tar/zip/unzip

(1)grep:搜索文本内容

grep 在文件或命令输出里搜匹配的字符串,支持正则,是“查日志、找配置”的核心工具。

常用选项:

  • -n:显示匹配行的行号;
  • -v:反向匹配(显示不含关键词的行);
  • -c:统计匹配行的数量;
  • -e:指定多个搜索条件(比如 -e user1 -e user2 搜含 user1 或 user2 的行);
  • -E:启用扩展正则(不用转义 | () 这些符号,等同于 egrep);
  • -r:递归搜目录下的所有文件(比如 grep -r “error” /var/log/)。

实战示例:

# 1. 搜索 /etc/passwd 中包含 user1 的行,并显示行号
grep -n user1 /etc/passwd

# 2. 统计 /var/log/syslog 中包含 ERROR 的行数
grep -c "ERROR" /var/log/syslog

# 3. 搜索当前目录及子目录中,包含 "nginx" 的 .conf 文件
grep -r "nginx" --include="*.conf" ./

# 4. 用扩展正则表达式,搜索包含 user1 或 user2 的行
grep -E "user1|user2" /etc/passwd

(2)sort:排序文本内容

sort 对文本文件或命令输出按“字母、数字、字段”排序,支持自定义分隔符和排序规则,常用来分析日志、统计数据。

常用选项:

  • -n:按 “数字大小” 排序(默认按字母排,比如 10 会排在 2 前面,-n 能纠正);
  • -r:倒序(从大到小 / 从 Z 到 A);
  • -t:指定字段分隔符(比如 -t ’:’ 用冒号分字段,常配合 /etc/passwd 这类配置);
  • -k:指定排序字段(配合 -t 用,比如 -k 3 按第 3 个字段排);
  • -u:去重(只留排序后重复行的第一行)。

实战示例:

# 1. 按数字大小排序(解决字母排序的数字错位问题)
# 原始文件 numbers.txt 内容:10 2 25 5
sort numbers.txt          # 默认字母排序:10 2 25 5
sort -n numbers.txt       # 数字排序:2 5 10 25
sort -nr numbers.txt      # 数字倒序:25 10 5 2

# 2. 按字段排序(以 /etc/passwd 为例,按 UID 排序)
# /etc/passwd 格式:用户名:密码:UID:GID:备注:主目录:Shell
sort -t ':' -k 3 -n /etc/passwd  # -t ':' 分隔字段,-k 3 按第 3 字段(UID),-n 数字排序

# 3. 结合其他命令排序(查看当前目录文件大小,按大小倒序)
du -sh * | sort -hr  # du -sh * 显示文件大小,sort -hr 按人类可读格式倒序(h 支持 KB/MB/GB)

(3)tar:打包与压缩 / 解压(Linux 标准工具)

tar 是 Linux 里最常用的“打包 + 压缩”工具,支持 .tar(仅打包)、.tar.gz(打包 + gzip 压缩)、.tar.bz2(打包 + bzip2 压缩)等格式,几乎覆盖所有压缩场景,尤其适合打包目录。

常用选项(记个口诀:“c 创 x 解 t 查看,v 详细 f 指定,z gzip j bzip2”):

选项功能说明
-c创建打包文件(create,用于压缩场景)
-x提取打包文件(extract,用于解压场景)
-t查看打包文件中的内容(list,不解压即可查看文件列表)
-v显示详细操作过程(verbose,如压缩 / 解压的文件名)
-f指定打包文件路径(file,必须放在选项最后,如 -f backup.tar.gz)
-z用 gzip 压缩 / 解压(对应 .tar.gz 格式,压缩率中等,速度快)
-j用 bzip2 压缩 / 解压(对应 .tar.bz2 格式,压缩率高,速度慢)
-C解压到指定目录(如 -C /opt 表示解压到 /opt 目录,目录需提前存在)

实战示例(高频场景):

# 1. 压缩目录(打包+gzip 压缩,最常用)
tar -czvf backup.tar.gz /home/user1/docs  # 压缩 docs 目录为 backup.tar.gz,显示详细过程
# 选项解析:c(创建)、z(gzip)、v(详细)、f(指定文件)

# 2. 解压文件(解压到当前目录)
tar -xzvf backup.tar.gz  # 解压 .tar.gz 文件,显示详细过程

# 3. 解压到指定目录(-C)
tar -xzvf backup.tar.gz -C /opt/backup  # 解压到 /opt/backup 目录(需先创建该目录)

# 4. 查看压缩包内容(不解压)
tar -tzvf backup.tar.gz  # 查看 backup.tar.gz 中的所有文件/目录

# 5. 打包不压缩(仅打包,用于迁移文件)
tar -cvf data.tar /home/user1/data  # 仅打包为 data.tar,不压缩

(4)zip/unzip:ZIP 格式压缩 / 解压(跨平台兼容)

zip/unzip 处理 ZIP 格式压缩文件,跟 Windows 兼容(Windows 默认就认 ZIP),适合跨系统传文件,不过压缩率比 tar.gz 低一点。

常用选项:

  • zip -r:递归压缩目录(压缩文件夹必须加,不然只压了目录名,内容没进去);
  • unzip -d:指定解压目录(比如 -d /opt/unzip 解压到这个目录);
  • unzip -l:查看 ZIP 包里的内容(不解压)。

实战示例:

# 1. 压缩目录(递归压缩)
zip -r docs.zip /home/user1/docs  # 压缩 docs 目录为 docs.zip

# 2. 解压到当前目录
unzip docs.zip

# 3. 解压到指定目录(-d)
unzip docs.zip -d /opt/docs  # 解压到 /opt/docs 目录

# 4. 查看 ZIP 包内容
unzip -l docs.zip

2. 时间与日期:date

date 用来显示或设置系统时间,支持自定义格式(比如显示时间戳、指定日期格式),脚本里常用来给文件打时间标记(比如备份文件名带日期)。

常用用法:

  • 显示当前时间:直接输 date;
  • 自定义格式:用 +格式符 指定输出格式(常用:%Y 年、%m 月、%d 日、%H 时、%M 分、%S 秒、%s 时间戳);
  • 显示指定日期:用 -d 指定(比如 -d “2024-06-01” 显示那天的时间);
  • 设置系统时间:date -s “2024-05-30 16:30:00”(需 root,设完建议同步硬件时间:hwclock -w)。

实战示例:

# 1. 显示当前时间(默认格式)
date
# 预期输出:Thu May 30 16:30:00 CST 2024

# 2. 自定义时间格式(常用于脚本命名,如 backup_20240530_1630.tar.gz)
date +"%Y%m%d_%H%M%S"  # 输出:20240530_163000
date +"%F %T"          # 输出:2024-05-30 16:30:00(%F 等价于 %Y-%m-%d,%T 等价于 %H:%M:%S)

# 3. 显示时间戳(从 1970-01-01 00:00:00 UTC 到当前的秒数)
date +%s  # 输出:1717067400(示例值)

# 4. 显示指定日期的时间(如 3 天后的时间)
date -d "+3 days" +"%F %T"  # 输出 3 天后的日期时间
date -d "2024-06-01" +"%A"  # 输出 2024-06-01 是星期几(%A 显示完整星期名,如 Saturday)

3. 临时文件与输入:mktemp/read/tee

(1)mktemp:创建临时文件 / 目录

mktemp 安全地建临时文件或目录(自动生成唯一文件名,不会重名),脚本里存临时数据常用(临时文件默认放 /tmp)。

常用选项:

  • -t:在 /tmp 目录建临时文件(文件名带前缀和随机字符,比如 tmp.XXXXXX);
  • -d:建临时目录(而不是文件)。

实战示例:

# 1. 创建临时文件(当前目录,前缀为 test.,后接 6 个随机字符)
mktemp test.XXXXXX
# 预期输出:test.VJHi7Y(随机字符每次不同)

# 2. 在 /tmp 目录创建临时文件(-t)
mktemp -t test.XXXXXX
# 预期输出:/tmp/test.kOSRbP(路径固定在 /tmp)

# 3. 创建临时目录(-d)
mktemp -d temp_dir.XXXXXX
# 预期输出:temp_dir.1P7njo(临时目录,可存放多个临时文件)

# 4. 脚本中使用(创建临时文件,写入数据后自动删除)
temp_file=$(mktemp -t data.XXXXXX)
echo "临时数据" > $temp_file
cat $temp_file
rm -f $temp_file  # 脚本结束后删除临时文件

(2)read:读取用户输入

read 在脚本里读取用户输的内容,赋给变量,支持设超时、限制长度、隐藏输入(比如输密码)。

常用选项:

  • -p:显示输入提示(比如 -p “请输入姓名:”);
  • -t:设输入超时(单位秒,超时自动退出);
  • -n:限制输入字符数(比如 -n 1 只读 1 个字符,适合 Y/N 确认);
  • -s:隐藏输入内容(不显示敲的字符,适合输密码)。

实战示例:

# 1. 基础用法(读取姓名并输出)
read -p "请输入您的姓名:" name
echo "您好,$name!"

# 2. 超时输入(5 秒内未输入则退出)
read -t 5 -p "请在 5 秒内输入您的年龄:" age
if [ -z "$age" ]; then  # 判断变量是否为空(超时未输入)
  echo -e "\n输入超时!"
else
  echo "您的年龄是 $age 岁。"
fi

# 3. 隐藏输入(输入密码)
read -s -p "请输入密码:" pass
echo -e "\n密码已接收(不会显示)。"

# 4. 单字符确认(Y/N 选择)
read -n 1 -p "是否继续执行(Y/N)?" answer
echo  # 换行(避免输入后光标紧跟提示)
if [ "$answer" = "Y" ] || [ "$answer" = "y" ]; then
  echo "继续执行..."
else
  echo "取消执行。"
fi

(3)tee:读取输入并写入文件(同时输出到屏幕)

tee 把标准输入(比如命令输出、用户输入)同时“写进文件”和“打到屏幕”(像个三通管),常用来“记命令输出”又“实时看结果”,还支持追加写。

常用选项:

  • -a:追加写文件(默认是覆盖)。

实战示例:

# 1. 将命令输出同时写入文件和显示到屏幕
date | tee current_time.txt  # 显示当前时间,同时写入 current_time.txt

# 2. 追加写入文件(-a)
echo "新的一行内容" | tee -a current_time.txt  # 追加到文件末尾,不覆盖原有内容

# 3. 配合 sudo 写入有权限的文件(避免用 echo "内容" > /etc/file 权限不足的问题)
echo "export PATH=\$PATH:/opt/bin" | sudo tee -a /etc/profile
# 场景:普通用户需修改 /etc/profile(root 权限文件),用 tee 配合 sudo 实现

4. 系统信息与工具:env/printenv/set/unset/basename

(1)env/printenv/set:查看环境变量

环境变量是 Linux 里存系统配置、用户偏好的变量(比如 PATH 存命令路径、HOME 存用户主目录),这三个命令用来查看或管环境变量,区别是:

命令核心功能适用场景
env查看所有全局环境变量,或在指定环境中执行命令(如 env PATH=/opt/bin cmd)查看全局变量、临时修改环境执行命令
printenv查看所有全局环境变量,或指定单个变量(无需加 $,如 printenv HOME)查看单个全局变量(更简洁)
set查看当前 Shell 的所有变量(包括全局变量、局部变量、用户自定义变量),并显示函数查看 Shell 会话中的所有变量

实战示例:

# 1. 查看所有全局环境变量
env
printenv

# 2. 查看单个环境变量(如 HOME、PATH)
printenv HOME  # 输出:/home/user1
printenv PATH  # 输出:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 3. 查看当前 Shell 的所有变量(包括局部变量)
set | grep "MY_VAR"  # 查找用户自定义的局部变量 MY_VAR

# 4. 用 env 临时修改环境执行命令(如临时添加 /opt/bin 到 PATH)
env PATH=$PATH:/opt/bin my_cmd  # 执行 my_cmd 时,优先从 /opt/bin 找命令

(2)export/unset:设置 / 删除环境变量

  • export:把“局部变量”升成“全局环境变量”(子进程能继承这个变量);
  • unset:删掉已定义的变量(全局和局部都行)。

实战示例:

# 1. 定义局部变量(仅当前 Shell 会话有效,子进程无法访问)
MY_VAR="hello"
echo $MY_VAR  # 输出:hello
bash  # 进入子 Shell
echo $MY_VAR  # 输出空(子进程无法访问局部变量)
exit  # 退出子 Shell

# 2. 导出为全局变量(子进程可访问)
export MY_VAR="hello"  # 导出局部变量为全局变量
bash
echo $MY_VAR  # 输出:hello(子进程可访问)
exit

# 3. 永久设置环境变量(写入配置文件)
# 方式1:仅当前用户有效(写入 ~/.bashrc)
echo 'export MY_VAR="hello"' >> ~/.bashrc
source ~/.bashrc  # 立即生效

# 方式2:所有用户有效(写入 /etc/profile,需 root 权限)
sudo echo 'export MY_VAR="hello"' >> /etc/profile
source /etc/profile

# 4. 删除环境变量
unset MY_VAR  # 删除 MY_VAR 变量
echo $MY_VAR  # 输出空(变量已删除)

(3)basename:提取文件名或目录名

basename 从文件路径或目录路径里提取“最后一段”(比如从 /home/user1/docs/file.txt 提取 file.txt,从 /home/user1/docs 提取 docs),脚本里处理文件路径常用。

实战示例:

# 1. 提取文件名(从完整路径)
basename /home/user1/docs/file.txt  # 输出:file.txt

# 2. 提取目录名(从完整路径)
basename /home/user1/docs  # 输出:docs
basename /home/user1/docs/  # 输出:docs(末尾加 / 不影响结果)

# 3. 脚本中实用场景(提取压缩包名,作为解压目录名)
# 假设下载的压缩包路径为 /tmp/backup_20240530.zip
zip_path="/tmp/backup_20240530.zip"
# 提取压缩包名(去掉 .zip 后缀)
dir_name=$(basename "$zip_path" .zip)  # 第二个参数为“后缀”,用于移除
echo $dir_name  # 输出:backup_20240530
# 解压到以压缩包名命名的目录
unzip "$zip_path" -d "/opt/backup/$dir_name"

5. 用户信息查询:finger/chfn/chage

(1)finger:查看用户详细信息

finger 直观地显示系统用户的“登录状态、主目录、登录 Shell、最近登录时间”这些信息,比 cat /etc/passwd 好读,适合快速了解用户当前状态。

实战示例:

# 1. 查看所有已登录用户的信息
finger
# 预期输出(关键信息):
# Login    Name       Tty      Idle  Login Time   Office     Office Phone   Host
# user1    User One   pts/0    10m   May 30 14:30 -           -              192.168.1.100

# 2. 查看指定用户的详细信息(如 user1)
finger user1
# 预期输出(补充信息):
# Directory: /home/user1    Shell: /bin/bash
# On since Thu May 30 14:30 (CST) on pts/0 from 192.168.1.100
# No mail.
# No Plan.

(2)chfn:修改用户备注信息

chfn 修改 /etc/passwd 里用户的“备注字段”(第 5 个字段),可以存用户的“真实姓名、部门、电话”这些,finger 会读这些信息,方便团队里认人。

实战示例:

# 1. 交互式修改当前用户的备注信息
chfn
# 进入交互界面,按提示输入信息(示例):
# Changing finger information for user1.
# Name [User One]: Zhang San  # 真实姓名
# Office []: Tech Department  # 部门
# Office Phone []: 13800138000  # 联系电话
# Home Phone []: -  # 可不填
# 确认后,信息会写入 /etc/passwd 的备注字段

# 2. 查看修改结果(用 finger 验证)
finger user1
# 预期输出中“Name”字段变为“Zhang San”,“Office”字段变为“Tech Department”

(3)chage:管理用户密码有效期

chage 控制用户密码的“过期时间、最小修改间隔、最大有效期、过期前提醒天数”,是系统安全管理的重要工具(避免用户一直用不变弱密码)。

常用选项:

  • -l:列出指定用户的密码有效期配置(比如 chage -l user1);
  • -E:设账户过期时间(格式 YYYY-MM-DD,过期就登不进);
  • -M:设密码最大有效期(天数,比如 -M 90 表示每 90 天得改密码);
  • -W:设过期前提醒天数(比如 -W 7 表示过期前 7 天开始提醒)。

实战示例:

# 1. 查看 user1 的密码有效期配置
chage -l user1
# 预期输出(关键配置):
# Last password change                    : May 30, 2024
# Password expires                        : Aug 28, 2024 (90 天后过期)
# Password inactive                       : never
# Account expires                         : never
# Minimum number of days between password change    : 0
# Maximum number of days between password change    : 90
# Number of days of warning before password expires : 7

# 2. 设置 user1 密码每 60 天过期,过期前 10 天提醒
sudo chage -M 60 -W 10 user1

# 3. 设置 user1 账户 2024-12-31 过期(过期后无法登录)
sudo chage -E 2024-12-31 user1

九、总结:Linux 命令学习与使用指南

Linux 命令看着多,但其实不是没规律。按这篇文章的分类捋一遍就会发现,所有命令都绕着“系统管理的核心需求”转 —— 从基础的“认命令、查帮助”,到“文件 / 进程 / 磁盘 / 用户”的管理,再到“装软件、定时任务”的自动化,刚好凑成一套完整的运维闭环。

1. 命令学习核心原则

  • 按场景归类记:别孤立地记“某个命令的某个选项”,而是结合“我要干啥”来记(比如“备份文件”→ tar/zip,“干掉进程”→ kill/pkill),场景化记忆更容易变成肌肉记忆。
  • 先抓高频组合:每个命令选项一大堆,但日常用得上的往往就 2-3 个(比如 ls -alF、cp -ri、tar -czvf),先把这几个用熟,再去碰冷门选项。
  • 重视“安全选项”:碰到删除、修改这类命令(比如 rm、userdel、lvreduce),优先用带提示的选项(-i),别因为手滑把数据搞没;批量操作前,先用 ls/echo 验证一下目标(比如 echo rm -rf /tmp/* 先看看要删的是哪些)。

2. 实战效率提升技巧

  • 善用历史与补全:按 Ctrl+R 搜历史命令,按 Tab 自动补全命令 / 路径(按两下 Tab 列出所有候选),少重复输入;
  • 别名简化操作:把复杂命令(比如 ls -alF、df -h、git status)设成别名(比如 alias ll=‘ls -alF’),写进 ~/.bashrc 永久生效;
  • 管道和重定向配合:用 | 把多个命令串起来(比如 ps -ef | grep nginx、du -sh * | sort -hr),用 >/>> 把输出重定向到文件(比如 command > log.txt),处理数据效率大增。

3. 问题排查思路

命令报错时,按下面几步基本能快速定位:

  1. 看错误提示:Linux 命令的报错通常会说清楚原因(比如“Permission denied”→ 权限不够,“No such file or directory”→ 路径错了);
  2. 查基础条件:跑命令前先确认“路径对不对”“权限够不够”“依赖满不满足”(比如 dpkg -i 报错时,用 apt -f install 修依赖);
  3. 翻帮助文档:用 man 命令 或 命令 —help 确认选项用法(比如忘了 tar 选项,man tar 看“压缩 / 解压”相关章节);
  4. 搜错误信息:报错看不明白,把完整错误信息丢进搜索引擎(比如“umount target is busy”),通常能找到现成解法。

按这篇文章系统过一遍,日常 Linux 操作的核心命令体系你基本就掌握了。后面结合具体场景(比如部署 Web 服务、运维数据库、写 Shell 脚本)继续深入,在实践中慢慢把命令用熟、把问题处理能力提升上来。