刚接触Linux时,面对黑底白字的终端窗口,很多新手都会感到无从下手。但当你掌握了基础命令后,这个看似复杂的系统会变得无比亲切。Linux命令就像工具箱里的各种工具,每个都有其特定用途——文件操作相当于螺丝刀和扳手,系统管理如同万用表,而网络工具则像测线仪。我至今记得第一次用ls命令成功列出目录内容时的兴奋感,这种通过命令行与系统直接对话的体验,是图形界面无法替代的。
这些基础命令之所以被称为"必知必会",是因为它们构成了Linux系统操作的DNA。无论是简单的文件浏览,还是复杂的系统维护,都建立在这些命令的组合使用之上。根据我在运维岗位八年的经验,熟练掌握这200个核心命令,可以解决日常工作中90%的问题。特别当服务器出现故障需要紧急处理时,命令行往往是唯一的救命稻草。
提示:学习Linux命令时,建议先掌握20个最高频命令(如ls/cd/mkdir等),再逐步扩展到其他领域。不要试图一次性记住所有命令参数,实际使用中通过
--help查看帮助才是正确姿势。
ls命令是大多数Linux用户第一个接触的命令,但它的深度远超表面所见。除了基本的ls -l显示详细信息外,结合-h参数可以人性化显示文件大小(如将2048字节显示为2K),-t按修改时间排序,-r反向排序。我常用ls -lhtr组合查看最近修改的大文件:
bash复制$ ls -lhtr /var/log
total 1.2G
-rw-r--r-- 1 root root 12K Mar 20 10:00 boot.log
-rw-r--r-- 1 root root 1.1G Mar 21 09:00 syslog
cd命令的快捷用法能显著提升效率:cd -返回上一个目录,cd ~直接回家目录。而pwd(Print Working Directory)在编写脚本时尤为重要,它能确保操作路径的准确性。
创建、复制、移动、删除是文件操作的四大基础动作。touch不仅能创建空文件,更常用于更新时间戳(比如触发某些监控脚本)。cp命令的-i(交互模式)和-u(仅更新较新文件)参数可以防止意外覆盖:
bash复制$ cp -iu source.txt backup/ # 只有当source.txt更新时才复制
mv命令的原子特性使其成为重命名的首选工具,而rm则是危险的"瑞士军刀"——永远记住先ls确认文件列表,再执行删除。我曾见过同事误用rm -rf /导致系统崩溃的惨剧,所以现在养成了先echo预览删除列表的习惯:
bash复制$ echo rm -r /path/to/files/*.tmp # 先打印确认删除内容
cat适合查看小文件,但面对大日志文件时less才是明智之选(支持搜索和翻页)。head和tail这对组合是日志分析的利器,特别是tail -f实时追踪日志更新:
bash复制$ tail -f /var/log/nginx/access.log # 实时监控网站访问情况
grep的强大无需赘述,但很多人不知道-C 3可以显示匹配行的前后3行上下文,-v反向选择不匹配的行。结合正则表达式,它能从海量数据中精准定位信息:
bash复制$ grep -C 3 "error" system.log | grep -v "known_warning" # 过滤已知警告的真实错误
ps命令的参数风格有BSD和UNIX两种格式,新手常被搞混。记住ps aux(BSD风格)查看所有用户进程,ps -ef(UNIX风格)显示完整格式。top的交互模式中,按"M"按内存排序,"P"按CPU排序,而htop提供了更直观的颜色和树状显示。
kill命令的信号参数决定终止方式:-9(SIGKILL)是强制终止的最后手段,而-15(SIGTERM)允许进程优雅退出。我曾遇到Java应用被kill -9后产生僵尸进程的情况,所以现在总是先尝试kill -15。
free -h以人类可读格式显示内存使用,重点关注available而非free值。df -h查看磁盘空间时,-T参数能显示文件系统类型(区分ext4/nfs等)。iostat -x 2每2秒刷新一次磁盘IO统计,对排查性能瓶颈特别有用。
netstat虽然逐渐被ss取代,但其-tulnp组合仍是查看网络连接的经典方式。而lsof才是真正的"终极武器"——它可以列出被进程打开的所有文件,包括网络连接:
bash复制$ lsof -i :8080 # 查看谁在占用8080端口
useradd与adduser的区别常让人困惑:前者是底层工具,后者是交互式脚本。创建用户时记得用-m创建家目录,-s指定shell(如/bin/bash)。passwd的-e参数强制用户下次登录修改密码,适合临时账户。
chmod的数字模式(755)和符号模式(u+x)各有用处,而chown改变文件所有者时,-R参数递归处理子目录。权限问题导致的"Permission denied"错误,80%可以通过以下命令解决:
bash复制$ sudo chown -R user:group /path # 递归修改所有者
$ sudo chmod -R 755 /path # 递归设置权限
ping的-c 4限制发送4个包后停止,-i 0.2设置0.2秒间隔。traceroute(或tracepath)显示数据包路径,对网络延迟诊断至关重要。而curl早已超越下载工具范畴,成为API测试的瑞士军刀:
bash复制$ curl -sS "https://api.example.com/data" | jq . # 获取并格式化JSON响应
wget的-c支持断点续传,-b后台下载大文件。scp安全传输文件时,-P指定非标准端口,-r递归复制目录。我常用这个组合备份远程服务器:
bash复制$ scp -P 2222 -r user@remote:/var/log /local/backup # 通过非标准端口复制日志
Debian系的apt与RHEL系的yum/dnf命令对比:
| 操作 | Debian/Ubuntu (apt) | RHEL/CentOS (yum/dnf) |
|---|---|---|
| 更新索引 | sudo apt update |
sudo yum check-update |
| 安装软件 | sudo apt install nginx |
sudo yum install nginx |
| 删除软件 | sudo apt remove nginx |
sudo yum remove nginx |
| 搜索软件 | apt search keyword |
yum search keyword |
dpkg -l列出所有已安装的.deb包,而rpm -qa查询RPM包。遇到依赖问题时,aptitude比apt提供更智能的解决方案。
awk的字段处理能力令人惊叹,这个单行命令可以统计Nginx日志中每个IP的访问次数:
bash复制$ awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
sed不仅用于替换文本(s/old/new/g),还能配合正则表达式批量修改配置文件。我常用这个命令清理CSV文件中的空行:
bash复制$ sed -i '/^\s*$/d' data.csv # 直接修改原文件
cut按列提取数据时,-d指定分隔符(默认为tab),-f选择字段。处理/etc/passwd时特别有用:
bash复制$ cut -d: -f1,6 /etc/passwd # 显示用户名和家目录
tar的参数顺序很重要:-c创建,-x解压,-v显示过程,-f指定文件名。常用组合:
bash复制$ tar -czvf backup.tar.gz /path # 创建gzip压缩包
$ tar -xzvf backup.tar.gz -C /target # 解压到指定目录
zip的-r递归处理目录,-e加密压缩包。而unzip的-l参数可以在不解压情况下查看内容:
bash复制$ unzip -l archive.zip | grep "keyword" # 查找特定文件
journalctl是systemd系统的日志神器,-u按服务筛选,--since限定时间范围:
bash复制$ journalctl -u nginx --since "2023-03-01" --until "2023-03-02"
dmesg查看内核消息,-T显示人类可读时间,-l按日志级别过滤。排查硬件问题时不可或缺:
bash复制$ dmesg -T | grep -i "error" # 查找内核错误
crontab -e编辑用户级计划任务时,时间字段的格式常被弄错。记住这个助记符:
code复制* * * * * command
| | | | |
| | | | +-- 星期几 (0 - 6) (周日=0)
| | | +---- 月份 (1 - 12)
| | +------ 日 (1 - 31)
| +-------- 小时 (0 - 23)
+---------- 分钟 (0 - 59)
备份任务建议放在系统级目录/etc/cron.d/,而非用户crontab。我习惯在脚本开头设置环境变量:
bash复制#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
env查看所有环境变量,而export设置的环境变量仅对当前shell有效。要使修改永久生效,需要写入~/.bashrc或/etc/profile。调试时常用:
bash复制$ export DEBUG=1 # 临时启用调试模式
$ env | grep PATH # 检查路径设置
which和whereis定位命令位置,而type还能识别别名和函数。当命令行为异常时,先用这个检查:
bash复制$ type -a ls # 查看ls的所有定义
ssh-keygen生成密钥对时,-t指定类型(如ed25519),-f指定保存路径。将公钥上传到服务器有三种方式:
bash复制$ ssh-copy-id user@server # 最简单的方式
$ cat ~/.ssh/id_rsa.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" # 手动方式
ssh-agent管理密钥密码,避免每次连接都输入密码。典型工作流:
bash复制$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_ed25519 # 添加密钥到agent
ufw(Uncomplicated Firewall)简化了iptables操作,基本命令包括:
bash复制$ sudo ufw allow 22/tcp # 允许SSH
$ sudo ufw enable # 启用防火墙
$ sudo ufw status numbered # 带编号的规则列表
对于更复杂的规则,iptables仍是终极工具。这个命令允许已建立的连接:
bash复制$ sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sysctl查看和修改内核参数,-a显示所有参数。常见的调优项包括:
bash复制$ sudo sysctl -w vm.swappiness=10 # 减少交换分区使用
$ sudo sysctl -w net.ipv4.tcp_fin_timeout=30 # 缩短TCP等待时间
永久修改需要写入/etc/sysctl.conf。我通常会调整这些默认值:
code复制# /etc/sysctl.conf
fs.file-max = 2097152
net.core.somaxconn = 65535
vmstat 1实时监控内存和swap使用情况。当发现si(swap in)和so(swap out)频繁变动时,说明内存不足。swapoff -a可以临时禁用swap,但需确保有足够物理内存。
使用dd创建交换文件比分区更灵活:
bash复制$ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 # 创建4GB交换文件
$ sudo mkswap /swapfile && sudo swapon /swapfile
统计当前目录下各种文件类型的数量:
bash复制$ find . -type f | awk -F. '!a[$NF]++{print $NF}' | xargs -I {} sh -c 'echo -n "{}: "; find . -type f -name "*.{}" | wc -l'
监控最耗CPU的5个进程:
bash复制$ watch -n 1 'ps -eo pid,user,%cpu,command --sort=-%cpu | head -6'
备份MySQL数据库并保留最近7天的备份:
bash复制#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d)
MYSQL_USER="backup"
MYSQL_PASS="password"
mkdir -p $BACKUP_DIR
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases | gzip > "$BACKUP_DIR/all-dbs-$DATE.sql.gz"
# 清理旧备份
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete
几乎所有命令都支持--help参数,而更详细的手册则需要man命令。但man手册有时过于晦涩,这时tldr(Too Long; Didn't Read)项目提供了简洁示例:
bash复制$ tldr tar # 显示tar的常用用法示例
info命令是GNU项目的超文本手册,比man更结构化。对于bash内置命令(如cd),需要使用help:
bash复制$ help cd # 查看bash内置命令帮助
建议每天掌握2-3个新命令,并在实际工作中应用。遇到问题时,按这个流程查找解决方案:
--helpman手册我习惯将常用命令保存到~/.bash_aliases中,例如:
bash复制# 查看目录大小
alias dud='du -d 1 -h | sort -h'
# 快速查找历史命令
alias gh='history | grep'