3847 words
19 minutes
Linux 学习笔记 2 —— 核心命令与系统管理
首次发布: 2026-03-23
... 次访问

你可能觉得 Linux 命令枯燥,但想象一下:

  • 你想批量重命名 1000 张照片,图形界面要点点点半小时,终端只要一行命令。
  • 服务器出问题了,没有图形界面,你只能靠命令行救命。
  • 如果你想自动化备份、部署、监控,那么Shell 脚本是运维的基石。

本章将告诉你 Linux 的核心命令和系统管理技巧,让你从“命令小白”变成“命令达人”。

2.1 文本处理:grepless#

2.1.1 🔍 grep:在茫茫文海中找针#

grep 不只是搜索,它是你的“文本雷达”。

基础用法

# 在 /etc/passwd 中找包含 "root" 的行
grep root /etc/passwd

# 忽略大小写搜索(-i)
grep -i error /var/log/syslog

# 反向匹配:找不包含 "bash" 的行(-v)
grep -v bash /etc/passwd

# 显示行号(-n)
grep -n "TODO" project.py

正则表达式进阶

# 找邮箱地址(扩展正则 -E 或 egrep)
egrep '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt

# 找以 "Error" 开头且以 "failed" 结尾的行
grep '^Error.*failed$' app.log

# 找包含数字的行
grep '[0-9]' data.txt

2.1.2 📄 less:分页查看大文件的正确姿势#

别再用 cat 看大文件了!less 让你从容浏览。

常用操作

less /var/log/auth.log
键盘快捷键功能
空格/Page Down下一页
b/Page Up上一页
/keyword向前搜索(输完按回车)
?keyword向后搜索
n下一个匹配项
N上一个匹配项
q退出
g跳到文件头
G跳到文件尾
h帮助手册

2.1.3 📊 sort, head, tail:数据整理组合拳#

排序 (sort)

# 字母顺序排序
sort names.txt

# 数值排序(-n),否则 "10" 会排在 "2" 前面!
sort -n scores.txt

# 逆序(-r)
sort -r data.txt

# 去重后排序(-u)
sort -u duplicates.txt

# 按第2列排序(-k2)
sort -k2 students.txt

取头尾 (head, tail)

# 前10行(默认)
head /etc/passwd

# 前5行
head -n 5 /etc/passwd

# 后10行(默认)
tail /var/log/syslog

# 后5行
tail -n 5 /var/log/syslog

# 从第100行开始到最后
tail -n +100 huge_file.txt

# 实时监控日志(-f),按 Ctrl+C 停止
tail -f /var/log/apache2/access.log

2.2 文件查找:find vs locate#

2.2.1 🔎 find:实时递归搜索(强大但慢)#

find 是瑞士军刀,功能多到爆炸。

基础语法

find [路径] [条件] [动作]

常用示例

# 在当前目录及子目录找所有 .log 文件
find . -name "*.log"

# 找大于100M的文件(-size +100M)
find /home -size +100M

# 找最近7天内修改过的文件(-mtime -7)
find . -mtime -7

# 找用户 john 的所有文件
find /home -user john

# 找可执行文件(-type f -executable)
find /usr/bin -type f -executable

# 找到后删除(小心!先不加 -delete 确认一下)
find ./temp -name "*.tmp" -delete

# 找到后执行命令(-exec)
find . -name "*.jpg" -exec mv {} ~/pictures/ \;

2.2.2 🚀 locate:基于数据库的快速查找#

locate 快如闪电,但数据可能不是最新的。

# 快速找含 "passwd" 的文件
locate passwd

# 只统计数量(-c)
locate -c nginx

# 忽略大小写(-i)
locate -i ReadMe

# 更新数据库(需要 sudo)
sudo updatedb

2.3 环境变量与 PATH:让系统认识你的命令#

2.3.1 🌍 什么是环境变量?#

环境变量是 shell 的“全局设置”,比如 $HOME 指向你的家目录,$USER 是当前用户名。

查看与设置

# 查看所有环境变量
env
# 或
printenv

# 查看单个变量
echo $HOME
echo $PATH

# 设置临时变量(仅当前 shell 有效)
MY_VAR="hello"
echo $MY_VAR

