写在前面
本文整理了日常开发和运维中最常用的 Linux 命令,涵盖参数说明与实际示例,方便随时查阅。每个命令都力求实用,避免罗列用不到的冷门参数。
一、文件与目录
1.1 ls — 列出目录内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 列出当前目录文件
ls
# 显示详细信息(权限、大小、时间)
ls -l
# 显示隐藏文件(以 . 开头的文件)
ls -a
# 按时间倒序排列(最新的在前)
ls -lt
# 按文件大小倒序排列
ls -lS
# 人类可读的文件大小(KB、MB、GB)
ls -lh
# 只显示目录名,不显示内容
ls -d */
# 递归列出所有子目录
ls -R
|
1.2 cd — 切换目录
1
2
3
4
5
6
7
8
9
10
11
12
|
# 切换到指定目录
cd /home/user/project
# 切换到上一级目录
cd ..
# 切换到用户主目录
cd ~
cd
# 切换到上一次所在的目录
cd -
|
1.3 pwd — 显示当前目录
1.4 mkdir — 创建目录
1
2
3
4
5
6
7
8
|
# 创建目录
mkdir my-folder
# 递归创建多级目录
mkdir -p project/src/main/java
# 创建时指定权限
mkdir -m 755 my-folder
|
1.5 cp — 复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 复制文件
cp file.txt backup.txt
# 复制目录(递归)
cp -r my-folder my-folder-backup
# 复制前确认是否覆盖
cp -i file.txt /target/
# 保持文件属性(权限、时间戳等)
cp -p file.txt /target/
# 显示复制过程
cp -rv my-folder /target/
|
1.6 mv — 移动/重命名
1
2
3
4
5
6
7
8
9
10
11
|
# 重命名文件
mv old-name.txt new-name.txt
# 移动文件到目录
mv file.txt /home/user/
# 移动目录
mv my-folder /home/user/
# 移动前确认是否覆盖
mv -i file.txt /target/
|
1.7 rm — 删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 删除文件
rm file.txt
# 删除前确认
rm -i file.txt
# 强制删除(不提示确认)
rm -f file.txt
# 递归删除目录及其内容
rm -r my-folder
# 强制递归删除目录(谨慎使用)
rm -rf my-folder
|
注意:rm -rf 不可恢复,使用前确认路径正确。千万不要执行 rm -rf /。
1.8 touch — 创建空文件/更新时间戳
1
2
3
4
5
6
7
8
|
# 创建空文件
touch newfile.txt
# 同时创建多个文件
touch file1.txt file2.txt file3.txt
# 更新文件的修改时间(文件已存在时不改变内容)
touch existing-file.txt
|
1.9 ln — 创建链接
1
2
3
4
5
6
7
8
|
# 创建软链接(类似快捷方式)
ln -s /usr/local/java/jdk-17 java17
# 创建硬链接(共享同一个 inode)
ln original.txt hardlink.txt
# 查看链接指向
ls -l java17
|
软链接可以跨文件系统,删源文件后链接失效;硬链接不能跨文件系统,删源文件后仍可访问。
1.10 find — 查找文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 按文件名查找
find /home -name "*.log"
# 按文件名查找(不区分大小写)
find /home -iname "*.JPG"
# 按类型查找(f=文件,d=目录,l=链接)
find /var -type f -name "*.conf"
find /home -type d -name "project"
# 按大小查找(大于100MB的文件)
find / -type f -size +100M
# 按修改时间查找(7天内修改过的文件)
find /home -type f -mtime -7
# 按权限查找
find /home -type f -perm 755
# 查找并执行操作(删除7天前的日志)
find /var/log -name "*.log" -mtime +7 -delete
# 查找并执行命令(对结果执行 ls -l)
find /home -name "*.txt" -exec ls -l {} \;
|
1.11 tree — 树形显示目录结构
1
2
3
4
5
6
7
8
9
10
11
|
# 显示目录树
tree
# 只显示目录,不显示文件
tree -d
# 指定显示深度
tree -L 2
# 显示文件大小
tree -h
|
二、文件查看与编辑
2.1 cat — 查看文件内容
1
2
3
4
5
6
7
8
9
10
11
|
# 查看文件全部内容
cat file.txt
# 显示行号
cat -n file.txt
# 合并多个文件
cat file1.txt file2.txt > merged.txt
# 追加内容到文件
cat file1.txt >> file2.txt
|
2.2 head — 查看文件开头
1
2
3
4
5
6
7
8
|
# 查看前10行(默认)
head file.txt
# 查看前20行
head -n 20 file.txt
# 查看前1KB内容
head -c 1024 file.txt
|
2.3 tail — 查看文件末尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看最后10行(默认)
tail file.txt
# 查看最后50行
tail -n 50 file.txt
# 实时查看日志(最常用)
tail -f app.log
# 实时查看并显示行号
tail -fn 100 app.log
# 从第100行开始显示
tail -n +100 file.txt
|
2.4 less — 分页查看
1
2
3
4
5
|
# 分页查看大文件
less large-file.log
# 带行号查看
less -N file.txt
|
less 内操作:空格/b 翻页,/ 搜索,q 退出,G 跳到末尾,gg 跳到开头。
2.5 grep — 文本搜索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 搜索包含关键词的行
grep "ERROR" app.log
# 不区分大小写搜索
grep -i "error" app.log
# 显示行号
grep -n "ERROR" app.log
# 显示匹配行的前后各3行(上下文)
grep -C 3 "ERROR" app.log
# 只显示匹配的文件名
grep -l "ERROR" *.log
# 递归搜索目录下所有文件
grep -r "ERROR" /var/log/
# 反向搜索(不包含关键词的行)
grep -v "DEBUG" app.log
# 统计匹配行数
grep -c "ERROR" app.log
# 使用正则表达式
grep -E "ERROR|WARN" app.log
# 只匹配完整单词
grep -w "error" app.log
|
2.6 wc — 统计
1
2
3
4
5
6
7
8
9
10
11
|
# 统计行数
wc -l file.txt
# 统计单词数
wc -w file.txt
# 统计字节数
wc -c file.txt
# 统计文件行数(配合 find 使用)
find . -name "*.java" | xargs wc -l
|
2.7 sort — 排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 默认按字母升序
sort file.txt
# 按数字大小排序
sort -n numbers.txt
# 倒序排列
sort -r file.txt
# 按第2列排序
sort -k2 file.txt
# 去重排序
sort -u file.txt
|
2.8 uniq — 去重
1
2
3
4
5
6
7
8
9
10
11
|
# 去除连续重复行(需先排序)
sort file.txt | uniq
# 统计每行出现的次数
sort file.txt | uniq -c
# 只显示重复的行
sort file.txt | uniq -d
# 只显示不重复的行
sort file.txt | uniq -u
|
2.9 awk — 文本处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 打印第1列
awk '{print $1}' file.txt
# 打印第1列和第3列
awk '{print $1, $3}' file.txt
# 指定分隔符
awk -F: '{print $1}' /etc/passwd
# 按条件过滤(第3列大于100)
awk '$3 > 100 {print $0}' file.txt
# 统计文件总行数
awk 'END {print NR}' file.txt
|
2.10 sed — 流编辑器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 替换每行第一个匹配
sed 's/old/new/' file.txt
# 替换所有匹配
sed 's/old/new/g' file.txt
# 删除匹配行
sed '/^#/d' file.txt
# 显示指定行(第10到20行)
sed -n '10,20p' file.txt
# 直接修改文件(不加 -i 只输出到终端)
sed -i 's/old/new/g' file.txt
|
三、权限与用户
3.1 chmod — 修改权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 给所有者添加执行权限
chmod u+x script.sh
# 设置具体权限(所有者读写执行,组读执行,其他人读执行)
chmod 755 script.sh
# 递归修改目录权限
chmod -R 755 /var/www/
# 常用权限值
# 755 — 所有者全权限,其他读和执行
# 644 — 所有者读写,其他只读
# 600 — 只有所有者能读写
# 777 — 所有人全权限(不推荐在生产环境使用)
|
3.2 chown — 修改所有者
1
2
3
4
5
6
7
8
|
# 修改文件所有者
chown user file.txt
# 修改文件所有者和所属组
chown user:group file.txt
# 递归修改目录
chown -R user:group /var/www/
|
3.3 sudo — 以管理员权限执行
1
2
3
4
5
6
7
8
9
10
11
|
# 以 root 权限执行命令
sudo command
# 以指定用户执行
sudo -u username command
# 切换到 root 用户
sudo su -
# 编辑需要 root 权限的文件
sudo vim /etc/nginx/nginx.conf
|
3.4 用户管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 创建用户
useradd username
# 创建用户并创建主目录
useradd -m username
# 设置用户密码
passwd username
# 删除用户
userdel username
# 删除用户及其主目录
userdel -r username
# 查看当前用户
whoami
# 查看用户信息
id username
# 切换用户
su - username
|
3.5 用户组管理
1
2
3
4
5
6
7
8
9
10
11
|
# 创建用户组
groupadd devgroup
# 将用户添加到组
usermod -aG devgroup username
# 查看用户所属的组
groups username
# 删除用户组
groupdel devgroup
|
四、进程管理
4.1 ps — 查看进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 查看当前终端的进程
ps
# 查看所有进程(常用)
ps aux
# 查看所有进程(BSD 格式,更可读)
ps -ef
# 查找指定进程
ps aux | grep nginx
# 按内存使用排序(取前10)
ps aux --sort=-%mem | head -10
# 按CPU使用排序(取前10)
ps aux --sort=-%cpu | head -10
# 查看进程树
ps -ef --forest
|
4.2 top / htop — 实时监控
1
2
3
4
5
6
7
8
9
10
|
# 实时查看进程资源占用
top
# 按内存排序(进入 top 后按 M)
# 按CPU排序(进入 top 后按 P)
# 按进程ID排序(进入 top 后按 N)
# 退出(按 q)
# htop 是增强版(需安装),支持鼠标和快捷键
htop
|
4.3 kill — 终止进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 正常终止进程
kill 12345
# 强制终止进程
kill -9 12345
# 按名称终止进程
killall nginx
# 按名称模糊终止
pkill -f "java -jar app"
# 查看所有信号
kill -l
|
常用信号:15 (SIGTERM) 正常终止,9 (SIGKILL) 强制终止,1 (SIGHUP) 重新加载配置。
4.4 nohup — 后台运行
1
2
3
4
5
6
7
8
9
10
11
|
# 后台运行,输出到 nohup.out
nohup java -jar app.jar &
# 指定日志输出文件
nohup java -jar app.jar > app.log 2>&1 &
# 查看后台任务
jobs
# 将后台任务调到前台
fg %1
|
4.5 systemctl — 服务管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务
sudo systemctl restart nginx
# 重新加载配置(不中断服务)
sudo systemctl reload nginx
# 查看服务状态
sudo systemctl status nginx
# 设置开机自启
sudo systemctl enable nginx
# 取消开机自启
sudo systemctl disable nginx
# 查看所有已启动的服务
sudo systemctl list-units --type=service --state=running
|
五、网络
5.1 ip / ifconfig — 查看网络信息
1
2
3
4
5
6
7
8
9
|
# 查看所有网卡IP地址
ip addr
ip a
# 查看指定网卡
ip addr show eth0
# 老命令(部分系统仍可用)
ifconfig
|
5.2 ping — 测试网络连通性
1
2
3
4
5
6
7
8
|
# 测试是否可达
ping 8.8.8.8
# 指定次数(发4个包后停止)
ping -c 4 baidu.com
# 指定间隔(每2秒发一次)
ping -i 2 baidu.com
|
5.3 curl — HTTP 请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# GET 请求
curl https://example.com
# 只显示响应头
curl -I https://example.com
# POST 请求(JSON)
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "test"}'
# 下载文件
curl -O https://example.com/file.tar.gz
# 指定超时时间(秒)
curl --connect-timeout 5 --max-time 10 https://example.com
# 显示请求耗时
curl -o /dev/null -s -w "time_total: %{time_total}s\n" https://example.com
# 带认证
curl -u username:password https://api.example.com
|
5.4 wget — 下载文件
1
2
3
4
5
6
7
8
9
10
11
|
# 下载文件
wget https://example.com/file.tar.gz
# 指定保存文件名
wget -O myfile.tar.gz https://example.com/file.tar.gz
# 后台下载
wget -b https://example.com/large-file.zip
# 断点续传
wget -c https://example.com/large-file.zip
|
5.5 netstat / ss — 查看端口与连接
1
2
3
4
5
6
7
8
9
10
11
12
|
# 查看所有监听端口
ss -tlnp
# 查看指定端口占用
ss -tlnp | grep 8080
# 查看所有网络连接
ss -an
# 老命令(部分系统仍可用)
netstat -tlnp
netstat -an | grep 8080
|
5.6 nslookup / dig — DNS 查询
1
2
3
4
5
6
7
8
|
# 查询域名解析
nslookup baidu.com
# 查询指定DNS服务器
nslookup baidu.com 8.8.8.8
# 详细DNS查询
dig baidu.com
|
5.7 防火墙(firewalld)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 查看防火墙状态
sudo firewall-cmd --state
# 开放端口
sudo firewall-cmd --add-port=8080/tcp --permanent
# 开放服务
sudo firewall-cmd --add-service=http --permanent
# 重新加载配置
sudo firewall-cmd --reload
# 查看已开放的端口
sudo firewall-cmd --list-ports
# 查看所有规则
sudo firewall-cmd --list-all
|
六、磁盘与内存
6.1 df — 查看磁盘空间
1
2
3
4
5
6
7
8
|
# 查看所有磁盘使用情况
df -h
# 查看指定目录所在磁盘
df -h /home
# 显示文件系统类型
df -T
|
6.2 du — 查看目录大小
1
2
3
4
5
6
7
8
9
10
11
|
# 查看当前目录总大小
du -sh
# 查看各子目录大小
du -sh *
# 查看指定目录大小
du -sh /var/log
# 按大小排序(找出最大的目录)
du -sh * | sort -rh | head -10
|
6.3 free — 查看内存使用
1
2
3
4
5
6
7
8
|
# 查看内存使用(人类可读)
free -h
# 每隔2秒刷新一次
free -h -s 2
# 以MB为单位显示
free -m
|
6.4 mount / umount — 挂载磁盘
1
2
3
4
5
6
7
8
9
10
11
|
# 查看已挂载的磁盘
mount
# 挂载磁盘到目录
sudo mount /dev/sdb1 /data
# 卸载磁盘
sudo umount /data
# 查看可用磁盘
lsblk
|
七、压缩与解压
7.1 tar — 打包与解包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 打包并gzip压缩
tar -czf archive.tar.gz folder/
# 打包并gzip压缩(显示过程)
tar -czvf archive.tar.gz folder/
# 解压 .tar.gz
tar -xzf archive.tar.gz
# 解压到指定目录
tar -xzf archive.tar.gz -C /target/
# 解压 .tar.bz2
tar -xjf archive.tar.bz2
# 只查看压缩包内容(不解压)
tar -tzf archive.tar.gz
# 追加文件到已有包
tar -rf archive.tar newfile.txt
|
参数记忆:-c 创建,-x 解压,-t 查看,-z gzip,-j bzip2,-v 显示过程,-f 指定文件名。
7.2 zip / unzip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 压缩文件
zip archive.zip file1.txt file2.txt
# 压缩目录
zip -r archive.zip my-folder/
# 解压
unzip archive.zip
# 解压到指定目录
unzip archive.zip -d /target/
# 查看压缩包内容
unzip -l archive.zip
|
八、系统信息
8.1 系统基础信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 查看系统版本
cat /etc/os-release
# 查看内核版本
uname -r
# 查看全部系统信息
uname -a
# 查看主机名
hostname
# 查看系统运行时间
uptime
# 查看CPU信息
lscpu
# 或
cat /proc/cpuinfo
# 查看内存信息
cat /proc/meminfo
|
8.2 环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 查看所有环境变量
env
# 查看指定环境变量
echo $PATH
echo $JAVA_HOME
# 设置环境变量(当前会话生效)
export MY_VAR="hello"
# 永久生效(写入配置文件)
echo 'export JAVA_HOME=/usr/local/java/jdk-17' >> ~/.bashrc
source ~/.bashrc
|
九、远程与传输
9.1 ssh — 远程连接
1
2
3
4
5
6
7
8
|
# 连接远程服务器
ssh user@192.168.1.100
# 指定端口
ssh -p 2222 user@192.168.1.100
# 使用密钥登录
ssh -i ~/.ssh/my-key.pem user@192.168.1.100
|
9.2 scp — 远程复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 上传本地文件到远程
scp file.txt user@192.168.1.100:/home/user/
# 上传目录到远程
scp -r my-folder user@192.168.1.100:/home/user/
# 从远程下载文件
scp user@192.168.1.100:/home/user/file.txt ./
# 从远程下载目录
scp -r user@192.168.1.100:/home/user/my-folder ./
# 指定端口
scp -P 2222 file.txt user@192.168.1.100:/home/user/
|
9.3 rsync — 高效同步
1
2
3
4
5
6
7
8
9
10
11
|
# 同步本地目录到远程
rsync -avz my-folder/ user@192.168.1.100:/home/user/my-folder/
# 同步远程目录到本地
rsync -avz user@192.168.1.100:/home/user/my-folder/ ./my-folder/
# 显示传输进度
rsync -avz --progress my-folder/ user@192.168.1.100:/home/user/my-folder/
# 删除目标端多余的文件(保持完全一致)
rsync -avz --delete my-folder/ user@192.168.1.100:/home/user/my-folder/
|
rsync 只传输差异部分,比 scp 快很多,适合大文件和频繁同步。
十、管道与重定向
10.1 管道 |
1
2
3
4
5
6
7
8
9
10
11
|
# 查找进程
ps aux | grep nginx
# 统计日志中ERROR出现次数
grep "ERROR" app.log | wc -l
# 查找并排序
cat file.txt | sort | uniq -c | sort -rn
# 查看占用80端口的进程
ss -tlnp | grep :80
|
10.2 重定向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 输出重定向到文件(覆盖)
echo "hello" > file.txt
# 输出追加重定向
echo "hello" >> file.txt
# 错误输出重定向
command 2> error.log
# 标准输出和错误都重定向
command > all.log 2>&1
# 丢弃所有输出
command > /dev/null 2>&1
# 输入重定向
command < input.txt
|
十一、常用组合命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 查找占用指定端口的进程并终止
ss -tlnp | grep :8080 | awk '{print $7}' | cut -d/ -f1 | xargs kill -9
# 统计代码行数(按文件类型)
find . -name "*.java" | xargs wc -l | tail -1
# 批量杀死匹配名称的进程
ps aux | grep "java -jar" | grep -v grep | awk '{print $2}' | xargs kill -9
# 实时监控日志中的关键词
tail -f app.log | grep --color "ERROR"
# 查找大文件并排序
find / -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh
# 统计 Nginx 访问日志中各 IP 的访问次数(取前10)
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 批量替换文件内容
sed -i 's/old-domain.com/new-domain.com/g' *.conf
|