概述常用与进阶 Linux 命令。

提示:本文示例默认使用 Bash。如果你的默认 shell 不是 Bash,可运行 echo $SHELL 查看并酌情调整语法。

1. 入门命令速查

1.1 导航与查看

# 位置与导航
pwd                       # 显示当前目录
ls -lah                   # 列出文件(含隐藏、易读大小)
cd /path/to/dir           # 进入目录
cd -                      # 在上一次与当前目录间切换

# 查看文件内容
cat file.txt              # 小文件直接查看
less -N file.txt          # 分页查看,N 显示行号(q 退出,/ 搜索)
head -n 20 file.txt       # 查看前 20 行
tail -n 50 -f app.log     # 持续查看日志尾部(Ctrl-C 退出)

1.2 文件与目录

touch a.txt                              # 创建空文件或更新时间戳
mkdir -p data/raw                        # 递归创建目录
cp -r src/ dst/                          # 复制目录
mv old.txt new.txt                       # 重命名/移动
rm -rf tmp/                              # 小心!递归删除目录

# 安全提示:删除前先 ls 确认路径;生产环境可用 rm -ri 进行交互确认

1.3 搜索与文本处理

grep -nri "keyword" ./                   # 递归搜索(忽略大小写、显示行号)
grep -R --include='*.log' "ERROR" logs/  # 限定后缀
wc -l access.log                         # 统计行数
sort -u domains.txt                      # 排序并去重
uniq -c ip.txt | sort -nr | head         # 统计重复次数并按频次排序
cut -d, -f1,3 data.csv                   # 取第 1、3 列(逗号分隔)
tr -d '\r' < file.txt > file.unix.txt    # 去除 Windows 回车

1.4 权限与用户

ls -l                      # 查看权限 rwx(u/g/o)
chmod u+x run.sh           # 给用户添加可执行
chmod -R 640 conf/         # 递归设置权限
sudo chown -R user:group /srv/app   # 递归调整属主/组
whoami && id               # 当前用户与组信息

1.5 压缩打包

tar -czvf app.tar.gz app/          # 打包并压缩
tar -xzvf app.tar.gz               # 解压
zip -r logs.zip logs/              # 生成 zip
unzip logs.zip -d ./logs_out       # 解压 zip

1.6 网络与下载

ping -c 4 example.com              # 连通性测试(Windows 用 ping -n 4)
curl -I https://example.com        # 查看响应头
wget -c https://host/file.iso      # 断点续传
ssh user@host                      # 远程登录
scp file user@host:/path/          # 上传文件
scp -r dir user@host:/path/        # 上传目录
# rsync 更高效:
rsync -avzP dir/ user@host:/path/  # 增量同步 + 进度

1.7 系统状态与进程

date && uptime                 # 时间与负载
uname -a                       # 内核/系统信息
df -h                          # 磁盘占用
du -sh * | sort -h             # 当前目录各项大小
free -h                        # 内存概览
top                            # 交互式进程(q 退出)
ps aux | grep python           # 进程查询
kill 12345                     # 发送 SIGTERM(优雅退出)
kill -9 12345                  # 强制退出(慎用)

2. 进阶技巧与组合

2.1 重定向、管道与日志

cmd > out.txt                  # 覆盖写入
cmd >> out.txt                 # 追加写入
cmd 2> err.txt                 # 仅错误输出
cmd > all.txt 2>&1             # 合并标准输出和错误
long_cmd | tee -a run.log      # 同时输出终端并追加到日志

2.2 find 与 xargs

# 查找 100MB 以上的 .log 并交互删除
find . -type f -name "*.log" -size +100M -print0 | xargs -0 -I{} rm -i {}

# 批量替换文本(GNU sed)
find . -type f -name "*.conf" -print0 | xargs -0 sed -i 's/DEBUG/INFO/g'

2.3 Bash 通配与花括号展开

echo file{1..3}.txt         # file1.txt file2.txt file3.txt
echo {dev,stg,prod}-app     # dev-app stg-app prod-app

# 启用 ** 递归通配(当前会话)
shopt -s globstar
ls **/*.md

2.4 grep/awk/sed 常用片段

# 统计 Nginx 状态码分布(第 9 列假设为状态码)
awk '{cnt[$9]++} END{for (c in cnt) printf "%s %d\n", c, cnt[c] | "sort -n"}' access.log

# 取第 2 列求和(逗号分隔)
awk -F, '{s+=$2} END{print s}' data.csv

# 区间取行与就地替换(GNU sed)
sed -n '1,50p' config.yml
sed -i 's/timeout: .*/timeout: 30s/' config.yml

2.5 作业控制与长期任务

# Ctrl-Z 暂停前台进程 -> 进入后台作业
jobs                 # 查看作业
bg %1                # 将作业 1 放到后台继续
fg %1                # 拉回前台