# 导出为环境变量(子进程也能看到)
export MY_VAR="hello"
bash  # 启动新 shell
echo $MY_VAR  # 仍能输出 "hello"

2.3.2 🛣️ PATH:命令搜索路径#

当你输入 ls,shell 怎么知道去哪找它?答案是 $PATH

# 查看当前 PATH
echo $PATH
# 输出类似:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# 临时添加自定义目录到 PATH(优先查找)
export PATH=/my/scripts:$PATH

# 添加到末尾
export PATH=$PATH:/my/scripts

# 永久生效:加到 ~/.bashrc 或 ~/.profile
echo 'export PATH=/my/scripts:$PATH' >> ~/.bashrc
source ~/.bashrc  # 立即生效

2.4 权限管理:chmod, chown, umask#

2.4.1 🔐 读懂 ls -l 输出#

-rw-r--r-- 1 alice developers 2048 Mar 23 10:00 secret.txt
↑↑↑↑↑↑↑↑↑↑
│││││││││└─ 文件名
││││││││└─── 修改时间
│││││││└──── 文件大小
││││││└───── 所属组 (developers)
│││││└────── 所有者 (alice)
│││└───────── 其他人权限 (r--)
││└────────── 所属组权限 (r--)
│└─────────── 所有者权限 (rw-)
└──────────── 文件类型 (- = 普通文件, d = 目录, l = 链接)

权限含义

  • r (read) = 4
  • w (write) = 2
  • x (execute) = 1
  • - = 无权限

对目录而言,x 表示“可进入”。

2.4.2 🛠️ chmod:修改权限#

方法一:数字模式(八进制)

# 所有者: rwx(7), 组: r-x(5), 其他人: r-x(5)
chmod 755 script.sh

# 所有者: rw-(6), 组: r--(4), 其他人: r--(4) → 标准文件权限
chmod 644 document.txt

# 只有自己能读写执行
chmod 700 private_key.pem

方法二:符号模式(更直观)

# 给所有人加执行权限
chmod +x script.sh

# 给所有者加写权限
chmod u+w file.txt

# 移除其他人的读权限
chmod o-r secret.txt

# 给组和所有人加读权限
chmod go+r data.txt

# 递归修改目录及内部所有文件
chmod -R 755 my_folder/

2.4.3 🎭 umask:控制新建文件的默认权限#

umask 是“权限掩码”,决定新建文件时去掉哪些权限。

# 查看当前 umask
umask
# 通常输出 022 或 002

# 设置 umask(影响后续新建文件)
umask 022   # 新建文件默认 644,目录 755
umask 077   # 新建文件默认 600,目录 700(更安全)

# 永久生效:加到 ~/.bashrc
echo 'umask 022' >> ~/.bashrc

计算逻辑

  • 文件最大权限 = 666 (rw-rw-rw-)
  • 目录最大权限 = 777 (rwxrwxrwx)
  • 实际权限 = 最大权限 - umask

例:umask 022 → 文件权限 = 666 - 022 = 644

2.5 进程管理:ps, kill, 作业控制#

2.5.1 👁️ ps:查看进程#

# 当前终端的进程
ps

# 所有属于你的进程
ps x

# 所有系统进程(包括别人的)
ps aux

# 详细信息(CPU, 内存)
ps u

# 完整命令行(不换行)
ps w

# 组合拳:最常用
ps aux | grep chrome

# 查看当前 shell 的 PID 和详情
ps u $$

关键字段解释

  • PID: 进程ID
  • STAT: 状态(S=睡眠, R=运行, Z=僵尸, T=停止)
  • %CPU, %MEM: 资源占用
  • COMMAND: 启动命令

2.5.2 ☠️ kill:终止进程#

# 礼貌终止(发送 SIGTERM)
kill 1234

# 强制杀死(SIGKILL,慎用!)
kill -9 1234
# 或
kill -KILL 1234

# 暂停进程(冻结)
kill -STOP 1234

# 恢复被暂停的进程
kill -CONT 1234

# 查看所有信号
kill -l

2.5.3 🎪 作业控制:前台/后台切换#

# 运行一个长任务
ping google.com

# 按 Ctrl+Z 挂起(暂停)
# 输出:[1]+  Stopped    ping google.com

