Appearance
Linux 常用命令
基础命令
文件、目录
基础命令:
pwd查看用户的当前目录cd切换目录.表示当前目录..表示当前目录的上一级目录(父目录)-表示用cd命令切换目录前所在的目录~表示用户主目录的绝对路径名
ls:显示文件或目录信息;mkdir:当前目录下创建一个空目录;rmdir:要求目录为空;touch:生成一个空文件或更改文件的时间;cp:复制文件或目录;mv:移动文件或目录、文件或目录改名;rm:删除文件或目录;ln:建立链接文件;file/stat:查看文件类型或文件属性信息;cat:查看文本文件内容;more:可以分页看;less:不仅可以分页,还可以方便地搜索,回翻等操作;tail -10:查看文件的尾部的 10 行;head -20:查看文件的头部 20 行;echo:把内容重定向到指定的文件中,有则打开,无则创建;
管道命令 |:将前面的结果给后面的命令,例如:ls -la | wc,将 ls 的结果传给 wc 命令来统计字数。
重定向 > 是覆盖模式,>> 是追加模式,例如:echo "Java3y,zhen de hen xihuan ni" > qingshu.txt 把左边的输出覆盖到右边的文件里去。
find
find 命令用于在目录树中搜索文件,并根据文件名、大小、修改时间、权限等条件进行查找。
Bash
find [path] [options] [expression]常用表达式:
| 表达式 | 说明 |
|---|---|
-name "*.txt" | 按名称查找(支持通配符 *、?、[]) |
-iname "*.txt" | 按名称查找(忽略大小写) |
-type f | 只查找普通文件 |
-type d | 只查找目录 |
-size +1G | 查找大于 1GB 的文件(- 表示小于) |
-mtime -7 | 查找 7 天内修改过的文件(+ 表示超过) |
-perm 777 | 查找权限为 777 的文件 |
-user username | 查找属于指定用户的文件 |
-group groupname | 查找属于指定组的文件 |
-maxdepth 2 | 最多搜索 2 层目录 |
-mindepth 2 | 至少搜索 2 层目录 |
-empty | 查找空文件或空目录 |
-delete | 查找后直接删除 |
-exec command {} \; | 对查找到的文件执行指定命令 |
常用选项:
| 选项 | 说明 |
|---|---|
-L | 跟随符号链接 |
-P | 不跟随符号链接(默认) |
-H | 只跟随命令行中的符号链接 |
逻辑运算符:
| 运算符 | 说明 |
|---|---|
-a 或 -and | 逻辑与(默认,可省略) |
-o 或 -or | 逻辑或 |
! 或 -not | 逻辑非 |
\( \) | 分组,改变优先级(需转义括号) |
, | 逗号,无条件执行两边的表达式 |
特殊动作:
| 表达式 | 说明 |
|---|---|
-prune | 跳过当前目录及其子目录(不递归) |
-print | 打印匹配的文件路径(默认动作) |
-print0 | 以 null 字符分隔打印(处理带空格文件名) |
-ls | 以 ls -l 形式打印文件详细信息 |
-prune 和 -o 的工作原理
-prune:跳过当前目录及其子目录(不再递归进入),但仍会匹配当前目录本身。常用于排除不必要的目录以提高性能;-o(OR):逻辑或运算符,连接两个条件,任一条件为真即可。
典型模式:find . -path "排除路径" -prune -o -name "目标" -print
注意:使用 -o 时需要显式添加 -print(因为 -prune 成功时不会触发默认的 -print)
正则表达式:
find 支持使用正则表达式进行更灵活的文件名和路径匹配。
| 表达式 | 说明 |
|---|---|
-regex pattern | 使用正则表达式匹配完整路径(默认为 Emacs 风格) |
-iregex pattern | 使用正则表达式匹配完整路径(忽略大小写) |
-regextype type | 指定正则表达式类型(见下方支持的类型) |
支持的正则表达式类型:
| 类型 | 说明 |
|---|---|
findutils-default | 默认(类似 Emacs 风格) |
emacs | Emacs 风格正则表达式 |
posix-awk | POSIX AWK 正则表达式 |
posix-basic | POSIX 基本正则表达式(BRE) |
posix-egrep | POSIX 扩展正则表达式(ERE) |
posix-minimal-basic | 简化的 POSIX BRE |
sed | sed 风格正则表达式 |
提示
-regex 和 -iregex 匹配的是完整路径。
示例:
Bash
# 查找当前目录下所有 .txt 文件
find . -name "*.txt"
# 查找 /var 目录下大于 100MB 的文件
find /var -size +100M
# 查找 7 天内修改过的 .log 文件
find /var/log -name "*.log" -mtime -7
# 查找并删除 30 天前的临时文件
find /tmp -name "*.tmp" -mtime +30 -delete
# 查找符号链接
find . -type l
# 查找并列出所有空目录
find . -type d -empty
# 查找并批量修改权限
find . -type f -name "*.sh" -exec chmod +x {} \;
# 查找所有可执行文件(并显示详细信息)
find . -type f -perm /a+x -ls
# 只在当前目录查找(不递归子目录)
find . -maxdepth 1 -type d
# 多条件组合:查找大于 10MB 且修改于 7 天内的 .log 文件
find /var/log -name "*.log" -size +10M -mtime -7
# 逻辑或:查找 .txt 或 .md 文件
find . \( -name "*.txt" -o -name "*.md" \)
# 逻辑非:查找非 .log 文件
find . -type f ! -name "*.log"
# 排除某些目录
find / -path "/proc" -prune -o -name "*.conf" -print
# 排除多个目录
find . \
\( -path "./node_modules" \
-o -path "./dist" \
-o -path "./.git" \) \
-prune -o \
-type f -name "*.js" -print
# 使用 POSIX 扩展正则表达式
find . -regextype posix-egrep -regex '.*\.(jpg|png|gif)$'提示
find 的查找速度相对较慢,如果只需按文件名快速查找,可使用 locate 命令(基于数据库索引,速度更快但数据可能不是最新的)。
grep
grep 用于在文件中搜索指定的模式(正则表达式),然后输出包含该模式的行。基础语法:
ABNF
"grep" [options] pattern [file]Tip:省略
file时表示在标准输入中查找。
| 示例 | 命令 | 说明 |
|---|---|---|
| 递归搜索 | grep -r pattern directory | 递归地在指定目录及其子目录中搜索匹配 pattern 的行 |
| 忽略大小写 | grep -i pattern file | 默认为大小写敏感匹配 |
| 显示行号 | grep -n pattern file | 显示匹配行的行号 |
| 反向匹配 | grep -v pattern file | 显示不匹配模式的行 |
| 扩展正则表达式 | grep -E "pattern" file | 使用扩展正则表达式(ERE)进行匹配 |
| 兼容正则表达式 | grep -P "pattern" file | 使用兼容正则表达式(PCRE)进行匹配 |
| 统计匹配行数 | grep -c pattern file | 只显示匹配的行数,而不是具体的匹配行 |
| 显示匹配部分 | grep -o pattern file | 只显示匹配的部分,而不是整行 |
grep 默认使用基本正则表达式(BRE),在 BRE 中 ?、+、{、|、( 和 ) 是普通字符。
要使其具备特殊含义,有两种方法:
- 使用转义形式,例如
\|来表示或操作; - 使用
grep -E扩展正则表达式(ERE),而无需进行转义。
sed
sed(Stream Editor,流编辑器)是一种非交互式的行编辑器,主要用于对文本流(文件或管道输入)进行自动化的查找、替换、删除、插入等操作。sed 以行为单位处理文本,默认不会修改原文件,而是将处理结果输出到标准输出(屏幕),适合脚本自动化和管道结合使用。
ABNF
sed = "sed" [options] "'" script "'" file
script = [address] command [parameters]address:指定作用的行范围(如数字、正则、$表示最后一行);command:如s(替换)、d(删除)、p(打印)、i(插入)、a(追加)。
常见选项:
| 选项 | 说明 |
|---|---|
-n | 安静模式,抑制默认输出(只输出明确指定的行,常与 p 命令配合) |
-i | 就地编辑,直接修改原文件 |
-e | 允许多个脚本命令 |
-f | 从脚本文件读取命令 |
'-E', -r | 使用扩展正则表达式(ERE) |
假设有一个测试文件 test.txt 内容如下:
Text
hello world
linux is great
sed is powerful
hello linux替换(
s命令)替换每行第 1 次出现
Bashsed 's/hello/hi/' test.txt输出:
Texthi world linux is great sed is powerful hi linux替换每行第 n 次出现(如第 2 次)
Bashsed 's/hello/hi/2' test.txt全局替换(加
g)Bashsed 's/hello/hi/g' test.txt就地替换原文件
Bashsed -i 's/hello/hi/g' test.txt
删除行(
d命令)删除指定行(如第 3 行)
Bashsed '3d' test.txt删除匹配行(如包含
hello的行)Bashsed '/hello/d' test.txt删除范围(如第 2 到最后一行)
Bashsed '2,$d' test.txt
打印行(
p命令)常与
-n配合。打印指定行
Bashsed -n '1,3p' test.txt打印匹配行
Bashsed -n '/linux/p' test.txt
插入/追加(
i/a命令)在匹配行前插入
Bashsed '/hello/i\New line before' test.txt在匹配行后追加
Bashsed '/hello/a\New line after' test.txt
其他高级用法
多命令组合(用分号或
-e)Bashsed -e 's/hello/hi/g' -e '3d' test.txt使用正则:支持正则表达式,如删除空行
Bashsed '/^$/d' test.txt
tee
tee 命令用于从标准输入读取数据,并同时将数据输出到标准输出和一个或多个文件。即,可以在不影响管道后续处理的情况下,将中间结果保存到文件。
ABNF
"tee" [options] *file| 选项 | 说明 |
|---|---|
-a | 追加到文件,而不是覆盖 |
-i | 忽略中断信号(如 Ctrl+C) |
典型使用场景:
写入文件的同时查看输出
Bashecho "hello world" | tee output.txt追加写入文件(不覆盖)
默认情况下,
tee会覆盖文件内容。使用-a参数可以变成追加:Bashecho "new line" | tee -a output.txt在管道中保存中间结果
这是
tee最常见、也是最重要的用途。Bashps aux | tee ps.log | grep javaps aux的完整输出被保存到ps.log,同时将输出继续传给grep java进行过滤,不会 “截断” 管道。同时写入多个文件
Bashdate | tee file1.txt file2.txt结合
sudo写入受限文件重定向符号
>在 shell 中执行,可能导致权限不足,而tee可绕过这一限制:Bashecho "127.0.0.1 example.com" | sudo tee -a /etc/hosts
ps
ps(Process Status)命令用于显示当前系统运行的进程状态。它可以显示进程的 PID(进程 ID)、终端、CPU 使用率、内存使用率、状态、启动时间等信息。
基本语法:
Bash
ps [options]常用选项:
| 选项 | 说明 |
|---|---|
a | 显示所有终端的进程(包括其他用户的) |
u | 以用户为主的格式显示进程信息 |
x | 显示没有控制终端的进程 |
e | 显示所有进程 |
f | 显示进程树状结构 |
-e | 显示所有进程 |
-f | 完整格式显示 |
-l | 长格式显示 |
-p PID | 指定进程 ID |
-u user | 指定用户 |
--forest | 以树状结构显示进程层级关系 |
-H | 显示进程层级(用缩进表示父子关系) |
T | 显示当前终端的所有进程 |
r | 只显示正在运行的进程 |
N | 反向选择 |
n | 以数字形式显示 user 和 wchan |
w | 宽输出,不截断命令行参数(可多次使用加宽) |
常用组合:
| 组合 | 说明 |
|---|---|
ps | 显示当前用户的进程 |
ps -ef | 显示所有进程的详细信息 |
ps aux | 显示所有进程(BSD 风格) |
ps -ef --forest | 以树状结构显示所有进程 |
输出字段说明:
使用 ps aux 或 ps -ef 时,常见字段含义:
| 字段 | 说明 |
|---|---|
USER | 进程所属用户 |
PID | 进程 ID |
%CPU | CPU 使用率 |
%MEM | 内存使用率 |
VSZ | 虚拟内存大小(KB) |
RSS | 实际物理内存大小(KB) |
TTY | 终端设备 |
STAT | 进程状态(R=运行,S=睡眠,D=不可中断,Z=僵尸,T=停止) |
START | 进程启动时间 |
TIME | 进程使用的 CPU 时间总计 |
COMMAND | 启动进程的命令 |
PPID | 父进程 ID |
C | CPU 使用率(历史字段,%CPU 的整数部分) |
示例:
Bash
# 显示当前用户的进程
ps
# 显示所有进程(BSD 风格)
ps aux
# 显示所有进程(System V 风格)
ps -ef
# 以树状结构显示所有进程
ps -ef --forest
# 查看特定进程
ps -p 1234
# 查看特定用户的进程
ps -u username
# 查看特定进程名称的进程
ps -C nginx
# 实时查看进程(通常用 top 替代)
watch -n 1 'ps aux | head -20'
# 查看进程完整命令行(不截断)
ps auxww
# 查看某个进程的所有线程
ps -T -p 1234
# 按内存使用排序显示前 10 个进程
ps aux --sort=-%mem | head -10
# 按CPU使用排序显示前 10 个进程
ps aux --sort=-%cpu | head -10
# 查看进程的父进程关系
ps -efH
# 显示所有进程的完整信息
ps -ely
# 查看正在运行的进程
ps r提示
ps 命令显示的是命令执行瞬间的快照,不是动态更新的。如果需要实时监控进程,建议使用 top、htop 或 atop 命令。
压缩包
常用的压缩的命令有:
gzip filenamebzip2 filenametar -czvf filename
常用的解压命令有:
gzip -d filename.gzbzip2 -d filename.bz2tar -xzvf filename.tar.gz
rsync
rsync 是一个快速、通用的远程(和本地)文件拷贝工具,它比 scp 更高效,支持增量同步、断点续传等功能。
基本语法:
Bash
rsync [选项] 源路径 目标路径常用选项:
| 选项 | 说明 |
|---|---|
-a | 归档模式,递归拷贝并保留所有属性(相当于 -rlptgoD) |
-v | 显示详细输出信息 |
-z | 传输时压缩数据 |
-r | 递归拷贝目录 |
-p | 保留权限 |
-t | 保留修改时间 |
-g | 保留所属组 |
-o | 保留所有者(需要 root 权限) |
-l | 保留软链接 |
-H | 保留硬链接 |
-A | 保留 ACL 权限 |
-X | 保留扩展属性 |
-e | 指定远程 shell(如 ssh) |
--progress | 显示传输进度 |
--delete | 删除目标目录中源目录没有的文件 |
--exclude | 排除匹配的文件/目录 |
--partial | 保留部分传输的文件,支持断点续传 |
--bwlimit | 限制带宽(单位 KB/s) |
示例:
Bash
# 本地拷贝
rsync -av /path/to/source/ /path/to/destination/
# 同步到远程主机(通过 SSH)
rsync -avz /path/to/source/ root@192.168.1.100:/path/to/destination/
# 从远程主机同步到本地
rsync -avz root@192.168.1.100:/path/to/source/ /path/to/destination/
# 指定 SSH 及端口
rsync -avz -e "ssh -p 2222" /path/to/source/ root@192.168.1.100:/path/to/destination/
# 排除某些文件同步
rsync -avz --exclude '*.log' --exclude 'temp/' /path/to/source/ /path/to/destination/
# 删除目标目录中源目录没有的文件(保持完全同步)
rsync -avz --delete /path/to/source/ /path/to/destination/
# 限制带宽为 1000 KB/s
rsync -avz --bwlimit=1000 /path/to/source/ /path/to/destination/iperf3
iperf3 是一个网络性能测试工具,用于测量 TCP/UDP 带宽质量。
基本语法:
Bash
iperf3 [选项] [目标主机]常用选项:
| 选项 | 说明 |
|---|---|
-s | 服务器模式 |
-c | 客户端模式,指定服务器地址 |
-p | 指定端口号(默认 5201) |
-i | 设置报告间隔时间(秒) |
-t | 设置测试持续时间(秒) |
-u | 使用 UDP 协议(默认 TCP) |
-b | 设置目标带宽(仅 UDP) |
-w | 设置 TCP 窗口大小 |
-P | 设置并行线程数 |
-R | 反向测试(服务器发送,客户端接收) |
-4, -6 | 仅使用 IPv4/IPv6 |
示例:
Bash
# 服务器端监听
iperf3 -s
# 客户端连接测试
iperf3 -c 192.168.1.100
# 指定测试时长和报告间隔
iperf3 -c server.example.com -t 30 -i 2
# UDP 测试并设置带宽
iperf3 -c server.example.com -u -b 100M
# 多线程并行测试
iperf3 -c server.example.com -P 4
# 反向测试(测试下载速度)
iperf3 -c server.example.com -R提示
默认情况下 iperf3 测试的不是从服务器到客户端的下载速度,而是 Upload 测试(客户端上传给服务器)。
命令别名
查看已定义的别名
Bash
$ alias
alias ls='ls --color=auto'添加 lsc 命令别名
以添加 lsc 命令别名(LC_COLLATE=C ls)解决文件排序 “异常” 问题为例。
在 Debian 12(默认使用 en_US.UTF-8,可以通过 locale | grep LC_COLLATE 命令查看)下,文件系统的排序(Collation)基于 Unicode Collation Algorithm,受 LC_COLLATE 影响。标点符号如 -(连字符,ASCII 45)、.(点,ASCII 46)和 _(下划线,ASCII 95)在主要级别(Primary Level)被忽略,这导致有效排序键仅考虑字母数字字符。例如:
30-xxx的有效键 ≈30xxx30.5-xx的有效键 ≈305xx30_5-xx的有效键 ≈305xx
由于 305xx 在字符串比较中通常小于 30xxx(假设 xxx 以字母开头,如 x 的 ASCII 120 > '5' 的 53),因此 30.5-xx、30_5-xx 排到 30-xxx 前面。这不是 Bug,而是 locale 的字典式排序规则(忽略标点以模拟自然语言顺序)。
检查
~/.bashrc是否包含类似如下的命令行:Bash$ cat ~/.bashrc # ... if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi # ...1
2
3
4
5
6如果有则执行步骤 2,否则执行步骤 3。
添加
lsc命令别名到~/.bash_aliasesBashecho "alias lsc='LC_COLLATE=C ls --color=auto'" >> ~/.bash_aliases && source ~/.bash_aliases添加
lsc命令别名到~/.bashrcBashecho "alias lsc='LC_COLLATE=C ls --color=auto'" >> ~/.bashrc && source ~/.bashrc
服务器管理
时区
获取时区
Bash
timezone=$(timedatectl show -p Timezone --value 2>/dev/null || cat /etc/timezone 2>/dev/null || readlink /etc/localtime | sed 's#.*/zoneinfo/##')这条命令依次尝试三种方式:
timedatectl show -p Timezone --value最准确、最标准的方式(适用于 systemd 系统,Ubuntu、Debian、RHEL、Arch、Fedora 等)。
cat /etc/timezone某些旧版 Debian/Ubuntu 使用此文件直接存储时区。
readlink /etc/localtime+sed对于没有上面两者的系统(如 Alpine、macOS),通过解析
/etc/localtime的符号链接获得时区名。
如果只是想获取与 UTC 的偏移量(而非时区名),可以用:
Bash
offset=$(date +%z) # +0800时区缩写:
Bash
timezone=$(date +%Z) # CST查看可用时区
Bash
$ timedatectl list-timezones | grep -i -E 'china|beijing|shanghai'
Asia/Shanghai如果不清楚对应地区可用的时区有哪些,则可以使用 tzselect 交互式命令来帮助选择时区。注意,tzselect 命令只是帮助选择时区并将其显示出来,它实际并不会生效。
修改时区
可以在使用 systemd 的 Linux 上使用 timedatectl 命令来设置或修改时区。
首先使用
timedatectl命令查看当前系统时区;然后使用
sudo timedatectl set-timezone yourtimezone命令来修改系统时区:例如,将系统时区设置为东八区:
Bash$ sudo timedatectl set-timezone Asia/Shanghai
如果系统上没有 timedatectl 命令,也可以通过修改链接文件 /etc/localtime 到 /usr/share/zoneinfo 目录下的时区文件来修改时区。例如:
Bash
$ sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime将系统时区设置为东八区。
磁盘管理
查看磁盘使用情况
查看分区整体使用情况
Bash$ df -hT --exclude-type=tmpfs --exclude-type=devtmpfs --exclude-type=overlay Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 ext4 24G 14G 9.1G 60% /参数说明:
-h:人类可读格式(human-readable),以 GB、MB 显示;-T:显示文件系统类型(如 ext4, xfs, btrfs);-i:查看 inode 使用情况(有时空间没满但 inode 耗尽)。
查看某个目录空间占用情况
Bashdu -ahx / --max-depth=1 --exclude=/proc --exclude=/sys --threshold=100M | sort -hr | head -20参数 说明 /从根目录开始统计 -a,--all显示所有文件和目录的大小(不只是目录), du默认只显示目录-h,--human-readable以人类可读的格式显示大小(如 1.2G、850M、15K 等),而不是字节数 -x,--one-file-system只统计当前文件系统(避免统计挂载的别的分区,如 /mnt、/media等)--max-depth=1只显示一级子目录和文件的大小 --exclude=/proc排除 /proc虚拟文件系统--threshold=100M只显示大于等于 100MB 的项目 sort -hr按人类可读格式逆序排序
systemd 服务
查看所有 systemd 服务
Bashsystemctl list-unit-files --type=service运行中的服务
Bashsystemctl list-units --type=service --state=runninglist-units与list-unit-files对比项目 list-unit-fileslist-units显示内容 已安装的 unit 文件(配置) 正在运行或加载的 unit(状态) 数据源 文件系统(systemd unit 文件) systemd 内存中的运行状态 是否显示 inactive 单元 √(只要安装了就显示) ×(默认只显示加载过的) 是否显示未安装但已运行的实例 × √ 常用于 查看启用/禁用状态 查看当前系统运行状态
Bash 脚本
获取当前脚本所在的目录
Bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"信息
BASH_SOURCE 是 Bash 提供的一个内置数组变量,它记录了当前执行的 Bash 脚本的文件名(含路径),即使脚本是被 source 进来的,也能正确反映它的真实位置。