# 不依赖终端的后台运行(忽略 SIGHUP)
nohup long_cmd > run.out 2>&1 &
disown -h %1        # 脱离当前 shell 管理(可选)

2.6 定时任务与服务

crontab -e                               # 编辑当前用户定时任务
# ┌ 分钟(0-59)
# │ ┌ 小时(0-23)
# │ │ ┌ 日(1-31)
# │ │ │ ┌ 月(1-12)
# │ │ │ │ ┌ 周(0-7, 周日为 0 或 7)
# │ │ │ │ │
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Systemd 服务管理(root/含 sudo)
sudo systemctl status nginx
sudo systemctl enable --now nginx
journalctl -u nginx -f

2.7 包管理(按发行版)

# Debian/Ubuntu
sudo apt update && sudo apt install -y htop git curl

# CentOS/RHEL
sudo yum install -y htop git curl      # 或 dnf

# Arch
sudo pacman -Syu htop git curl

3. 使用 screen 让任务不断线(SSH 断开也不影响)

在远程服务器上执行长任务(训练、备份、抓取、编译等),推荐使用 screen 创建“可分离的会话”。即使 SSH 断开,任务也会继续在后台运行。

3.1 安装

# Debian/Ubuntu
sudo apt update && sudo apt install -y screen

# CentOS/RHEL
sudo yum install -y screen   # 或 dnf install -y screen

3.2 核心操作(速查)

  • 创建带名称的会话:
screen -S 名称
  • 列出所有会话:
screen -ls
  • 恢复会话(附着):
screen -r 会话ID或名称
  • 暂时退出(分离,不中断任务):按键 Ctrl + a,然后按 d(显示 [detached])

  • 彻底退出会话:在会话内输入 exit 或按 Ctrl + d;也可从外部结束:

screen -S 名称 -X quit

3.3 常用快捷键(在 screen 内,先按 Ctrl+a 再按后续键)

  • c:新建窗口(window)
  • n / p:下一个/上一个窗口
  • “:列出并切换窗口
  • A:重命名当前窗口
  • [:进入复制/滚动模式(上下翻页查看历史,Esc 退出)
  • H:开启/关闭当前窗口日志(会生成 screenlog.N)
  • S:水平分屏; :垂直分屏;Tab 在区域之间切换;X 关闭分屏区域
  • ?:显示帮助

可在 ~/.screenrc 调整默认滚动缓冲、日志路径、状态栏等。

3.4 一次性启动并后台运行命令

# 方式一:创建会话、直接在后台跑命令
screen -dmS job_name bash -c 'python train.py --epochs 50 >> train.log 2>&1; exec bash'

# 方式二:进入会话后手动执行命令,再分离
screen -S job_name
# ...(运行你的命令)...
# Ctrl-a d 分离

说明:-d -m 表示不附着地启动;-S 指定会话名;使用 bash -c 可串联命令与日志重定向。

3.5 日志与排错

# 在 screen 内临时记录当前窗口日志(再次按 H 关闭)
Ctrl-a H

# 启动即开启日志并指定文件
screen -L -Logfile /var/log/myjob.log -S myjob

# 清理无效会话(僵尸/遗留):
screen -wipe

3.6 实战流程示例

# 1) 连接服务器并创建命名会话
screen -S nightly_backup

# 2) 执行长期任务
/usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# 3) 分离(不中断任务)
Ctrl-a d

# 4) 断线或稍后重新连接
ssh user@server
screen -r nightly_backup

# 5) 任务完成后退出
exit   # 或 Ctrl-d

小贴士:如遇“有多个匹配会话”提示,可先 screen -ls 获取具体 ID,再 screen -r 1234.pts-0.server

相关工具:tmux 具备更强的分窗与状态栏能力;若已有习惯,可二选一即可。

4. 常见坑与最佳实践

  • 删除前先确认:rm -rf 前务必 ls 验证路径,或使用 rm -ri 交互删除。
  • sudo 与重定向:echo "a" >> /etc/file 这种重定向在当前 shell 执行,需:sudo sh -c 'echo "a" >> /etc/file'
  • 环境与 PATH:把常用别名写入 ~/.bashrc,如 alias ll='ls -alF';修改后 source ~/.bashrc 生效。
  • 区分发行版命令差异:包管理器(apt/yum/dnf/pacman)、服务名与配置路径可能不同。
  • 性能与本地化:批量文本处理可加 LC_ALL=C 提升速度(按需使用)。

5. 参考与速查

  • man 手册:man cmdcmd --help
  • Bash 手册与指南:GNU Bash Reference Manual
  • 屏幕会话:man screen,或查看 ~/.screenrc 示例

如需补充 tmuxzsh、正则表达式进阶或更系统的日志/监控方案,欢迎在评论区反馈。