# 查看当前 shell 的作业
jobs

# 把作业放到后台继续运行
bg %1

# 把作业拉回前台
fg %1

# 直接在后台启动命令
sleep 100 &
# 输出:[2] 5678

2.6 重定向与管道:Unix 哲学的精髓#

2.6.1 🔄 管道 |:连接命令#

# 取前10行,转大写
head /proc/cpuinfo | tr a-z A-Z

# 找 Chrome 进程
ps aux | grep chrome

# 排序 + 去重计数
cat words.txt | sort | uniq -c

# 复杂组合:找日志中出现最多的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5

2.6.2 📥📤 重定向:控制输入输出#

标准输出 (stdout, 文件描述符 1)

# 覆盖写入
echo "hello" > file.txt

# 追加写入
echo "world" >> file.txt

标准错误 (stderr, 文件描述符 2)

# 错误单独存到 err.log
ls /nonexistent 2> err.log

# stdout 和 stderr 合并到 all.log
ls /nonexistent > all.log 2>&1
# 或(Bash 4+ 简写)
ls /nonexistent &> all.log

标准输入 (stdin, 文件描述符 0)

# 从文件读入(较少用,因为命令通常直接接受文件名)
sort < unsorted.txt > sorted.txt

2.7 归档与压缩:tar, gzip, zip#

2.7.1 📦 tar:打包工具#

# 创建归档(c=create, v=verbose, f=file)
tar cvf backup.tar file1 dir1/

# 查看内容(t=test/list)
tar tvf backup.tar

# 解压(x=extract)
tar xvf backup.tar

# 打包并 gzip 压缩(z=gzip)
tar czvf backup.tar.gz file1 dir1/

# 解压 .tar.gz
tar xzvf backup.tar.gz

# 打包并 bzip2 压缩(j=bzip2)
tar cjvf backup.tar.bz2 file1/

# 解压 .tar.bz2
tar xjvf backup.tar.bz2

2.7.2 🗜️ 其他压缩工具#

# gzip(最常见)
gzip file.txt        # 生成 file.txt.gz
gunzip file.txt.gz
zcat file.txt.gz     # 直接查看,不解压

# bzip2(压缩率更高)
bzip2 file.txt       # 生成 file.txt.bz2
bunzip2 file.txt.bz2

# xz(最高压缩率)
xz file.txt          # 生成 file.txt.xz
unxz file.txt.xz

# zip(Windows 兼容)
zip archive.zip file1 dir1/
unzip archive.zip

2.8 超级用户:sudo 的正确用法#

2.8.1 👑 为什么不用 root 登录?#

  • ❌ 无操作审计
  • ❌ 容易误删系统文件
  • ❌ 失去正常用户环境

正确做法:用 sudo 临时提权。

# 以 root 身份编辑配置文件
sudo vipw

# 重启服务
sudo systemctl restart nginx

# 启动交互式 root shell(谨慎!)
sudo -i

# 以其他用户身份运行命令
sudo -u postgres psql

2.8.2 📜 配置 sudoers(必须用 visudo!)#

# 安全编辑 /etc/sudoers
sudo visudo

示例配置

# 允许用户 alice 免密码执行所有命令
alice ALL=(ALL) NOPASSWD: ALL

# 允许 admins 组执行特定命令
%admins ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt

# 允许 root 模拟任何用户
root ALL=(ALL) ALL

2.9 Linux 目录结构:FHS 标准速查#

目录用途说明
/根目录,一切从这里开始
/bin基本命令(ls, cp, bash 等)
/dev设备文件(硬盘、键盘等)
/etc系统配置文件(passwd, fstab, network 等)
/home用户家目录(/home/alice, /home/bob)
/lib共享库文件(.so)
/proc虚拟文件系统,提供进程和内核信息(如 /proc/cpuinfo)
/rootroot 用户的家目录
/sbin系统管理员命令(fdisk, ifconfig 等)
/tmp临时文件(重启后可能清空)
/usr用户程序和数据(类似 Windows 的 Program Files)
/usr/bin用户级命令(gcc, python, vim 等)
/usr/local手动安装的软件(避免覆盖系统包)
/var可变数据(日志 /var/log,邮件 /var/mail,缓存 /var/cache)
/run运行时数据(进程 ID、socket 等,重启清空)
/sys系统与设备接口(虚拟文件系统,可调内核参数)

