公司动态
Linux命令行实战教程:从零基础到高效运维的必备技能
大家好我是CSDN的一名技术博主。在日常开发、运维乃至学习过程中无论是部署服务、排查问题还是自动化脚本都绕不开Linux命令行这个强大的工具。很多初学者面对黑漆漆的终端窗口和复杂的命令参数常常感到无从下手。本文旨在为所有希望快速上手Linux命令行的朋友提供一份从零开始、系统全面的实战教程。我们将从最核心、最高频的命令入手结合具体场景和完整示例让你不仅能看懂命令更能理解其背后的逻辑最终能够独立使用命令行完成日常任务。无论你是学生、开发新手还是需要回顾基础的技术人员这篇文章都将是你案头一份实用的参考手册。1. Linux命令行从零开始的认知在深入具体命令之前我们有必要先理解几个核心概念这能帮助你更好地“驾驭”命令行而不是机械地记忆。1.1 什么是Shell与终端我们常说的“Linux命令行”其实是一个组合概念终端 (Terminal)一个提供输入输出界面的程序是你与计算机交互的“窗口”。在图形界面下你打开的“终端模拟器”如GNOME Terminal, Konsole, iTerm2就是终端。Shell运行在终端里的“命令解释器”。它负责接收你输入的命令翻译给操作系统内核执行并将结果返回给你。你可以把Shell看作是你和Linux内核之间的“翻译官”。最常见的Shell是Bash (Bourne Again SHell)它是大多数Linux发行版的默认Shell。本文的所有命令和语法都基于Bash。1.2 命令行的基本结构当你打开终端通常会看到类似这样的提示符userhostname:~$或者[rootserver /]#这个提示符本身包含了很多信息user/root当前登录的用户名。root是超级管理员。分隔符。hostname/server当前计算机的主机名。:分隔符。~//当前所在的目录。~代表当前用户的家目录如/home/user/代表根目录。$/#命令提示符。$表示普通用户#表示root用户。这是一个重要的安全提示提醒你当前的操作权限。在提示符后你就可以输入命令了。一个完整的命令通常由命令本身、选项参数和操作对象三部分组成。命令 [选项] [参数]例如ls -l /homels命令意为“列出”。-l选项以-或--开头用于改变命令的行为这里是“以长格式列出”。/home参数命令操作的对象这里是目录路径。1.3 环境准备如何开始练习理论需要实践来巩固。要练习Linux命令你有以下几种选择安装Linux系统在物理机或虚拟机上安装Ubuntu、CentOS等发行版。这是最纯粹的方式。使用Windows Subsystem for Linux (WSL)在Windows 10/11上可以启用WSL并安装一个Linux子系统如Ubuntu获得近乎原生的Linux体验。这是目前Windows用户最推荐的方式。使用云服务器购买一台阿里云、腾讯云等提供的云服务器ECS通过SSH远程连接操作。这最贴近生产环境。使用在线模拟器一些网站提供在线的Linux终端模拟环境适合快速体验。对于初学者WSL 2是一个极佳的起点。安装简单且能与Windows文件系统互通。你可以通过微软商店搜索“Ubuntu”进行安装。2. 文件与目录操作立足之本对文件和目录的增删改查是命令行操作的基础。掌握这部分你就能在Linux的文件系统中自由穿梭。2.1 查看与导航我在哪有什么pwd- 显示当前目录这是你的“定位器”。当你迷失在复杂的目录结构中时输入pwd就能立刻知道自己的绝对路径。userubuntu:~$ pwd /home/userls- 列出目录内容这是使用频率最高的命令之一用于查看当前目录下有什么文件和子目录。基本用法ls直接列出当前目录下的文件和目录名隐藏文件除外。常用选项-l以长格式显示包含文件权限、所有者、大小、修改时间等详细信息。userubuntu:~$ ls -l total 4 drwxr-xr-x 2 user user 4096 Apr 10 10:00 Documents -rw-r--r-- 1 user user 0 Apr 10 10:01 file.txt-a显示所有文件包括以.开头的隐藏文件如.bashrc。-h与-l一起使用以人类可读的格式K, M, G显示文件大小。userubuntu:~$ ls -lh total 4.0K drwxr-xr-x 2 user user 4.0K Apr 10 10:00 Documents -rw-r--r-- 1 user user 0 Apr 10 10:01 file.txt-t按修改时间排序最新的在前。cd- 切换目录用于在不同目录间跳转。cd [目录路径]切换到指定目录。cd或cd ~直接回到当前用户的家目录。cd ..切换到上级目录。cd -切换到上一个所在的目录在两个目录间快速切换时非常方便。userubuntu:~$ cd Documents/ userubuntu:~/Documents$ pwd /home/user/Documents userubuntu:~/Documents$ cd .. userubuntu:~$ pwd /home/user2.2 创建与删除从无到有从有到无mkdir- 创建目录mkdir dir_name创建单个目录。mkdir -p parent/child创建嵌套目录。-p选项确保如果父目录不存在会一并创建。userubuntu:~$ mkdir -p project/src/main/java userubuntu:~$ ls -R project/ # -R 递归列出子目录内容 project/: src/ project/src: main/ project/src/main: java/touch- 创建空文件或更新文件时间戳虽然主要用来创建空文件但其本质是修改文件的“访问和修改时间”。如果文件不存在则创建它。userubuntu:~$ touch newfile.txt readme.md userubuntu:~$ ls newfile.txt readme.mdrm- 删除文件或目录⚠️ 警告rm命令删除的文件通常无法从回收站恢复请谨慎使用rm file.txt删除文件。rm -r directory/递归删除目录及其内部所有内容。-r(或-R) 是关键。rm -f file.txt强制删除不进行任何确认提示。-f选项非常危险结合-r使用时需极度小心。安全建议对于删除目录可以先使用rm -ri directory/-i选项会在删除每个文件前交互式地询问你确认后再删除。rmdir- 删除空目录只能删除空目录如果目录内有文件会删除失败。相比rm -r更安全。userubuntu:~$ mkdir empty_dir userubuntu:~$ rmdir empty_dir # 成功 userubuntu:~$ mkdir not_empty_dir touch not_empty_dir/file userubuntu:~$ rmdir not_empty_dir rmdir: failed to remove ‘not_empty_dir’: Directory not empty2.3 复制、移动与重命名文件的搬运与更名cp- 复制文件或目录cp source_file destination_file复制文件。cp source_file target_directory/将文件复制到目标目录下保持原名。cp -r source_directory/ target_directory/递归复制整个目录。cp -i source destination覆盖前交互式询问防止误覆盖重要文件。userubuntu:~$ cp file.txt file_backup.txt userubuntu:~$ cp -r project/ project_bak/mv- 移动或重命名文件/目录重命名mv old_name new_name。在同一目录下操作就是重命名。移动mv file.txt target_directory/。将文件移动到另一个目录。移动并重命名mv file.txt target_directory/new_name.txt。mv命令同样可以用-i选项来询问是否覆盖。userubuntu:~$ mv file.txt renamed_file.txt # 重命名 userubuntu:~$ mv renamed_file.txt Documents/ # 移动到Documents目录3. 文件内容查看与编辑洞察与修改创建了文件我们自然需要查看和编辑其中的内容。3.1 查看文件内容cat- 连接并打印文件内容最简单直接的查看方式会将整个文件内容一次性输出到终端。userubuntu:~$ cat hello.txt Hello, Linux! This is a text file.缺点如果文件很大内容会快速滚过屏幕看不清开头。适合查看小文件。less/more- 分页查看文件内容用于查看大文件可以一页一页地浏览。less file.txt更强大的分页器支持上下滚动、搜索。按空格键向下翻一页按b向上翻一页。按/后输入关键词可向下搜索按?可向上搜索。按q退出。more file.txt基本的分页功能通常只能向下翻页。head/tail- 查看文件开头或结尾head -n 10 file.log查看文件前10行。默认是前10行。tail -n 20 file.log查看文件末尾20行。默认是末尾10行。tail -f application.log实时追踪文件末尾的新内容。这是运维排查日志的神器-f选项会持续监听文件一旦有新的日志行写入立即显示在屏幕上。按CtrlC终止。3.2 编辑文件内容在命令行中编辑文件vim和nano是最常用的工具。nano对新手极其友好界面底部有常用的快捷键提示如^O保存^X退出。userubuntu:~$ nano hello.txt打开后直接编辑按CtrlO保存按CtrlX退出。vim功能无比强大但学习曲线陡峭。它有多种模式普通模式、插入模式、命令模式需要记忆大量快捷键。对于初学者可以先记住vim file.txt打开文件此时处于普通模式。按i进入插入模式此时可以像普通编辑器一样输入文字。编辑完成后按Esc键退回普通模式。输入:wq然后按回车表示保存并退出w写q退出。如果不想保存输入:q!强制退出。4. 系统信息与进程管理掌控全局了解系统状态和管理运行中的程序是进阶必备技能。4.1 系统状态监控ps- 查看当前进程快照报告当前shell会话启动的进程状态。ps显示当前用户在当前终端下的进程。ps aux最常用的组合显示系统所有用户的所有进程的详细信息。a显示所有用户的进程。u以用户为主的格式显示。x显示没有控制终端的进程如后台服务。userubuntu:~$ ps aux | grep nginx # 结合grep查找特定进程 root 1234 0.0 0.1 12345 6789 ? Ss Apr10 0:00 nginx: master process www-data 1235 0.0 0.2 23456 7890 ? S Apr10 0:05 nginx: worker process输出列包括USER用户、PID进程ID、%CPU、%MEM、VSZ虚拟内存、RSS物理内存、TTY终端、STAT状态、START启动时间、TIME占用CPU时间、COMMAND命令。top/htop- 动态实时查看系统资源占用top一个动态的、交互式的进程查看器。可以实时看到CPU、内存使用率以及进程列表。按q退出。htoptop的增强版界面更友好支持鼠标操作和颜色高亮。通常需要额外安装sudo apt install htop。df- 查看磁盘空间使用情况df -h以人类可读的格式G, M显示所有文件系统的磁盘空间使用情况。userubuntu:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 20G 15G 4.0G 79% / tmpfs 1.9G 0 1.9G 0% /dev/shmdu- 查看目录或文件的磁盘使用量du -sh [目录名]以人类可读的格式-h汇总-s显示指定目录的总大小。userubuntu:~$ du -sh /var/log/ 124M /var/log/free- 查看内存使用情况free -h以人类可读的格式显示物理内存和交换空间的使用情况。4.2 进程控制kill- 终止进程通过向进程发送信号来结束它。最常用的信号是15(SIGTERM优雅终止) 和9(SIGKILL强制杀死)。userubuntu:~$ kill 1234 # 发送SIGTERM信号请求进程1234自行退出 userubuntu:~$ kill -9 1234 # 发送SIGKILL信号强制杀死进程1234无法被捕获或忽略注意kill -9是最后手段可能导致数据丢失或状态不一致应优先使用不带参数的kill。pkill/killall- 通过进程名终止进程pkill nginx终止所有名为“nginx”的进程。killall java终止所有名为“java”的进程。 这两个命令同样危险使用前务必确认进程名。5. 权限与所有权管理安全基石Linux是一个多用户系统文件和目录的权限管理至关重要。5.1 理解权限表示使用ls -l命令时第一列就是权限信息如drwxr-xr-x。第1位d表示目录-表示文件l表示链接。后9位每3位一组分别代表所有者 (user)的权限rwx所属组 (group)的权限r-x其他用户 (others)的权限r-x权限字符r(read)读对于文件是查看内容对于目录是列出内容。w(write)写对于文件是修改内容对于目录是创建/删除文件。x(execute)执行对于文件是可运行如脚本、程序对于目录是可进入cd。例如-rwxr-xr--这是一个文件。所有者有读、写、执行权限。所属组有读和执行权限。其他用户只有读权限。5.2 修改权限 (chmod)chmod命令用于修改文件或目录的权限。有两种设置方法数字表示法最常用用三位八进制数表示权限。r4, w2, x1。无权限0。将每组权限值相加。rwx4217r-x4015r--4004。chmod 755 file.sh将file.sh权限设置为rwxr-xr-x。chmod 644 config.txt权限设置为rw-r--r--。符号表示法u(所有者),g(组),o(其他),a(所有人)(增加),-(移除),(设置)r,w,x。chmod ux script.sh给所有者增加执行权限。chmod go-w secret.txt移除组和其他用户的写权限。chmod arw shared.log设置所有人都有读写权限。5.3 修改所有者与所属组 (chown,chgrp)chown- 改变文件所有者sudo chown newowner filename # 改变所有者 sudo chown newowner:newgroup filename # 同时改变所有者和所属组 sudo chown -R user:group directory/ # -R 递归修改目录下所有文件注意通常需要sudo权限。chgrp- 改变文件所属组sudo chgrp newgroup filename6. 文本处理与管道命令行的高阶魔法命令行真正的威力在于能将多个简单的命令组合起来完成复杂的文本处理任务。这依赖于管道 (|)和强大的文本处理三剑客grep,awk,sed。6.1 管道 (|) 与重定向管道|将一个命令的输出作为另一个命令的输入。ps aux | grep java # 从所有进程中筛选出包含“java”的行 cat log.txt | head -100 # 先输出log.txt内容然后取前100行输出重定向和command file将命令的标准输出覆盖写入到文件。如果文件不存在则创建。command file将命令的标准输出追加到文件末尾。ls -l filelist.txt # 将当前目录列表保存到filelist.txt覆盖 echo new line filelist.txt # 在filelist.txt末尾追加一行输入重定向wc -l log.txt # 计算log.txt的行数与cat log.txt | wc -l效果类似6.2grep- 文本搜索利器在文件中搜索匹配特定模式正则表达式的行。grep error app.log在app.log中搜索包含“error”的行。grep -i warning app.log-i忽略大小写。grep -n 404 access.log-n显示匹配行的行号。grep -r function_name /project/src/-r递归搜索目录。grep -v success result.txt-v反向选择输出不包含“success”的行。grep -E error|fail|critical system.log-E使用扩展正则表达式匹配“error”或“fail”或“critical”。6.3awk- 文本分析处理器一个强大的编程语言擅长对按列组织的文本数据进行处理。最基本用法是提取某一列。awk {print $1} data.txt打印data.txt中每一行的第一列默认以空格或制表符分隔。ps aux | awk {print $1, $2, $11}打印进程列表的用户名、PID和命令名。awk -F: {print $1} /etc/passwd-F指定分隔符为冒号:打印/etc/passwd文件的第一列用户名。awk $3 100 {print $0} data.txt如果第三列的值大于100则打印整行($0)。6.4sed- 流编辑器用于对文本进行过滤和转换特别是基于行的编辑。sed s/old/new/g file.txt将文件中的所有“old”替换为“new”。s表示替换g表示全局。sed s/^/# / config.txt在每一行的行首(^)添加#即注释掉整行。sed -n 10,20p large_file.txt-n取消默认输出10,20p只打印第10到20行。sed -i.bak s/foo/bar/g file.txt-i直接修改原文件.bak会先创建一个备份文件file.txt.bak。⚠️ 使用-i务必小心建议先不加-i测试命令是否正确。6.5 组合实战示例假设有一个access.log文件格式为IP - - [时间] “请求方法 路径 协议” 状态码 字节数。找出所有状态码为404的请求grep 404 access.log统计每个IP的访问次数并排序awk {print $1} access.log | sort | uniq -c | sort -nrawk {print $1}提取第一列IP。sort排序让相同IP相邻。uniq -c去重并计数-c。sort -nr按数字(-n)倒序(-r)排序访问最多的排最前。提取特定时间段的日志如10点到11点awk /10:00:00/,/11:00:00/ access.log7. 网络与压缩归档连通与打包7.1 网络相关命令ping- 测试网络连通性ping -c 4 baidu.com向baidu.com发送4个ICMP包测试是否能通。curl- 强大的网络数据传输工具curl http://example.com获取网页内容并输出到终端。curl -o page.html http://example.com将内容保存到文件page.html。curl -I http://example.com仅获取HTTP头部信息。curl -X POST -d datatest http://api.example.com发送POST请求。wget- 非交互式网络下载器wget http://example.com/file.tar.gz下载文件到当前目录。netstat/ss- 查看网络连接和端口监听ss是netstat的现代替代品速度更快。ss -tlnp查看所有TCP协议的监听端口以及对应的进程。netstat -tulnp功能类似。7.2 压缩与归档在Linux中归档将多个文件打包成一个文件和压缩减小文件体积通常是两个步骤但常用命令将它们合二为一。tar- 归档工具创建归档并压缩tar -czvf archive.tar.gz /path/to/directory/ # .tar.gz 格式 (gzip压缩) tar -cjvf archive.tar.bz2 /path/to/directory/ # .tar.bz2 格式 (bzip2压缩)-c创建-z使用gzip-j使用bzip2-v显示过程-f指定文件名。解压归档tar -xzvf archive.tar.gz # 解压 .tar.gz tar -xjvf archive.tar.bz2 # 解压 .tar.bz2 tar -xvf archive.tar # 解压 .tar (无压缩)-x解压。仅查看归档内容tar -tzvf archive.tar.gzzip/unzip处理常见的.zip格式。zip -r archive.zip directory/递归压缩目录。unzip archive.zip解压。8. 查找与帮助自助解决问题的钥匙8.1 查找文件 (find)find命令功能极其强大可以根据名称、类型、大小、时间等属性查找文件。基本语法find [路径] [选项] [动作]常用示例find /home -name *.txt # 在/home下查找所有.txt文件 find . -type f -name config.* # 在当前目录查找类型为文件(-type f)名字以config.开头的文件 find /var/log -type f -size 10M # 在/var/log下查找大于10MB的文件 find . -type d -mtime -7 # 在当前目录查找7天内修改过的目录(-type d) find . -name *.tmp -delete # 查找并删除所有.tmp文件⚠️危险先不加-delete测试 find . -name *.sh -exec chmod x {} \; # 查找所有.sh文件并对每个文件执行chmod x命令8.2 在文件中查找字符串 (grep)已在6.2节介绍是查找内容的利器。8.3 获取命令帮助遇到不熟悉的命令第一反应应该是查看它的帮助文档。man- 命令手册man ls查看ls命令的完整手册包含所有选项和详细说明。按q退出。--help选项ls --help大多数命令都支持提供比man更简洁的选项列表。whatis/aproposwhatis ls用一句话描述ls命令是干什么的。apropos search在所有手册页中搜索包含“search”关键词的命令。9. 实战综合案例日志分析与清理脚本让我们将以上命令组合起来完成一个实际任务分析Nginx访问日志找出访问量最高的前5个IP并清理7天前的旧日志文件。假设我们的日志目录是/var/log/nginx/访问日志文件名为access.log旧日志文件格式为access.log-20240403.gz。步骤1分析今日访问日志# 1. 切换到日志目录 cd /var/log/nginx/ # 2. 查看日志文件大小确认文件存在 ls -lh access.log # 3. 找出访问量最高的前5个IP地址 awk {print $1} access.log | sort | uniq -c | sort -nr | head -5这个管道组合是经典用法提取IP - 排序 - 去重计数 - 按计数倒序 - 取前5。步骤2查找并确认7天前的旧日志# 使用find命令-mtime 7 表示修改时间在7天以前 find . -name access.log-*.gz -mtime 7先不加删除动作确认找到的文件是否正确。步骤3安全地删除旧日志# 方法1使用find的-delete动作谨慎 # find . -name access.log-*.gz -mtime 7 -delete # 方法2更安全的做法先移动到临时目录或使用xargs find . -name access.log-*.gz -mtime 7 -exec rm -v {} \; # -exec 对每个找到的文件执行 rm -v 命令-v 会显示删除过程步骤4将上述步骤写成Shell脚本创建一个脚本文件log_cleanup.sh#!/bin/bash # 日志分析与清理脚本 LOG_DIR/var/log/nginx BACKUP_DAYS7 echo Nginx访问日志分析 echo 访问量Top 5的IP awk {print $1} $LOG_DIR/access.log | sort | uniq -c | sort -nr | head -5 echo -e \n 查找 ${BACKUP_DAYS} 天前的旧日志 OLD_FILES$(find $LOG_DIR -name access.log-*.gz -mtime ${BACKUP_DAYS}) if [ -z $OLD_FILES ]; then echo 未找到符合条件的旧日志文件。 else echo 找到以下文件 echo $OLD_FILES read -p 是否删除以上文件(y/n): -n 1 -r echo if [[ $REPLY ~ ^[Yy]$ ]]; then echo 正在删除... find $LOG_DIR -name access.log-*.gz -mtime ${BACKUP_DAYS} -exec rm -v {} \; echo 删除完成。 else echo 操作取消。 fi fi给脚本添加执行权限并运行chmod x log_cleanup.sh sudo ./log_cleanup.sh # 因为/var/log/nginx目录通常需要root权限10. 常见问题排查与最佳实践10.1 高频问题速查表问题现象可能原因排查命令/思路命令找不到 (Command not found)1. 命令拼写错误。2. 命令对应的软件未安装。3. 命令所在目录不在$PATH环境变量中。1.which command_name查看命令路径。2.echo $PATH查看PATH变量。3. 使用apt install或yum install安装。权限被拒绝 (Permission denied)当前用户对文件/目录没有相应的读(r)、写(w)、执行(x)权限。1.ls -l file查看权限。2. 使用sudo以root执行或chmod/chown修改权限。没有那个文件或目录 (No such file or directory)1. 路径错误。2. 文件确实不存在。3. 使用了相对路径但当前目录不对。1. 使用pwd确认当前位置。2. 使用ls查看目标目录内容。3. 使用绝对路径/path/to/file。磁盘空间不足 (No space left on device)磁盘已满。1.df -h查看各分区使用情况。2. du -sh *进程占用端口 (Address already in use)某个进程已监听该端口。1. ss -tlnp远程连接失败 (Connection refused/timeout)1. 服务未启动。2. 防火墙阻止。3. 网络问题。1.systemctl status service_name检查服务状态。2.sudo ufw status(Ubuntu) 或firewall-cmd --list-all(CentOS) 查看防火墙规则。3.ping IP测试网络连通性。10.2 命令行最佳实践谨慎使用rm -rf和sudorm -rf /会删除根目录所有文件有保护机制但危险命令组合仍需警惕。sudo赋予你至高权限误操作破坏力也极大。执行前务必再三确认路径和命令。善用 Tab 键补全输入命令或路径时按Tab键可以自动补全按两次Tab会列出所有可能的选项。这能极大提高效率并避免拼写错误。使用历史命令按上箭头键可以找回之前执行过的命令。history命令可以查看所有历史记录!编号可以快速执行历史中对应编号的命令。命令组合前先测试在使用管道|、xargs、-exec或重定向执行批量操作尤其是删除、修改前先去掉危险部分运行看输出是否符合预期。例如rm前先用echo或ls代替。编写可读的脚本即使是简单的脚本也建议添加#!/bin/bash解释器声明、注释、错误检查和使用set -euo pipefail让脚本在出错时立即退出避免产生更大问题。理解命令再执行不要盲目复制粘贴网上看到的命令尤其是带有curl或wget从网络直接下载执行的命令curl ... | bash。先理解每一部分在做什么必要时拆开单独执行查看中间结果。做好备份在对重要配置文件如/etc下的文件或数据进行修改前先进行备份。cp file.conf file.conf.bak是一个好习惯。学习Linux命令行是一个循序渐进的过程从最基础的ls,cd,pwd开始到熟练使用管道和文本处理工具再到编写自动化脚本解决实际问题。最好的学习方法就是多动手实践。给自己设定一些小任务比如用命令行整理下载文件夹、分析服务器日志、批量重命名照片等在实践中巩固记忆和理解。当你能够流畅地运用这些命令组合解决问题时你会发现命令行不再是障碍而是提升效率、深入理解计算机系统的强大伙伴。