Shell 脚本学习

2026-09 补充:Linux 工具实战专题把本文的基础命令与 18 个诊断、链接、传输工具串起来,含操作 GIF 和 Docker 实验。本文新增的基础与文本处理练习保留原笔记地址,不另建重复命令大全。

实战补充:先确认命令与操作对象

以下例子面向 Ubuntu 的 Bash / GNU 工具。macOS 的 BSD sed、find、stat 等参数存在差异;可进入 Linux 教学容器 使用统一环境。这一节是工程练习说明,不把所有系统管理操作算作 18 组动画的实测结果。

type -a printf
command -v grep
help read
man 1 printf
man 3 printf
grep --version

type -a 帮你区分别名、函数、内建和可执行文件;command -v 查询当前命令解析结果。man 1 是命令手册,man 3 是库函数,两者不是同一个接口。Shell 内建优先查 help。容器为了减小体积可能不装 man 数据库,不能因此判断命令不存在。

操作前先问四件事:路径是否正确、目标属于谁、是否只读、失败后能否恢复。尤其不要拿教程里的磁盘设备名直接格式化自己的磁盘。

文件名不是按空格切开的文本

例如当前目录确实有 trial one.log 和 trial two.log,想统计行数:

find . -maxdepth 1 -type f -name 'trial*.log' -print
find . -maxdepth 1 -type f -name 'trial*.log' -exec wc -l -- {} +
find . -maxdepth 1 -type f -name 'trial*.log' -print0 |
xargs -0 -r wc -l --

先预览命中的集合。-exec … {} + 直接传递文件参数;-print0 配 xargs -0 则用 NUL 而不是空白分隔。-r 是 GNU xargs 的无输入不运行选项,-- 结束选项解析。不要改成 for f in $(ls),带空格、换行或通配字符的名字会出问题。NUL 分隔能解决名字解析问题,不能消除查找后文件被替换的竞争条件。GNU Findutils:安全文件名处理

实战补充:把日志变成可以验证的统计

假设 events.log 只有下面六行,每行字段之间以空格分隔:

09:00 INFO camera 12
09:01 WARN camera 30
09:02 ERROR planner 80
09:03 INFO planner 10
09:04 ERROR camera 100
09:05 WARN camera 25

这里第 4 列是本例定义的耗时毫秒,不是任意真实日志都遵循的格式。先明确数据约定,再选工具。

grep 选择行,awk 选择字段并聚合

grep -nE ' (ERROR|WARN) ' events.log
grep -nF 'ERROR planner' events.log
awk '$2 == "ERROR" {sum[$3] += $4; count[$3]++}
END {for (name in sum) print name, count[name], sum[name]/count[name]}' events.log |
LC_ALL=C sort

第一条输出 4 条异常或警告行;第二条把模式当固定字符串。第三条结果应为 camera 1 100 和 planner 1 80。awk 的关联数组遍历顺序不稳定,末尾排序让结果适合比较。grep -w 的“单词”边界与日志字段边界也不是同一回事,字段判断交给 awk 更清楚。GNU Grep:匹配控制

普通空白分隔适合这个玩具日志;CSV 的引号、嵌入逗号、转义与多行字段,不应直接交给 awk -F, 假装完整解析。

sort / uniq / cut 不是随意换顺序的积木

awk '{print $2}' events.log | LC_ALL=C sort | uniq -c
awk '$2 == "ERROR" {print $4, $3}' events.log | sort -nr
cut -d ' ' -f 3 events.log

uniq 只合并相邻的相同行,所以计数前先排序;不加排序会把分散的相同级别分开计数。sort -n 比数字,否则字符串 100 可能排在 25 前;cut -d ' ' 只认一个字面空格,多空格日志会出现空字段,awk 默认的空白字段规则不同。

sed 先输出,再决定要不要写回

sed -n '2,4p' events.log
sed 's/ WARN / WARNING /g' events.log

第一条只输出第 2–4 行;第二条输出替换后的内容,并不改变原文件。确认差异、备份策略和目标后再考虑写回。sed -i 的备份语法跨 GNU/BSD 有差异;也不要把“原地修改”理解为一定保持原 inode、硬链接关系和全部元数据。

管道的成功,不只看最后一个命令

set -o pipefail
grep -E ' ERROR ' events.log | awk '{print $3}' | sort
pipeline_status=("${PIPESTATUS[@]}")
printf '%s\n' "${pipeline_status[*]}"

必须紧接管道保存 PIPESTATUS;后续任何命令都可能覆盖它。Bash 的 pipefail 让上游失败影响整条管道状态,但 grep 返回 1 表示没找到匹配,不一定是故障;2 才是错误类状态。配合 set -e 时应显式处理“无结果”这种正常业务情况。

实战补充:网络排查按层走

ip -br address
ip route
ss -lnt
getent ahosts localhost
curl --max-time 5 -sS -o /dev/null \
-w 'status=%{http_code} connect=%{time_connect} first_byte=%{time_starttransfer} total=%{time_total}\n' \
http://127.0.0.1:4001/

最后一条只是服务地址模板:宿主机若有 Hexo 监听 4001 可以测;隔离教学容器中的 127.0.0.1 是容器自己,不是宿主机。不要把连接失败都叫作“DNS 问题”,也不要把 HTTP 500 当 TCP 无法连接。

ss -lnt 先确认监听地址和端口;是否能看到所属进程还受权限和 PID 命名空间影响。DNS 正常不代表路由可达,TCP 建连正常不代表应用及时响应。ICMP 被过滤时,ping 失败也不能单独证明 HTTP 服务不可用。

网页访问还有一个很容易忽视的边界:HTML 来自本机,不代表它引用的脚本、字体、图片也来自本机。用 HTTP 耗时确认服务器响应,再用浏览器资源面板分析真实的加载依赖,不能把两者混为一个时间。

实战补充:磁盘、身份与服务边界

df -h .
df -i .
du -sh .
findmnt -T .
id
stat -c '%A %U:%G %n' .
namei -l /work/out
ps -p 1 -o pid,comm,args

df 看文件系统,du 遍历当前目录树;硬链接、稀疏文件、挂载点、打开后删除的文件都可能让两个结果不同。df -i 用来发现 inode 耗尽:字节空间充足不等于还能创建小文件。定位删除后仍占用的文件,继续看 lsof。

身份方面,UID/GID 决定文件访问身份。目录的 x 表示能否穿越路径,r 表示能否读取目录项;文件自身可读但父目录不可穿越,也会访问失败。namei -l 可以逐段检查。不要用 chmod -R 777 掩盖挂载或所有者问题。