2.10 特殊字符与命令行编辑#

下面是一些常见的特殊字符和命令行编辑快捷键:

2.10.1 🎭 特殊字符速查表#

字符名称用途示例
*star通配符*.txt
?question单字符通配file?.txt
``pipe管道
>greater输出重定向(覆盖)echo hi > file
>>append输出重定向(追加)echo hi >> file
<less输入重定向sort < file
&ampersand后台运行sleep 100 &
;semicolon命令分隔cd /tmp; ls
&&AND前一个成功才执行后一个make && make install
``OR
$dollar变量引用echo $HOME
`backtick命令替换(旧式)echo `date`
()subshell命令替换(新式)echo $(date)
'single字面量(禁止展开)echo '$HOME'
"double半字面量(允许变量展开)echo "$HOME"
\backslash转义echo \"hello\"
~tilde家目录快捷方式cd ~
#hash注释# This is a comment

2.10.2 ⌨️ 命令行编辑快捷键(Bash Emacs 模式)#

下面是一些常用的命令行编辑快捷键,能让你在终端里快到飞起来:

快捷键功能
Ctrl+A跳到行首
Ctrl+E跳到行尾
Ctrl+B光标左移(同←)
Ctrl+F光标右移(同→)
Ctrl+P上一条命令(同↑)
Ctrl+N下一条命令(同↓)
Ctrl+W删除前一个单词
Ctrl+U删除从光标到行首
Ctrl+K删除从光标到行尾
Ctrl+Y粘贴被删内容(yank)
Ctrl+L清屏(同 clear
Ctrl+R反向搜索历史命令
Ctrl+G取消搜索
Tab自动补全
Ctrl+D退出当前 shell(空输入时)
Ctrl+C终止当前命令
Ctrl+Z挂起当前命令

2.11 获取帮助:man, info, —help#

可以通过 man 查看命令的手册页,了解它的用法和选项。info 提供更详细的文档,适合 GNU 工具。--help 则给出简短的使用说明。

# 查看命令手册
man ls
man 5 passwd      # 第5节:文件格式
man 2 open        # 第2节:系统调用

# 关键字搜索
man -k copy       # 找含 "copy" 的命令
apropos copy      # 同上

# GNU 风格简短帮助
ls --help
grep --help

# 更详细的 GNU 文档
info coreutils
info grep | less  # 管道给 less 阅读

# 在线文档(很多软件在 /usr/share/doc/)
ls /usr/share/doc/

2.12 实战练习题#

练习1:权限实验#

# 1. 创建一个文件,权限设为只有自己可读写
touch secret.txt
chmod 600 secret.txt
ls -l secret.txt

# 2. 创建一个脚本,让自己和别人都能执行
echo '#!/bin/bash\necho "Hello"' > greet.sh
chmod 755 greet.sh
./greet.sh

# 3. 尝试用别人身份读取 secret.txt(会失败)
sudo -u nobody cat secret.txt

练习2:管道组合#

# 找出 /var/log 中最大的5个文件
du -ah /var/log | sort -rh | head -5

# 统计当前登录用户数
who | wc -l

# 找最近修改的10个文件
find . -type f -mtime -1 | head -10

练习3:归档备份#

# 备份家目录到 /backup 文件夹
mkdir -p /backup
tar czvf /backup/home_backup_$(date +%F).tar.gz ~/

# 验证备份
tar tzvf /backup/home_backup_*.tar.gz | head -20

练习4:进程管理#

# 启动一个后台进程
sleep 300 &

# 查看它的 PID
jobs -l

# 挂起它(先 fg 再 Ctrl+Z)
fg %1
# 按 Ctrl+Z

# 恢复后台
bg %1

# 杀死它
kill %1

2.13 常见错误与解决方案#

Linux 学习笔记 2 —— 核心命令与系统管理
https://adalovelemon.github.io/blog/en/posts/content/technotes/linux/linux2/
Author
Ada Lovelemon
Published at
2026-03-23

Comments Section