服务方面,先看 PID 1 是谁。常规 Ubuntu 系统可以用 systemctl status 服务名、journalctl -u 服务名;普通 Docker 教学容器通常不运行 systemd,装了软件包也不表示其后台服务已启动。本文不自动新增用户、不调整主机服务、不修改磁盘和防火墙。

更多连续监控、System V IPC 与跨命名空间的区别,见完整工具索引。下面保留原有笔记供对照。

前言

对长期使用的shell脚本产生了一丢丢的兴趣, 前来进行一些笔记来记录学习过程, 仅此而已;

查找文本

以grep程序查找文本(以UNIX的专业术语来说,是匹配文本(matching text)是相当方便的。在POSIX系统上,grep可以在两种正则表达式风格中选择一种,或是执行简单的字符串匹配。传统上,有三种程序,可以用来查找整个文本文件:

grep

最早的文本匹配程序。使用POSIX定义的基本正则表达式(Basic Regular Expression,BRE)。

egrep

egrep扩展式grep(Extended grep),这个程序使用扩展正则表达式(Extended Regular Expression,ERE)——这是一套功能更强大的正则表达式,使用它的代价就是会耗掉更多的运算资源。以现在的系统而言,在性能影响上几乎没有太大的差别。

fgrep

快速grep(Fast grep)。这个版本匹配固定字符串而非正则表达式,它使用优化的算法,能更有效地匹配固定字符串。最初的版本,也是唯一可以并行(in parallel)地匹配多个字符串的版本;也就是说,grep与egrep只能匹配单个正则表达式;而fgrep使用不同的算法,却能匹配多个字符串,有效地测试每个输入行里,是否有匹配的查找字符串。

这里重点说一下怎么用grep来查找或者输出关键信息的, 另外千万不要用下面这种方式来输出文件

grep "if" -r ./ >> res.txt

这种方式会导致同时匹配res.txt中的结果,会在短时间内导致res.txt文件特别大,如果两分钟不管的话,等着内存爆炸吧~, 下面说一下这个指令的使用, 其参数选项如下

-a --text                                      # 不要忽略二进制数据。
-A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c --count # 计算符合范本样式的列数。
-C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
-E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F --fixed-regexp # 将范本样式视为固定字符串的列表。
-G --basic-regexp # 将范本样式视为普通的表示法来使用。
-h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i --ignore-case # 忽略字符大小写的差别。
-l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
-L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
-n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
-P --perl-regexp # PATTERN 是一个 Perl 正则表达式
-q --quiet或--silent # 不显示任何信息。
-R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
-s --no-messages # 不显示错误信息。
-v --revert-match # 反转查找。
-V --version # 显示版本信息。
-w --word-regexp # 只显示全字符合的列。
-x --line-regexp # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数

常用的正则表达式如下

^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
. # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* # 一起用代表任意字符。
[] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头,紧跟 rep 的行
\(..\) # 标记匹配字符,如'\(love\)',love被标记为1。
\< # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b # 单词锁定符,如: '\bgrep\b'只匹配grep。

修改权限的用法

权限:1、r 2、W 3. X

比如rw的值为4+2=6

用法比较简单,比如 chmod 722 test.txt

系统服务管理

在现代Linux系统中,systemd是主流的服务管理系统,通过systemctl命令可以方便地管理各种系统服务和开机自启动项。

systemctl 服务管理

基本服务操作

# 启动服务
sudo systemctl start <服务名>

# 停止服务
sudo systemctl stop <服务名>

# 重启服务
sudo systemctl restart <服务名>

# 重新加载配置(不重启服务)
sudo systemctl reload <服务名>

# 查看服务状态
systemctl status <服务名>

# 查看服务是否运行
systemctl is-active <服务名>

# 查看服务是否开机自启
systemctl is-enabled <服务名>

开机自启动管理

# 设置服务开机自启
sudo systemctl enable <服务名>

# 取消服务开机自启
sudo systemctl disable <服务名>

# 设置服务开机自启并立即启动
sudo systemctl enable --now <服务名>

# 取消服务开机自启并立即停止
sudo systemctl disable --now <服务名>

# 列出所有开机自启的服务
systemctl list-unit-files --type=service --state=enabled

# 列出所有失败的服务
systemctl --failed

查看系统服务

# 列出所有服务
systemctl list-units --type=service

# 列出所有正在运行的服务
systemctl list-units --type=service --state=running

# 列出所有服务文件
systemctl list-unit-files --type=service

# 查看服务的详细信息
systemctl show <服务名>

# 查看服务的日志
journalctl -u <服务名>

# 实时查看服务日志
journalctl -u <服务名> -f

# 查看服务的依赖关系
systemctl list-dependencies <服务名>

systemctl 常用参数

--user          # 对用户服务进行操作
--system # 对系统服务进行操作(默认)
--all # 显示所有单元,包括非活动的
--failed # 只显示失败的单元
--type=TYPE # 过滤单元类型(service, socket, target等)
--state=STATE # 过滤单元状态(active, inactive, failed等)
-l, --full # 显示完整的单元名称
-n, --lines=N # 显示最后N行日志
-f, --follow # 实时跟随日志输出
--no-pager # 不使用分页器

常见系统服务示例

# 网络管理服务
sudo systemctl restart NetworkManager

# SSH服务
sudo systemctl enable ssh
sudo systemctl start ssh

# 防火墙服务
sudo systemctl status ufw
sudo systemctl enable ufw

# Apache/Nginx Web服务
sudo systemctl restart apache2
sudo systemctl reload nginx

# 数据库服务
sudo systemctl start mysql
sudo systemctl enable postgresql

# Docker服务
sudo systemctl enable docker
sudo systemctl start docker

进程管理

进程管理是Linux系统管理的重要组成部分,包括查看进程状态、终止进程、监控系统负载等操作。

进程查看命令

ps 命令详解

# 显示当前用户的所有进程
ps

# 显示所有进程的详细信息
ps aux

# 显示所有进程的层级关系
ps auxf
ps -ef --forest

# 显示特定用户的进程
ps -u username

# 显示特定进程的信息
ps -p PID

# 按CPU使用率排序
ps aux --sort=-%cpu

# 按内存使用率排序
ps aux --sort=-%mem

# 显示进程的完整命令行
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem

# 实时显示进程信息(类似top)
ps aux | head -1; ps aux | tail -n +2 | sort -nr -k3

ps 常用参数组合

a    # 显示所有用户的进程
u # 以用户友好的格式显示
x # 显示没有控制终端的进程
e # 显示所有进程
f # 以全格式显示
l # 以长格式显示
-o # 自定义输出格式
--sort # 排序选项

系统监控命令

top / htop 实时监控

# 启动top
top

# 按CPU使用率排序 (默认)
# 在top中按 P

# 按内存使用率排序
# 在top中按 M

# 按运行时间排序
# 在top中按 T

# 只显示指定用户的进程
top -u username

# 更友好的界面(需要安装)
htop

# 显示进程树
htop -t

top 交互式快捷键

h    # 帮助信息
q # 退出
k # 终止进程(输入PID)
r # 重新设置进程优先级
P # 按CPU排序
M # 按内存排序
T # 按时间排序
c # 切换显示完整命令
1 # 切换显示各CPU核心信息

进程终止命令

kill 命令详解

# 温和终止进程
kill PID

# 强制终止进程
kill -9 PID
kill -KILL PID

# 发送指定信号
kill -TERM PID # 正常终止信号(默认)
kill -HUP PID # 挂断信号
kill -INT PID # 中断信号(Ctrl+C)
kill -QUIT PID # 退出信号

# 终止进程组
kill -TERM -PID

# 按进程名终止
killall process_name

# 强制按进程名终止
killall -9 process_name

# 交互式终止进程
pkill process_name

# 按模式终止进程
pkill -f "pattern"

# 终止指定用户的所有进程
pkill -u username

常见信号类型

信号编号  信号名称    描述
1 SIGHUP 挂断信号,通常用于重新加载配置
2 SIGINT 中断信号(Ctrl+C)
3 SIGQUIT 退出信号(Ctrl+\)
9 SIGKILL 强制终止信号(无法被忽略)
15 SIGTERM 正常终止信号(默认)
18 SIGCONT 继续执行被暂停的进程
19 SIGSTOP 暂停进程
20 SIGTSTP 终端暂停信号(Ctrl+Z)

后台进程管理

# 后台运行命令
command &

# 查看后台作业
jobs

# 将作业转到前台
fg %jobid

# 将作业转到后台
bg %jobid

# 脱离终端运行(即使终端关闭也继续运行)
nohup command &

# 使用screen会话
screen -S session_name
# Ctrl+A, D 脱离会话
# screen -r session_name 恢复会话

# 使用tmux会话
tmux new -s session_name
# Ctrl+B, D 脱离会话
# tmux attach -t session_name 恢复会话

系统负载监控

# 查看系统负载平均值
uptime

# 查看系统负载和进程信息
w

# 查看内存使用情况
free -h

# 实时监控系统资源
iostat 2 # I/O统计
vmstat 2 # 虚拟内存统计
sar -u 2 # CPU使用率统计

# 查找占用特定端口的进程
lsof -i :port_number
netstat -tulpn | grep :port_number

文件系统操作

文件系统操作是日常Linux使用中最基础也最重要的技能,包括文件查找、复制移动、权限管理等。

文件列表和查看

ls 命令详解

# 基本列表
ls

# 详细信息列表
ls -l

# 显示隐藏文件
ls -a

# 组合使用(最常用)
ls -la

# 按时间排序(最新的在前)
ls -lt

# 按时间排序(最旧的在前)
ls -ltr

# 按大小排序
ls -lS

# 人类可读的大小格式
ls -lh

# 递归显示子目录
ls -R

# 按文件类型分色显示
ls --color=auto

# 只显示目录
ls -d */

# 显示文件数量统计
ls -1 | wc -l

ls 参数详解

-a, --all              # 显示所有文件,包括隐藏文件
-l # 使用长格式列表
-h, --human-readable # 以人类可读格式显示大小
-t # 按修改时间排序
-r, --reverse # 逆序排列
-S # 按文件大小排序
-R, --recursive # 递归列出子目录内容
--color=auto # 彩色显示文件类型
-i, --inode # 显示索引节点号
-d, --directory # 只列出目录本身,不列出内容
-1 # 每行显示一个文件
-F, --classify # 在文件名后添加类型标识符

文件查找命令

find 命令详解

# 基本查找
find /path -name "filename"

# 忽略大小写查找
find /path -iname "filename"

# 按文件类型查找
find /path -type f # 查找文件
find /path -type d # 查找目录
find /path -type l # 查找符号链接

# 按大小查找
find /path -size +100M # 大于100MB的文件
find /path -size -10k # 小于10KB的文件
find /path -size 50M # 等于50MB的文件

# 按时间查找
find /path -mtime -7 # 7天内修改的文件
find /path -mtime +30 # 30天前修改的文件
find /path -atime -1 # 1天内访问的文件

# 按权限查找
find /path -perm 755 # 权限为755的文件
find /path -perm -644 # 至少包含644权限的文件

# 组合条件查找
find /path -name "*.log" -type f -size +1M

# 查找并执行操作
find /path -name "*.tmp" -exec rm {} \;
find /path -name "*.log" -exec ls -lh {} \;

# 查找空文件和空目录
find /path -empty

# 按用户查找
find /path -user username
find /path -group groupname

locate 命令

# 基本查找(更快,但需要更新数据库)
locate filename

# 忽略大小写
locate -i filename

# 限制结果数量
locate -n 10 filename

# 更新locate数据库
sudo updatedb

# 正则表达式查找
locate -r "pattern"

文件操作命令

复制操作 (cp)

# 基本复制
cp source destination

# 复制目录(递归)
cp -r source_dir destination_dir

# 保持文件属性
cp -p source destination

# 强制覆盖
cp -f source destination

# 交互式复制(覆盖前询问)
cp -i source destination

# 创建硬链接而非复制
cp -l source destination

# 创建符号链接
cp -s source destination

# 显示复制进度
cp -v source destination

# 组合参数(常用)
cp -rp source_dir destination_dir

移动/重命名操作 (mv)

# 基本移动/重命名
mv source destination

# 交互式移动(覆盖前询问)
mv -i source destination

# 强制移动
mv -f source destination

# 显示移动过程
mv -v source destination

# 批量重命名
for file in *.txt; do mv "$file" "${file%.txt}.bak"; done

删除操作 (rm)

# 删除文件
rm filename

# 删除多个文件
rm file1 file2 file3

# 交互式删除(每个文件前询问)
rm -i filename

# 强制删除(不询问)
rm -f filename

# 递归删除目录
rm -r directory

# 强制递归删除
rm -rf directory

# 显示删除过程
rm -v filename

# 安全删除(移动到回收站,需要安装trash-cli)
trash filename

文件权限管理

chmod 权限修改

# 数字方式设置权限
chmod 755 filename # rwxr-xr-x
chmod 644 filename # rw-r--r--
chmod 600 filename # rw-------
chmod 777 filename # rwxrwxrwx

# 符号方式设置权限
chmod u+x filename # 给用户添加执行权限
chmod g-w filename # 移除组写权限
chmod o+r filename # 给其他用户添加读权限
chmod a+x filename # 给所有用户添加执行权限

# 递归设置权限
chmod -R 755 directory

# 权限数字对应表
# r(读) = 4, w(写) = 2, x(执行) = 1
# rwx = 4+2+1 = 7
# rw- = 4+2+0 = 6
# r-x = 4+0+1 = 5
# r-- = 4+0+0 = 4

chown 所有者修改

# 修改文件所有者
chown username filename

# 修改文件所有者和组
chown username:groupname filename

# 只修改组
chown :groupname filename

# 递归修改
chown -R username:groupname directory

# 显示修改过程
chown -v username filename

文件链接

# 创建硬链接
ln source_file hard_link

# 创建符号链接
ln -s source_file symbolic_link

# 创建符号链接到目录
ln -s /path/to/directory link_name

# 强制创建链接(覆盖现有文件)
ln -sf source_file link_name

# 查看链接信息
ls -l link_name
readlink link_name

网络管理

网络管理包括网络连接状态查看、网络配置、网络故障诊断以及网络共享等功能。

网络状态查看

netstat 网络连接查看

# 显示所有网络连接
netstat -a

# 显示所有TCP连接
netstat -t

# 显示所有UDP连接
netstat -u

# 显示监听端口
netstat -l

# 显示数字格式的IP和端口
netstat -n

# 显示进程信息
netstat -p

# 组合使用(最常用)
netstat -tulpn

# 查看特定端口
netstat -tulpn | grep :80
netstat -tulpn | grep :22

# 显示路由表
netstat -r

ss 命令(更现代的替代)

# 显示所有连接
ss -a

# 显示TCP连接
ss -t

# 显示监听端口
ss -l

# 显示进程信息
ss -p

# 组合使用
ss -tulpn

# 查看特定端口
ss -tulpn | grep :80

# 显示连接统计
ss -s

网络接口管理

# 显示所有网络接口
ip addr show
ifconfig

# 显示特定接口
ip addr show eth0
ifconfig eth0

# 启用网络接口
sudo ip link set eth0 up
sudo ifconfig eth0 up

# 禁用网络接口
sudo ip link set eth0 down
sudo ifconfig eth0 down

# 设置IP地址
sudo ip addr add 192.168.1.100/24 dev eth0
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0

# 删除IP地址
sudo ip addr del 192.168.1.100/24 dev eth0

WiFi 网络管理

NetworkManager 命令行工具

# 显示WiFi状态
nmcli radio wifi

# 开启WiFi
nmcli radio wifi on

# 关闭WiFi
nmcli radio wifi off

# 扫描WiFi网络
nmcli dev wifi

# 连接WiFi网络
nmcli dev wifi connect "SSID" password "password"

# 连接隐藏网络
nmcli dev wifi connect "SSID" password "password" hidden yes

# 显示已保存的连接
nmcli con show

# 删除WiFi连接
nmcli con delete "SSID"

# 显示连接详情
nmcli con show "SSID"

传统 WiFi 工具

# 扫描WiFi网络
sudo iwlist scan

# 查看WiFi接口状态
iwconfig

# 连接WiFi网络(需要wpa_supplicant配置)
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

网络热点共享

通过本地笔记本共享WiFi网络

方法一:使用 hostapd 和 dnsmasq

# 安装必要软件
sudo apt update
sudo apt install hostapd dnsmasq

# 创建hostapd配置文件
sudo tee /etc/hostapd/hostapd.conf << EOF
interface=wlan0
driver=nl80211
ssid=MyHotspot
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=YourPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF

# 配置dnsmasq
sudo tee /etc/dnsmasq.conf << EOF
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
EOF

# 配置网络接口
sudo ip addr add 192.168.4.1/24 dev wlan0

# 启用IP转发
sudo sysctl net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

# 配置iptables转发规则
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

# 启动服务
sudo systemctl start hostapd
sudo systemctl start dnsmasq

方法二:使用 NetworkManager 创建热点

# 创建热点连接
nmcli dev wifi hotspot ifname wlan0 ssid MyHotspot password "YourPassword"

# 或者更详细的配置
nmcli con add type wifi ifname wlan0 con-name MyHotspot autoconnect yes ssid MyHotspot
nmcli con modify MyHotspot 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
nmcli con modify MyHotspot wifi-sec.key-mgmt wpa-psk
nmcli con modify MyHotspot wifi-sec.psk "YourPassword"

# 激活热点
nmcli con up MyHotspot

# 停止热点
nmcli con down MyHotspot

# 删除热点配置
nmcli con delete MyHotspot

方法三:使用 create_ap 工具

# 安装create_ap(更简单的工具)
git clone https://github.com/oblique/create_ap
cd create_ap
sudo make install

# 创建热点(共享已有网络连接)
sudo create_ap wlan0 eth0 MyHotspot YourPassword

# 创建无互联网的热点
sudo create_ap -n wlan0 MyHotspot YourPassword

# 停止热点
sudo create_ap --stop wlan0

网络诊断工具

连通性测试

# ping 测试
ping -c 4 google.com
ping -c 4 8.8.8.8

# 持续ping
ping google.com

# IPv6 ping
ping6 google.com

# 指定网络接口ping
ping -I eth0 google.com

路由跟踪

# 跟踪路由到目标
traceroute google.com
tracepath google.com

# IPv6路由跟踪
traceroute6 google.com

域名解析

# DNS查询
nslookup google.com
dig google.com

# 查询特定记录类型
dig google.com A
dig google.com AAAA
dig google.com MX

# 反向DNS查询
nslookup 8.8.8.8
dig -x 8.8.8.8

网络下载工具

# wget 下载
wget https://example.com/file.zip

# 后台下载
wget -b https://example.com/file.zip

# 断点续传
wget -c https://example.com/file.zip

# curl 下载
curl -O https://example.com/file.zip

# curl 显示进度
curl -# -O https://example.com/file.zip

# 发送POST请求
curl -X POST -d "data=value" https://api.example.com

# 设置请求头
curl -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com

网络监控

# 实时监控网络流量
iftop

# 按进程显示网络使用
nethogs

# 网络统计信息
nload

# 监控特定接口
iftop -i eth0

系统信息查看

系统信息查看命令帮助了解系统硬件配置、运行状态、资源使用情况等关键信息。

系统基本信息

系统信息查看

# 显示系统信息
uname -a

# 显示内核名称
uname -s

# 显示内核版本
uname -r

# 显示机器架构
uname -m

# 显示处理器类型
uname -p

# 显示硬件平台
uname -i

# 显示操作系统
uname -o

# 显示主机名
hostname
uname -n

系统版本信息

# 查看发行版信息
cat /etc/os-release
lsb_release -a

# 查看发行版版本
cat /etc/issue
cat /etc/debian_version # Debian/Ubuntu
cat /etc/redhat-release # RedHat/CentOS

# 查看内核信息
cat /proc/version

硬件信息查看

CPU 信息

# 查看CPU详细信息
lscpu

# 查看CPU信息(详细)
cat /proc/cpuinfo

# 查看CPU核心数
nproc

# 查看CPU使用率
cat /proc/loadavg

# 实时查看CPU使用情况
top
htop

内存信息

# 查看内存使用情况
free

# 人类可读格式显示内存
free -h

# 以MB为单位显示
free -m

# 以GB为单位显示
free -g

# 显示内存详细信息
cat /proc/meminfo

# 显示虚拟内存统计
vmstat

# 每2秒更新一次
vmstat 2

磁盘和存储信息

# 查看磁盘使用情况
df

# 人类可读格式
df -h

# 显示文件系统类型
df -T

# 显示inode使用情况
df -i

# 查看特定目录大小
du -h /path/to/directory

# 查看当前目录大小
du -sh .

# 查看目录下各子目录大小
du -h --max-depth=1

# 按大小排序
du -h | sort -hr

# 查看磁盘分区信息
lsblk

# 以树形结构显示
lsblk -T

# 显示文件系统信息
lsblk -f

# 查看块设备信息
fdisk -l

PCI 和 USB 设备

# 查看PCI设备
lspci

# 详细显示PCI设备
lspci -v

# 查看USB设备
lsusb

# 详细显示USB设备
lsusb -v

# 查看所有硬件设备
lshw

# 简要显示硬件信息
lshw -short

系统运行状态

系统运行时间和负载

# 查看系统运行时间和负载
uptime

# 查看当前登录用户
w
who

# 查看登录历史
last

# 查看最后登录的用户
lastlog

进程和资源使用

# 查看所有进程
ps aux

# 按CPU使用率排序
ps aux --sort=-%cpu | head

# 按内存使用率排序
ps aux --sort=-%mem | head

# 实时系统监控
top
htop

# 查看系统资源使用情况
sar -u 1 5 # CPU使用率,每秒一次,共5次
sar -r 1 5 # 内存使用率
sar -d 1 5 # 磁盘I/O

网络接口状态

# 查看网络接口
ip addr show
ifconfig

# 查看网络统计
cat /proc/net/dev

# 查看路由表
ip route show
route -n

环境变量和系统配置

环境变量

# 查看所有环境变量
env
printenv

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER

# 设置环境变量
export VAR_NAME=value

# 查看当前shell
echo $SHELL
echo $0

系统限制和配置

# 查看系统限制
ulimit -a

# 查看文件描述符限制
ulimit -n

# 查看进程数限制
ulimit -u

# 查看内核参数
sysctl -a

# 查看特定内核参数
sysctl kernel.version
sysctl vm.swappiness

# 查看挂载点
mount
cat /proc/mounts

系统服务和启动信息

启动信息

# 查看系统启动信息
dmesg

# 查看最近的启动信息
dmesg | tail

# 按时间显示启动信息
dmesg -T

# 查看启动日志
journalctl -b

# 查看内核消息
cat /var/log/kern.log
cat /var/log/messages

系统运行级别

# 查看当前运行级别
runlevel
systemctl get-default

# 查看所有运行的服务
systemctl list-units --type=service --state=running

# 查看开机自启服务
systemctl list-unit-files --type=service --state=enabled

定时任务管理

定时任务允许系统在指定时间自动执行命令或脚本,是系统自动化管理的重要工具。

Cron 定时任务

crontab 基本操作

# 编辑当前用户的crontab
crontab -e

# 查看当前用户的crontab
crontab -l

# 删除当前用户的crontab
crontab -r

# 编辑指定用户的crontab(需要root权限)
sudo crontab -e -u username

# 查看指定用户的crontab
sudo crontab -l -u username

# 从文件导入crontab
crontab filename

# 查看cron服务状态
systemctl status cron
systemctl status crond # CentOS/RHEL

Cron 时间格式

# Cron时间格式:分钟 小时 日 月 星期 命令
# * * * * * command
# | | | | |
# | | | | +-- 星期几 (0-7, 0和7都表示星期日)
# | | | +---- 月份 (1-12)
# | | +------ 日期 (1-31)
# | +-------- 小时 (0-23)
# +---------- 分钟 (0-59)

# 特殊字符说明:
# * : 匹配任何值
# , : 分隔多个值 (例如: 1,3,5)
# - : 指定范围 (例如: 1-5)
# / : 指定间隔 (例如: */5 表示每5分钟)

常用 Cron 示例

# 每分钟执行一次
* * * * * /path/to/command

# 每小时执行一次(每小时的第0分钟)
0 * * * * /path/to/command

# 每天凌晨2点执行
0 2 * * * /path/to/command

# 每周一凌晨3点执行
0 3 * * 1 /path/to/command

# 每月1号凌晨4点执行
0 4 1 * * /path/to/command

# 每5分钟执行一次
*/5 * * * * /path/to/command

# 每小时的30分钟执行
30 * * * * /path/to/command

# 每天上午9点到下午5点,每小时执行
0 9-17 * * * /path/to/command

# 周一到周五每天上午9点执行
0 9 * * 1-5 /path/to/command

# 每个工作日的上午9点和下午5点执行
0 9,17 * * 1-5 /path/to/command

# 每年1月1日凌晨执行
0 0 1 1 * /path/to/command

特殊时间关键词

# @reboot    : 系统重启时执行
@reboot /path/to/command

# @yearly 或 @annually : 每年执行一次 (相当于 0 0 1 1 *)
@yearly /path/to/command

# @monthly : 每月执行一次 (相当于 0 0 1 * *)
@monthly /path/to/command

# @weekly : 每周执行一次 (相当于 0 0 * * 0)
@weekly /path/to/command

# @daily : 每天执行一次 (相当于 0 0 * * *)
@daily /path/to/command

# @hourly : 每小时执行一次 (相当于 0 * * * *)
@hourly /path/to/command

Cron 环境变量和输出

# 在crontab中设置环境变量
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash
HOME=/root

# 设置邮件接收者
MAILTO=user@example.com

# 禁用邮件发送
MAILTO=""

# 重定向输出到日志文件
0 2 * * * /path/to/script.sh >> /var/log/script.log 2>&1

# 只重定向错误输出
0 2 * * * /path/to/script.sh 2>> /var/log/script.error.log

# 忽略所有输出
0 2 * * * /path/to/script.sh > /dev/null 2>&1

At 命令 - 一次性定时任务

at 基本用法

# 在特定时间执行命令
at 14:30
at> /path/to/command
at> <Ctrl+D>

# 在明天14:30执行
at 14:30 tomorrow

# 在下周一执行
at 14:30 monday

# 在指定日期执行
at 14:30 2024-12-25

# 在5分钟后执行
at now + 5 minutes

# 在1小时后执行
at now + 1 hour

# 在2天后执行
at now + 2 days

# 从文件中读取命令
at 14:30 < script.sh

# 查看待执行的at任务
atq
at -l

# 删除at任务
atrm job_number
at -r job_number

# 查看特定任务的内容
at -c job_number

batch 命令

# 系统负载低时执行任务
batch
batch> /path/to/command
batch> <Ctrl+D>

# 从文件中读取批处理任务
batch < script.sh

系统级定时任务

系统crontab文件

# 查看系统级crontab
cat /etc/crontab

# 系统crontab格式(多了用户字段)
# 分钟 小时 日 月 星期 用户 命令
0 2 * * * root /path/to/command

# 系统级任务目录
ls /etc/cron.d/ # 系统级cron任务
ls /etc/cron.hourly/ # 每小时执行的脚本
ls /etc/cron.daily/ # 每天执行的脚本
ls /etc/cron.weekly/ # 每周执行的脚本
ls /etc/cron.monthly/ # 每月执行的脚本

系统任务目录使用

# 创建每日任务脚本
sudo vim /etc/cron.daily/backup-script
sudo chmod +x /etc/cron.daily/backup-script

# 创建每小时任务脚本
sudo vim /etc/cron.hourly/log-cleanup
sudo chmod +x /etc/cron.hourly/log-cleanup

# 创建系统级cron任务
sudo vim /etc/cron.d/custom-task

Systemd Timer

systemd timer 基本概念

# 查看所有timer
systemctl list-timers

# 查看活跃的timer
systemctl list-timers --all

# 启动timer
sudo systemctl start timer-name.timer

# 启用timer(开机自启)
sudo systemctl enable timer-name.timer

# 停止timer
sudo systemctl stop timer-name.timer

# 查看timer状态
systemctl status timer-name.timer

创建自定义 systemd timer

# 创建服务文件 /etc/systemd/system/my-task.service
[Unit]
Description=My Custom Task
Wants=my-task.timer

[Service]
Type=oneshot
ExecStart=/path/to/my-script.sh

[Install]
WantedBy=multi-user.target

# 创建timer文件 /etc/systemd/system/my-task.timer
[Unit]
Description=Run my-task every 30 minutes
Requires=my-task.service

[Timer]
OnCalendar=*:0/30
Persistent=true

[Install]
WantedBy=timers.target

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启用并启动timer
sudo systemctl enable my-task.timer
sudo systemctl start my-task.timer

Systemd timer 时间格式

# OnCalendar 时间格式示例
OnCalendar=*-*-* 02:00:00 # 每天2点
OnCalendar=Mon *-*-* 09:00:00 # 每周一9点
OnCalendar=*-01-01 00:00:00 # 每年1月1日
OnCalendar=hourly # 每小时
OnCalendar=daily # 每天
OnCalendar=weekly # 每周
OnCalendar=monthly # 每月
OnCalendar=*:0/15 # 每15分钟

定时任务调试和监控

查看cron日志

# 查看cron日志
tail -f /var/log/cron
tail -f /var/log/syslog | grep cron

# 在Ubuntu中启用详细日志
sudo vim /etc/rsyslog.d/50-default.conf
# 取消注释:cron.* /var/log/cron.log

# 重启日志服务
sudo systemctl restart rsyslog

调试定时任务

# 测试cron表达式
# 在线工具:crontab.guru

# 手动运行定时任务
sudo run-parts /etc/cron.daily/

# 设置详细的日志记录
* * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

# 在脚本中添加时间戳
echo "$(date): Starting task" >> /var/log/myscript.log

环境变量和包管理

环境变量管理和软件包管理是Linux系统管理中的核心技能,涉及系统配置和软件安装维护。

环境变量管理

查看和设置环境变量

# 查看所有环境变量
env
printenv

# 查看特定环境变量
echo $PATH
echo $HOME
echo $USER
printenv PATH

# 设置临时环境变量(当前会话有效)
export VAR_NAME="value"
VAR_NAME="value"

# 取消设置环境变量
unset VAR_NAME

# 查看变量是否已设置
echo ${VAR_NAME:-"not set"}

PATH 环境变量管理

# 查看PATH
echo $PATH

# 临时添加到PATH前面
export PATH="/new/path:$PATH"

# 临时添加到PATH后面
export PATH="$PATH:/new/path"

# 永久添加到PATH(用户级别)
echo 'export PATH="$PATH:/new/path"' >> ~/.bashrc
echo 'export PATH="$PATH:/new/path"' >> ~/.zshrc

# 重新加载配置
source ~/.bashrc
source ~/.zshrc

# 系统级PATH配置
sudo vim /etc/environment

配置文件管理

# 用户级配置文件
~/.bashrc # bash shell配置
~/.zshrc # zsh shell配置
~/.profile # shell无关的配置
~/.bash_profile # bash登录时执行
~/.bash_logout # bash退出时执行

# 系统级配置文件
/etc/profile # 系统级profile
/etc/bash.bashrc # 系统级bashrc
/etc/environment # 系统环境变量

# 编辑配置文件
vim ~/.bashrc

# 重新加载配置文件
source ~/.bashrc
. ~/.bashrc

# 查看shell类型
echo $SHELL
echo $0

常用环境变量

# 系统相关
HOME # 用户主目录
USER # 当前用户名
SHELL # 当前shell
PWD # 当前工作目录
OLDPWD # 前一个工作目录

# 程序相关
PATH # 可执行文件搜索路径
LD_LIBRARY_PATH # 动态库搜索路径
MANPATH # 手册页搜索路径
EDITOR # 默认编辑器
BROWSER # 默认浏览器

# 语言和编码
LANG # 系统语言
LC_ALL # 本地化设置
TZ # 时区设置

# 设置常用环境变量
export EDITOR=vim
export BROWSER=firefox
export LANG=zh_CN.UTF-8

Debian/Ubuntu 包管理 (APT)

基本包管理操作

# 更新软件包索引
sudo apt update

# 升级所有可更新的软件包
sudo apt upgrade

# 升级系统(包括删除过时包)
sudo apt full-upgrade
sudo apt dist-upgrade

# 安装软件包
sudo apt install package_name

# 安装多个软件包
sudo apt install package1 package2 package3

# 安装特定版本
sudo apt install package_name=version

# 重新安装软件包
sudo apt install --reinstall package_name

# 删除软件包(保留配置文件)
sudo apt remove package_name

# 完全删除软件包(包括配置文件)
sudo apt purge package_name

# 清理不再需要的依赖包
sudo apt autoremove

# 清理软件包缓存
sudo apt autoclean
sudo apt clean

软件包查询

# 搜索软件包
apt search keyword
apt-cache search keyword

# 查看软件包信息
apt show package_name
apt-cache show package_name

# 列出已安装的软件包
apt list --installed

# 查看软件包依赖
apt-cache depends package_name

# 查看软件包反向依赖
apt-cache rdepends package_name

# 列出可更新的软件包
apt list --upgradable

# 查看软件包文件列表
dpkg -L package_name

# 查找文件属于哪个包
dpkg -S /path/to/file
apt-file search filename

APT 源管理

# 查看软件源配置
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

# 添加PPA源
sudo add-apt-repository ppa:user/repository

# 删除PPA源
sudo add-apt-repository --remove ppa:user/repository

# 添加GPG密钥
wget -qO - https://example.com/key.gpg | sudo apt-key add -

# 列出已添加的GPG密钥
apt-key list

Red Hat/CentOS 包管理 (YUM/DNF)

YUM 基本操作

# 更新软件包索引
sudo yum check-update

# 更新所有软件包
sudo yum update

# 安装软件包
sudo yum install package_name

# 删除软件包
sudo yum remove package_name

# 搜索软件包
yum search keyword

# 查看软件包信息
yum info package_name

# 列出已安装的软件包
yum list installed

# 清理缓存
sudo yum clean all

DNF 操作(Fedora/新版CentOS)

# 更新软件包索引
sudo dnf check-update

# 更新所有软件包
sudo dnf update

# 安装软件包
sudo dnf install package_name

# 删除软件包
sudo dnf remove package_name

# 搜索软件包
dnf search keyword

# 查看软件包信息
dnf info package_name

# 列出已安装的软件包
dnf list installed

Arch Linux 包管理 (Pacman)

# 更新系统
sudo pacman -Syu

# 安装软件包
sudo pacman -S package_name

# 删除软件包
sudo pacman -R package_name

# 删除软件包及其依赖
sudo pacman -Rs package_name

# 搜索软件包
pacman -Ss keyword

# 查看软件包信息
pacman -Si package_name

# 列出已安装的软件包
pacman -Q

# 查看本地软件包信息
pacman -Qi package_name

# 清理包缓存
sudo pacman -Sc

通用软件安装方法

从源码编译安装

# 典型的编译安装流程
wget https://example.com/software.tar.gz
tar -xzf software.tar.gz
cd software/

# 配置编译选项
./configure --prefix=/usr/local

# 编译
make

# 安装
sudo make install

# 卸载(如果支持)
sudo make uninstall

使用 Snap 包

# 安装 Snap
sudo apt install snapd

# 搜索 Snap 包
snap find keyword

# 安装 Snap 包
sudo snap install package_name

# 列出已安装的 Snap 包
snap list

# 更新 Snap 包
sudo snap refresh package_name

# 删除 Snap 包
sudo snap remove package_name

使用 Flatpak

# 安装 Flatpak
sudo apt install flatpak

# 添加 Flathub 仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 搜索应用
flatpak search keyword

# 安装应用
flatpak install flathub app_id

# 运行应用
flatpak run app_id

# 列出已安装应用
flatpak list

# 更新应用
flatpak update

# 删除应用
flatpak uninstall app_id

AppImage 应用

# 下载 AppImage
wget https://example.com/app.AppImage

# 添加执行权限
chmod +x app.AppImage

# 运行应用
./app.AppImage

# 集成到系统(可选)
./app.AppImage --appimage-extract

开发工具和语言包管理

Python 包管理

# pip 包管理
pip install package_name
pip install --user package_name
pip uninstall package_name
pip list
pip search keyword
pip show package_name

# 虚拟环境
python -m venv venv_name
source venv_name/bin/activate
deactivate

# requirements.txt
pip freeze > requirements.txt
pip install -r requirements.txt

Node.js 包管理

# npm 包管理
npm install package_name
npm install -g package_name
npm uninstall package_name
npm list
npm search keyword
npm info package_name

# yarn 包管理
yarn add package_name
yarn remove package_name
yarn global add package_name
yarn list

其他语言包管理

# Ruby gems
gem install package_name
gem uninstall package_name
gem list

# Go modules
go get package_name
go mod tidy

# Rust cargo
cargo install package_name
cargo uninstall package_name

日志查看和磁盘管理

系统日志和磁盘管理是Linux系统维护的重要组成部分,帮助监控系统运行状态和管理存储资源。

系统日志查看

journalctl - systemd 日志查看

# 查看所有日志
journalctl

# 查看最新日志
journalctl -f
journalctl --follow

# 查看特定服务的日志
journalctl -u service_name
journalctl -u ssh.service

# 查看特定时间范围的日志
journalctl --since "2024-01-01"
journalctl --since "2024-01-01 10:00:00"
journalctl --since yesterday
journalctl --since "1 hour ago"

# 组合时间范围查询
journalctl --since "2024-01-01" --until "2024-01-02"

# 查看启动日志
journalctl -b
journalctl -b -1 # 上一次启动的日志

# 查看特定优先级的日志
journalctl -p err # 错误级别
journalctl -p warning # 警告级别
journalctl -p info # 信息级别

# 查看内核日志
journalctl -k

# 显示最后几行日志
journalctl -n 50
journalctl --lines=50

# 以JSON格式输出
journalctl -o json

# 查看磁盘使用情况
journalctl --disk-usage

# 清理旧日志
sudo journalctl --rotate
sudo journalctl --vacuum-time=2weeks
sudo journalctl --vacuum-size=500M

传统日志文件

# 常见系统日志文件位置
/var/log/syslog # 系统日志(Debian/Ubuntu)
/var/log/messages # 系统消息(RedHat/CentOS)
/var/log/kern.log # 内核日志
/var/log/auth.log # 认证日志(Debian/Ubuntu)
/var/log/secure # 安全日志(RedHat/CentOS)
/var/log/boot.log # 启动日志
/var/log/cron.log # Cron任务日志
/var/log/maillog # 邮件服务日志
/var/log/apache2/ # Apache日志目录
/var/log/nginx/ # Nginx日志目录

# 查看日志文件
tail -f /var/log/syslog
head -n 100 /var/log/auth.log
less /var/log/messages

# 搜索日志内容
grep "error" /var/log/syslog
grep -i "failed" /var/log/auth.log

# 实时监控多个日志文件
tail -f /var/log/syslog /var/log/auth.log

# 查看压缩的旧日志
zcat /var/log/syslog.1.gz
zgrep "error" /var/log/syslog.*.gz

日志分析工具

# 使用 awk 分析日志
awk '/error/ {print $1, $2, $3, $NF}' /var/log/syslog

# 统计错误数量
grep -c "error" /var/log/syslog

# 按时间过滤日志
awk '$0 ~ /Jan 01/ {print}' /var/log/syslog

# 提取特定字段
awk '{print $1, $2, $3}' /var/log/auth.log

# 使用 sed 处理日志
sed -n '100,200p' /var/log/syslog # 显示100-200行

磁盘和文件系统管理

磁盘使用情况查看

# 查看磁盘使用情况
df -h

# 查看特定文件系统
df -h /home

# 显示文件系统类型
df -T

# 显示 inode 使用情况
df -i

# 查看目录大小
du -h /path/to/directory

# 查看当前目录大小
du -sh .

# 查看子目录大小(一级)
du -h --max-depth=1

# 按大小排序显示
du -h | sort -hr

# 查找大文件
find /path -type f -size +100M -ls
find /path -type f -size +1G -exec ls -lh {} \;

# 统计文件数量
find /path -type f | wc -l
find /path -type d | wc -l

磁盘分区管理

# 查看磁盘分区
fdisk -l
lsblk
lsblk -f

# 查看分区详细信息
parted -l
blkid

# 交互式分区工具
sudo fdisk /dev/sda
sudo parted /dev/sda

# 创建分区表(GPT)
sudo parted /dev/sda mklabel gpt

# 创建分区
sudo parted /dev/sda mkpart primary ext4 1MiB 1GiB

# 删除分区
sudo parted /dev/sda rm 1

# 查看分区使用情况
sudo fdisk -l /dev/sda

文件系统操作

# 格式化分区
sudo mkfs.ext4 /dev/sda1
sudo mkfs.xfs /dev/sda1
sudo mkfs.btrfs /dev/sda1

# 检查文件系统
sudo fsck /dev/sda1
sudo fsck.ext4 /dev/sda1

# 强制检查
sudo fsck -f /dev/sda1

# 修复文件系统
sudo fsck -y /dev/sda1

# 查看文件系统信息
sudo tune2fs -l /dev/sda1
sudo dumpe2fs /dev/sda1 | head

# 调整文件系统参数
sudo tune2fs -c 30 /dev/sda1 # 设置检查间隔
sudo tune2fs -L "MyDisk" /dev/sda1 # 设置卷标

挂载和卸载

# 挂载分区
sudo mount /dev/sda1 /mnt/mydisk

# 挂载时指定文件系统类型
sudo mount -t ext4 /dev/sda1 /mnt/mydisk

# 只读挂载
sudo mount -o ro /dev/sda1 /mnt/mydisk

# 卸载分区
sudo umount /dev/sda1
sudo umount /mnt/mydisk

# 强制卸载
sudo umount -f /mnt/mydisk
sudo umount -l /mnt/mydisk # 懒卸载

# 查看挂载点
mount
df -h
findmnt

# 查看特定挂载点
findmnt /home

自动挂载配置

# 编辑 fstab 文件
sudo vim /etc/fstab

# fstab 格式:
# 设备 挂载点 文件系统 选项 转储 检查
/dev/sda1 /home ext4 defaults 0 2

# 常用挂载选项
defaults # 默认选项
ro # 只读
rw # 读写
noexec # 不允许执行
nosuid # 不允许suid
nodev # 不允许设备文件
auto # 自动挂载
noauto # 不自动挂载
user # 允许用户挂载
nouser # 不允许用户挂载

# 测试 fstab 配置
sudo mount -a

# 重新挂载已挂载的文件系统
sudo mount -o remount,ro /home

压缩和归档

tar 归档工具

# 创建归档文件
tar -cf archive.tar file1 file2 directory/

# 创建压缩归档文件
tar -czf archive.tar.gz file1 file2 directory/ # gzip压缩
tar -cjf archive.tar.bz2 file1 file2 directory/ # bzip2压缩
tar -cJf archive.tar.xz file1 file2 directory/ # xz压缩

# 解压归档文件
tar -xf archive.tar
tar -xzf archive.tar.gz
tar -xjf archive.tar.bz2
tar -xJf archive.tar.xz

# 查看归档内容
tar -tf archive.tar
tar -tzf archive.tar.gz

# 解压到指定目录
tar -xf archive.tar -C /path/to/directory

# 添加文件到归档
tar -rf archive.tar newfile

# 显示详细信息
tar -xvf archive.tar

其他压缩工具

# gzip/gunzip
gzip file.txt # 压缩文件
gunzip file.txt.gz # 解压文件
zcat file.txt.gz # 查看压缩文件内容

# zip/unzip
zip archive.zip file1 file2 directory/
unzip archive.zip
unzip -l archive.zip # 查看内容
unzip archive.zip -d /path/to/directory

# 7z
7z a archive.7z file1 file2 directory/
7z x archive.7z
7z l archive.7z # 查看内容

存储设备管理

USB和移动设备

# 查看USB设备
lsusb

# 查看块设备
lsblk
sudo fdisk -l

# 挂载USB设备
sudo mount /dev/sdb1 /mnt/usb

# 安全移除USB设备
sudo umount /dev/sdb1
sudo eject /dev/sdb1

# 查看设备标签
sudo blkid

RAID管理

# 查看RAID状态
cat /proc/mdstat

# 创建RAID 1
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

# 查看RAID详情
sudo mdadm --detail /dev/md0

# 停止RAID
sudo mdadm --stop /dev/md0

# 监控RAID
sudo mdadm --monitor --scan

LVM管理

# 查看物理卷
sudo pvs
sudo pvdisplay

# 查看卷组
sudo vgs
sudo vgdisplay

# 查看逻辑卷
sudo lvs
sudo lvdisplay

# 创建物理卷
sudo pvcreate /dev/sda1

# 创建卷组
sudo vgcreate myvg /dev/sda1

# 创建逻辑卷
sudo lvcreate -L 10G -n mylv myvg

# 扩展逻辑卷
sudo lvextend -L +5G /dev/myvg/mylv
sudo resize2fs /dev/myvg/mylv # 扩展文件系统
知识共享许可协议