后端开发必备 | Linux命令行入门到精通,看这篇就够了!(超全50+命令详解,建议收藏)

Linux命令行精华50+

文章目录

本文是一份详尽的Linux命令行指南,专为后端开发者设计。文中逐一解析了54个常用命令,涵盖文件操作、性能监控到网络诊断。每个命令都包含功能、参数及实战示例,同时教授管道与重定向等组合用法,是一篇值得收藏的速查宝典。

前言

对于每一位后端开发者而言,命令行界面(CLI)不仅是一个工具,更是我们在服务器世界中施展拳脚的舞台。熟练掌握Linux命令,能极大地提升我们的工作效率和解决问题的能力。

这篇文章是一份为你精心准备的 “Linux命令行终极宝典”,涵盖了从基础文件操作到系统深度诊断的超过50个核心命令,并为每个命令提供了详细的参数说明和贴近实战的案例。

建议你立即收藏本文,它将成为你未来工作中可靠的速查手册。

title

本文大纲

  1. 基石 · 文件与目录核心操作
  2. 利刃 · 文本处理与文件搜索
  3. 武装 · 软件安装与包管理
  4. 洞察 · 系统状态与性能监控
  5. 掌控 · 进程与服务控制
  6. 联通 · 网络诊断与远程操作
  7. 守护 · 权限安全与用户切换
  8. 打包 · 压缩归档
  9. 内省 · 系统信息与硬件识别
  10. 环境 · 编辑、链接与其它
  11. 终极技巧 · 命令组合与流控制

第一篇:基石 · 文件与目录核心操作

1. ls:列出文件和目录

核心功能:列出指定目录下的文件和子目录。
常用参数

  • -l:使用长列表格式,显示权限、所有者、大小、修改时间等详细信息。
  • -a:显示所有文件,包括 . 开头的隐藏文件。
  • -h:配合 -l,以可读的格式(如 KB, MB)显示文件大小。
  • -t:按修改时间排序,最新的文件排在最前面。
  • -r:反向排序。常与 -t 结合使用 (-tr),列出最旧的文件。
    实践案例
# 详细地列出当前目录下所有文件(包括隐藏),并按修改时间倒序排列
ls -alht

2. cd:切换目录

核心功能:更改当前所在的终端工作目录。
常用用法:

  • cd /var/log/nginx: 切换到 Nginx 日志目录。
  • cd ..: 切换到上一级目录。
  • cd ~cd: 切换到当前用户的主目录。
  • cd -: 切换到上一次所在的目录。
    实践案例
# 快速进入用户主目录
cd
# 查看日志后,快速返回之前的工作目录
cd /var/log
# ... do something ...
cd -

3. pwd:显示当前路径

核心功能:打印出当前工作目录的绝对路径。
实践案例

# 确认自己当前的位置
pwd
# 输出: /root/log/

4. mkdir:创建目录

核心功能:创建一个新的目录。
常用参数

  • -p: 递归创建目录。如果父目录不存在,会自动创建父目录。
    实践案例
# 创建一个多层级的目录结构用于存放应用日志
mkdir -p my-app/logs/archived

5. rm:删除文件或目录

核心功能:移除(删除)文件或目录。
常用参数

  • -r: 递归删除,用于删除目录及其全部内容。
  • -f: 强制删除,不进行任何确认提示。
    实践案例
# 强制删除名为 'temp_logs' 的目录及其所有内容
# !!! 警告:这是一个高危操作,执行前请再三确认路径 !!!
rm -rf temp_logs

6. cp:复制文件或目录

核心功能:复制文件或目录到指定位置。
常用参数

  • -r: 递归复制,用于复制整个目录。
  • -p:保留源文件的属性,如所有者、权限、时间戳。
    实践案例
# 在修改配置文件前,先做一个备份
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 复制整个项目目录为备份
cp -r my-project my-project-backup

7. mv:移动或重命名

核心功能:1. 移动文件或目录到另一个位置;2. 重命名文件或目录。
实践案例

# 移动已部署的jar包到归档目录
mv my-app.jar deployed/archive/

# 将一个日志文件重命名,加上日期戳
mv app.log app-$(date +%Y-%m-%d).log

第二篇:利刃 · 文本处理与文件搜索

8. cat:查看和合并文件内容

核心功能:将一个或多个文件的内容输出到标准输出(通常是终端屏幕)。
常用参数

  • -n: 在输出的每一行前加上行号。
    实践案例
# 快速查看一个配置文件的内容
cat /etc/hosts

# 将两个SQL片段合并成一个文件
cat part1.sql part2.sql > final.sql

9. less:分页查看文件

核心功能:以可交互的方式分页浏览大文件内容,比cat更适合查看日志等大文件。
常用操作(在less界面中):

  • /keyword: 向下搜索keyword
  • ?keyword: 向上搜索keyword
  • n: 跳转到下一个搜索结果。
  • q: 退出less
    实践案例
# 查看一个几百兆的Nginx访问日志
less /var/log/nginx/access.log

10. head:查看文件开头

核心功能:显示文件的开头部分,默认为10行。
常用参数

  • -n <行数>: 指定要显示的行数。
    实践案例
# 查看一个CSV文件的前5行,以确认文件格式和表头
head -n 5 data.csv

11. tail:查看文件结尾

核心功能:显示文件的结尾部分,默认为10行。
常用参数

  • -n <行数>: 指定要显示的行数。
  • -f: (高频使用) 实时跟踪文件的新增内容,直到按下 Ctrl+C
    实践案例
# 实时监控应用日志,排查线上问题
tail -f /home/app/logs/my-app.log

12. grep:文本搜索

核心功能:在文件或标准输入中搜索包含指定模式的行。
常用参数

  • -i: 忽略大小写。
  • -v: 反向匹配,显示不包含模式的行。
  • -r-R: 递归搜索目录下的所有文件。
  • -n: 显示匹配行的行号。
  • -C <N>: 显示匹配行及其上下文(前后N行)。
    实践案例
# 在实时日志中,只看包含"ERROR"的行(不区分大小写)
tail -f app.log | grep -i "ERROR"

# 在当前项目代码中,查找所有使用 "deprecatedFunction" 的地方
grep -r "deprecatedFunction" .

13. find:查找文件

核心功能:在指定的目录树中按各种条件(名称、大小、类型、修改时间等)查找文件。
常用参数

  • -name <模式>: 按文件名查找。
  • -type <类型>: 按文件类型查找 (f为文件, d为目录)。
  • -size <大小>: 按文件大小查找 (+100M表示大于100MB)。
  • -mtime <天数>: 按最后修改时间查找 (-7表示7天内, +7表示7天前)。
  • -exec <命令> {} \;: 对找到的每个文件执行指定命令。
    实践案例
# 查找/var/log目录下所有7天前修改过的、以.log结尾的文件,并删除它们
find /var/log -type f -name "*.log" -mtime +7 -exec rm {} \;

第三篇:武装 · 软件安装与包管理

14. apt:Debian/Ubuntu包管理器

核心功能:在 Debian、Ubuntu 及其衍生发行版上,用于搜索、安装、更新和卸载软件包。
常用参数

  • update: 更新本地的软件包索引列表,通常在安装或升级前执行。
  • install <包名>: 安装指定的软件包。
  • upgrade: 升级所有已安装的软件包。
  • remove <包名>: 卸载指定的软件包(保留配置文件)。
  • autoremove: 自动移除不再需要的依赖包。
  • search <关键词>: 搜索软件包。
    实践案例
# 更新包列表,然后安装Nginx
sudo apt update
sudo apt install nginx

15. yum:CentOS/RHEL包管理器

核心功能:在较旧的 RHEL、CentOS 等发行版上,用于管理软件包。
常用参数

  • install <包名>: 安装软件包。
  • update <包名>: 更新软件包。
  • remove <包名>: 卸载软件包。
  • list installed: 列出所有已安装的包。
  • search <关键词>: 搜索软件包。
    实践案例
# 在CentOS 7上安装htop工具
sudo yum install htop

16. dnf:新一代CentOS/RHEL包管理器

核心功能:在现代的 Fedora、RHEL 8+、CentOS 8+ 发行版中,作为 yum 的继任者,提供更好的性能和依赖解析。
常用参数:与 yum 基本一致。
实践案例

# 在CentOS 8上安装httpd(Apache服务器)
sudo dnf install httpd

17. rpm:RPM包管理底层工具

核心功能:是 Red Hat 及其衍生发行版(如CentOS)中用于管理 .rpm 软件包文件的底层工具。yumdnf 是构建在 rpm 之上的高级工具。
常用参数

  • -i: 安装 (install)。
  • -v: 显示详细过程 (verbose)。
  • -h: 显示安装进度条 (hash)。
  • -q: 查询 (query)。
  • -e: 卸载 (erase)。
  • -U: 升级 (upgrade)。
    实践案例
# 假设你下载了一个.rpm文件,手动安装它
rpm -ivh some-package.rpm

# 查询系统中是否安装了nginx
rpm -q nginx

第四篇:洞察 · 系统状态与性能监控

18. top:实时进程监视器

核心功能:实时、动态地显示系统中各个进程的资源占用情况,如CPU、内存等。
常用操作(在top界面中):

  • P (大写): 按CPU使用率降序排序。
  • M (大写): 按内存使用率降序排序。
  • k: 输入进程PID后回车,以终止该进程。
  • q: 退出top
    实践案例
# 登录服务器后,直接输入top,查看是哪个进程占用了过高的CPU
top

19. htop:交互式进程浏览器

核心功能top的彩色、可交互增强版,界面更友好,支持鼠标操作,功能更强大。
安装方法

sudo apt install htop     # Debian/Ubuntu
sudo yum install htop     # CentOS/RHEL

实践案例

# 使用htop,可以方便地用方向键选择进程,按F9发送信号来终止它
htop

20. ps:进程状态快照

核心功能:显示当前系统进程在某个时间点的快照,不像top是动态的。
常用参数

  • a: 显示所有用户的进程。
  • u: 显示用户及更详细的信息。
  • x: 显示没有控制终端的后台进程。
  • aux: 是最常用的参数组合,显示系统上所有进程的详细信息。
    实践案例
# 查找Java相关的进程及其PID,以便进行下一步操作(如kill)
ps aux | grep java

21. pstree:树状显示进程

核心功能:以树状图的形式展示进程之间的父子关系,非常直观。
安装方法:通常系统自带,若无则:

sudo apt install psmisc     # Debian/Ubuntu
sudo yum install psmisc     # CentOS/RHEL

实践案例

# 查看Nginx主进程启动了哪些工作进程
pstree | grep nginx

22. df:查看磁盘分区使用情况

核心功能:显示文件系统的磁盘空间占用情况。
常用参数

  • -h: 以人类可读的格式(G, M, K)显示大小。
  • -T: 显示文件系统类型。
    实践案例
# 查看服务器上各个磁盘分区的空间是否充足
df -h

23. free:查看内存使用情况

核心功能:显示系统物理内存和交换空间(swap)的使用情况。
常用参数

  • -h: 以人类可读的格式显示。
  • -g / -m / -k: 分别以 GB / MB / KB 为单位显示。
    实践案例
# 快速检查服务器的内存使用状况
free -h

24. du:查看文件和目录大小

核心功能:估算并显示文件或目录占用的磁盘空间大小。与df看整个分区不同,du关注具体目录。
常用参数

  • -h: 以人类可读的格式显示。
  • -s: 只显示总计大小(summarize),不显示子目录详情。
  • --max-depth=N: 指定要深入的目录层级。
    实践案例
# 查找/var/log目录下哪个子目录占用空间最大
du -sh /var/log/*

第五篇:掌控 · 进程与服务控制

25. kill:向进程发送信号

核心功能:向一个或多个进程发送信号,最常用的是终止信号。
常用信号

  • -15 (SIGTERM): 默认信号,通知进程自行终止(优雅关闭),允许进程进行清理工作。
  • -9 (SIGKILL): 强制、立即终止进程,进程无法捕获此信号,可能会导致数据丢失。
    实践案例
# 1. 找到卡死的应用进程PID
# ps aux | grep my-app
# 假设PID为 12345
# 2. 尝试优雅地关闭它
kill 12345
# 3. 如果无效,则强制杀死
kill -9 123445

26. nohup:让进程在后台持续运行

核心功能:在命令前加上 nohup,该命令将在用户退出登录后继续运行,不受挂断信号(SIGHUP)的影响。通常与 & 结合使用。
符号说明

  • &: 将命令放入后台执行。
  • > file 2>&1: 将标准输出和标准错误输出都重定向到同一个文件。
    实践案例
# 在后台启动一个Java应用,并将所有日志输出到app.log,即使用户断开SSH连接,应用依然运行
nohup java -jar my-app.jar > app.log 2>&1 &

27. systemctl:systemd服务管理器

核心功能:在现代Linux发行版(使用systemd)中,用于控制系统服务的核心工具。
常用命令

  • start <服务名>: 启动服务。
  • stop <服务名>: 停止服务。
  • restart <服务名>: 重启服务。
  • status <服务名>: 查看服务状态(排错首选)。
  • enable <服务名>: 设置服务开机自启。
  • disable <服务名>: 取消开机自启。
    实践案例
# 重启Nginx服务,并检查其状态以确认是否成功
sudo systemctl restart nginx
sudo systemctl status nginx

第六篇:联通 · 网络诊断与远程操作

28. ping:测试网络连通性

核心功能:向目标主机发送ICMP ECHO_REQUEST数据包,以测试网络是否通畅、测量往返时间(延迟)。
常用参数

  • -c <次数>: 指定发送数据包的次数。
  • -i <秒数>: 指定每次发送的间隔时间。
    实践案例
# 测试与数据库服务器 'db.server.com' 的网络连接,只发送4个包
ping -c 4 db.server.com

29. ifconfig:配置网络接口(传统)

核心功能:用于显示和配置网络接口(网卡)的传统命令。在许多现代发行版中,它已被ip命令取代,但仍然广泛使用。
实践案例

# 显示所有网络接口的配置信息,包括IP地址、MAC地址等
ifconfig

30. ip:现代网络配置工具

核心功能:一个功能强大的现代网络配置工具,是 ifconfig, route, netstat 等传统命令的集合体和替代品。
常用子命令

  • addr show (或 a): 显示IP地址信息。
  • route show (或 r): 显示路由表。
  • link show: 显示网络接口(链路层)信息。
  • neigh show: 显示ARP缓存(邻居表)。
    实践案例
# 查看本机所有网卡的IP地址
ip addr show

# 查看系统的默认网关
ip route

31. netstat:显示网络连接(传统)

核心功能:显示网络连接、路由表、接口统计等信息的传统工具。
常用参数

  • -t: TCP连接。
  • -u: UDP连接。
  • -l: 监听中的端口。
  • -p: 显示建立连接的程序名/PID。
  • -n: 以数字形式显示地址和端口,不做反向解析(速度更快)。
  • -a: 显示所有连接和监听端口。
    实践案例
# 查看所有监听中的TCP和UDP端口及其对应的程序
sudo netstat -tulnp

32. ss:获取套接字统计

核心功能netstat的现代替代品,查询速度更快,能处理更多的连接信息。
常用参数:与netstat类似。

  • -t, -u, -l, -p, -n, -a
    实践案例
# 快速找出是哪个进程占用了8080端口
sudo ss -tulpn | grep ':8080'

33. telnet:测试远程端口

核心功能:一个简单的远程连接协议客户端,常被开发者用来快速测试某个IP的特定端口是否开放和可达。
安装方法

sudo apt install telnet     # Debian/Ubuntu
sudo yum install telnet     # CentOS/RHEL

实践案例

# 测试Redis服务器(192.168.1.100)的6379端口是否能够连接
# 如果连接成功,屏幕会变黑等待输入;如果失败,会提示 "Connection refused" 或超时
telnet 192.168.1.100 6379

34. curl:HTTP请求工具

核心功能:一个功能极其强大的命令行工具,用于发送各种网络协议的请求,最常用于HTTP(S)。
常用参数

  • -I: 只获取HTTP响应头。
  • -X <方法>: 指定请求方法,如 POST, PUT, DELETE
  • -H "<头信息>": 添加自定义请求头。
  • -d "<数据>": 发送POST请求的数据体。
  • -o <文件名>: 将输出保存到文件。
    实践案例
# 测试一个健康检查接口
curl http://localhost:8080/health

# 发送一个带JSON体的POST请求
curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' http://localhost:8080/api/users

35. wget:网络文件下载器

核心功能:一个非交互式的命令行工具,用于从网络上自动下载文件。
常用参数

  • -c: 断点续传。
  • -O <文件名>: 将下载内容保存为指定的文件名。
  • -P <目录>: 指定下载文件的保存目录。
  • --no-check-certificate: 忽略SSL证书验证(不安全,仅用于特殊场景)。
    实践案例
# 下载最新版的Tomcat安装包
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.83/bin/apache-tomcat-9.0.83.tar.gz

36. ssh:安全远程登录

核心功能:Secure Shell,用于安全地远程登录到另一台主机并执行命令。
常用参数

  • -p <端口>: 指定远程主机的SSH端口。
  • -i <私钥文件>: 指定用于身份验证的私钥文件。
    实践案例
# 以user用户身份登录到IP为192.168.1.200的服务器
ssh user@192.168.1.200

# 使用指定的私钥文件登录
ssh -i ~/.ssh/my_key user@192.168.1.200

37. scp:安全文件复制

核心功能:Secure Copy,基于SSH协议,在本地和远程主机之间安全地复制文件。
常用参数

  • -r: 递归复制,用于复制整个目录。
  • -P <端口>: 指定远程主机的SSH端口(注意是大写P)。
  • -i <私钥文件>: 指定私钥文件。
    实践案例
# 将本地打包好的应用 'app.jar' 上传到服务器的 '/opt/apps' 目录
scp ./app.jar user@remote_host:/opt/apps/

# 将服务器上的Nginx日志目录下载到本地
scp -r user@remote_host:/var/log/nginx ./nginx_logs

第七篇:守护 · 权限安全与用户切换

38. chmod:修改文件权限

核心功能:更改文件或目录的访问权限(读、写、执行)。
常用参数/模式

  • 符号模式: + (添加权限), - (移除权限), = (设置权限)。u (用户), g (组), o (其他), a (所有)。
  • 数字模式: 4 (读), 2 (写), 1 (执行)。将所需权限的数字相加。例如 7 (4+2+1) 代表读写执行,5 (4+1) 代表读和执行。
    实践案例
# 给一个脚本文件添加可执行权限,以便能直接运行它
chmod +x my_script.sh

# 将一个项目目录权限设置为:所有者可读写执行,所属组可读可执行,其他人可读可执行
chmod 755 project_dir

39. chown:更改文件所有者

核心功能:更改文件或目录的所有者和/或所属组。
常用参数

  • -R: 递归更改,用于目录。
    语法
  • chown <新所有者> <文件>
  • chown <新所有者>:<新所属组> <文件>
    实践案例
# 将网站根目录的所有权交给 Nginx 运行的用户 'www-data'
sudo chown -R www-data:www-data /var/www/html

40. sudo:以超级用户身份执行

核心功能:Superuser Do,允许普通用户以超级用户(root)或其他用户的身份执行命令。
实践案例

# 安装软件、修改系统配置、重启服务等操作都需要管理员权限
sudo systemctl restart nginx

41. su:切换用户

核心功能:切换到另一个用户账户。
常用参数

  • --l: 在切换用户的同时,也切换到新用户的完整环境(包括$PATH等环境变量),模拟一次完整的登录。
    实践案例
# 切换到 'appuser' 用户,并加载其完整的环境变量后,再执行操作
su - appuser

42. sestatus:查看SELinux状态

核心功能:显示 Security-Enhanced Linux (SELinux) 的状态。SELinux是一种强制访问控制安全机制,常见于CentOS/RHEL。
实践案例

# 在CentOS上,如果Nginx无法访问文件,即使文件权限(rwx)正确,
# 也应该检查SELinux状态。如果状态是'Enforcing',则问题可能出在SELinux策略上。
sestatus

第八篇:打包 · 压缩归档

43. tar:打包与解包

核心功能:将多个文件或目录打包成一个 .tar 文件,并能选择性地使用 gzip (.gz) 或 bzip2 (.bz2) 进行压缩。
常用参数

  • -c: 创建 (create) 一个归档文件。
  • -x: 提取 (extract) 归档文件。
  • -v: 显示详细过程 (verbose)。
  • -f: 指定归档文件名 (file)(此参数后必须紧跟文件名)。
  • -z: 使用 gzip 进行压缩/解压缩。
    实践案例
# 将 'my_project' 目录打包并用 gzip 压缩成 'project_backup.tar.gz'
tar -czvf project_backup.tar.gz my_project

# 从 'project_backup.tar.gz' 中解压文件
tar -xzvf project_backup.tar.gz

44. zip:创建zip压缩文件

核心功能:创建与Windows系统兼容的 .zip 格式压缩文件。
安装方法

sudo apt install zip unzip     # Debian/Ubuntu
sudo yum install zip unzip     # CentOS/RHEL

常用参数

  • -r: 递归处理,用于压缩目录。
  • -q: 安静模式,不显示过程信息。
    实践案例
# 将 'my_docs' 目录压缩成 'docs_archive.zip'
zip -r docs_archive.zip my_docs

45. unzip:解压zip文件

核心功能:解压 .zip 格式的压缩文件。
安装方法:同zip
常用参数

  • -d <目录>: 指定解压到的目标目录。
    实践案例
# 将 'docs_archive.zip' 文件解压到 'extracted_docs' 目录
unzip docs_archive.zip -d extracted_docs

第九篇:内省 · 系统信息与硬件识别

46. uname:显示系统信息

核心功能:打印当前系统的基本信息,如内核名称、版本、硬件架构等。
常用参数

  • -a: 显示所有可用信息 (all)。
  • -r: 显示内核版本。
  • -m: 显示机器硬件名称(架构)。
    实践案例
# 快速查看服务器的内核版本和操作系统架构
uname -a

47. lscpu:显示CPU信息

核心功能:以易读的格式显示有关CPU架构的详细信息,如核心数、线程数、缓存大小等。
实践案例

# 检查服务器的CPU配置,以进行性能评估或资源分配
lscpu

48. lspci:列出PCI设备

核心功能:列出系统中所有的PCI设备,如网卡、显卡、RAID控制器等。
实践案例

# 查看服务器上物理网卡的型号
lspci | grep -i "ethernet"

49. lsusb:列出USB设备

核心功能:列出连接到系统的所有USB设备。
实践案例

# 确认服务器是否识别到了新插入的USB加密狗或存储设备
lsusb

50. ldd:显示共享库依赖

核心功能:打印一个可执行文件或共享库所依赖的动态链接库。对于排查“缺少库文件”类型的错误非常有用。
实践案例

# 查看nginx可执行文件依赖哪些共享库
ldd $(which nginx)

51. history:查看命令历史

核心功能:显示当前用户在终端中执行过的历史命令列表。
常用技巧

  • !n: 执行历史记录中编号为n的命令。
  • !!: 执行上一条命令。
  • history | grep <关键词>: 搜索历史命令。
  • Ctrl+R: 反向搜索历史命令。
    实践案例
# 忘记了上次用来重启某个服务的复杂命令,可以搜索历史记录
history | grep "systemctl"

第十篇:环境 · 编辑、链接与其它

52. vi:经典文本编辑器

核心功能:经典的命令行文本编辑器,是所有类Unix系统的标准配置。它以模式化编辑而闻名,功能强大但学习曲线较陡。
核心模式

  • 命令模式 (Normal Mode): 默认进入的模式,用于移动光标、删除文本、复制粘贴等。
  • 插入模式 (Insert Mode): 在命令模式下按 i (在光标前插入)、a (在光标后追加)、o (在下一行插入) 等键进入,用于输入文本。按 Esc 键返回命令模式。
  • 底线命令模式 (Command-line Mode): 在命令模式下按 : 进入,用于执行保存、退出、替换等命令。
    实践案例
# 在一台极简安装的服务器上,vi可能是唯一可用的编辑器
# 快速编辑一个脚本
vi my_script.sh
# (进入后按'i'开始编辑,编辑完成后按'Esc',然后输入':wq'回车,即可保存并退出)

53. vim:增强版vi编辑器

核心功能vi的改进版(Vi IMproved),在vi的基础上增加了大量功能,如语法高亮、代码补全、分屏、多级撤销等,是开发者的首选命令行编辑器。
安装方法

sudo apt install vim     # Debian/Ubuntu
sudo yum install vim     # CentOS/RHEL

实践案例

# 使用vim编辑Nginx配置文件,它会自动识别文件类型并进行语法高亮,极大提升了可读性
vim /etc/nginx/nginx.conf

54. ln:创建链接

核心功能:为文件或目录创建链接,分为硬链接(hard link)和符号链接(symbolic link)。
常用参数

  • -s: 创建符号链接(symbolic link),也叫软链接。这是最常用的类型,它像一个指向源文件的快捷方式。
    区别
  • 符号链接:可以跨文件系统,删除源文件会导致链接失效。
  • 硬链接:不能跨文件系统,相当于文件的另一个入口,删除任意一个入口,文件实体依然存在,直到所有链接都被删除。
    实践案例
# 场景:应用版本管理
# 假设应用部署在 /opt/apps/my-app-v1.2 目录
# 创建一个名为 'current' 的软链接指向它
ln -s /opt/apps/my-app-v1.2 /opt/apps/current

# 当发布新版本v1.3时,只需更新链接,而不需要修改任何引用了'current'路径的配置
rm /opt/apps/current
ln -s /opt/apps/my-app-v1.3 /opt/apps/current

第十一篇:终极技巧 · 命令组合与流控制

到目前为止,我们已经学习了大量独立的命令。但Linux命令行的真正魔力在于其“组合”能力,这遵循了Unix哲学的核心思想:“每个程序只做一件事,并把它做好。” 通过管道和重定向,我们可以将这些专注的小工具串联起来,构建出强大的数据处理工作流。

1. 管道 (Pipe |)

核心概念:管道符 | 就像一根水管,它将前一个命令的标准输出(Standard Output)直接连接到后一个命令的标准输入(Standard Input)。这形成了一个命令处理流水线,数据在其中流动并被逐级处理。

语法
command1 | command2 | command3 ...

实践案例

  • 案例一:经典组合 ps + grep
    我们之前已经用过这个组合,现在来深入理解它。ps aux会输出当前系统所有的进程信息,内容非常多。我们只关心 nginx 相关的进程。

    # `ps aux` 的输出 -> 作为 `grep nginx` 的输入
    ps aux | grep nginx
    

    这里,grep 不再需要从文件中读取,而是直接处理从管道传来的 ps 命令的结果。

  • 案例二:统计文件数量 ls + wc
    wc -l 命令可以统计输入的行数。我们可以用它来统计当前目录下的文件和目录总数。

    # `ls -l` 的输出 -> 作为 `wc -l` 的输入,统计总行数
    # (注意:结果会比实际数量多1,因为ls -l第一行是total)
    ls -l | wc -l
    
  • 案例三:后端日志分析(多级管道)
    这是最能体现管道威力的场景。假设我们要从 Nginx 的 access.log 中找出访问量最高的前10个IP地址。

    # 分析访问日志,找出访问量TOP 10的IP
    cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 10
    

    让我们拆解这条流水线:

    1. cat access.log: 读取整个日志文件的内容并输出。
    2. | awk '{print $1}': awk 按列处理文本,{print $1} 表示只提取并输出每一行的第一列(即IP地址)。
    3. | sort: 对所有IP地址进行排序,这是为了让相同的IP地址能够相邻,为下一步做准备。
    4. | uniq -c: uniq 去除重复的行,-c 参数会同时计算每个IP地址连续出现了多少次。
    5. | sort -rn: sort 再次进行排序。-r 表示反向(降序),-n 表示按数值大小排序。这样,出现次数最多的IP就排在了最前面。
    6. | head -n 10: 最后,head 命令只取出排序后的前10行,即TOP 10的IP。

2. 重定向 (Redirection)

核心概念:重定向是改变命令的默认输入/输出目标。默认情况下,输入来自键盘,输出到屏幕。重定向可以让我们从文件读取输入,或将输出写入到文件。

常用符号

  • > (输出重定向 - 覆盖)
    将命令的标准输出重定向到一个文件。如果文件不存在,则创建;如果文件已存在,则会覆盖其全部内容

    # 将当前目录的详细列表写入 file_list.txt,会覆盖旧内容
    ls -lh > file_list.txt
    
  • >> (输出重定向 - 追加)
    将命令的标准输出追加到一个文件的末尾。如果文件不存在,则创建;如果文件已存在,内容会加在后面,不会覆盖

    # 将一条新的日志信息追加到 app.log 文件末尾
    echo "$(date): Application restarted" >> app.log
    
  • < (输入重定向)
    将命令的标准输入从键盘改为一个文件。

    # 使用 a.sql 文件作为 mysql 客户端的输入,来执行SQL脚本
    mysql -u root -p my_database < a.sql
    
  • 2> (错误重定向)
    Linux中有两种主要的输出:标准输出(stdout, 文件描述符1)和标准错误(stderr, 文件描述符2)。> 只重定向标准输出。2> 则专门用于重定向标准错误输出

    # 尝试执行一个可能出错的命令,只把错误信息保存到 error.log
    ./my_script.sh 2> error.log
    
  • 2>&1 (合并标准输出和标准错误)
    这是一个非常常见的用法,表示将标准错误(2)重定向到与标准输出(1)相同的地方。常与 > 结合,实现将所有输出(无论正常还是错误)都保存到同一个文件。

    # 以后台方式运行一个脚本,并将它的所有输出(stdout和stderr)都写入到 output.log
    nohup ./long_running_task.sh > output.log 2>&1 &
    

组合使用管道和重定向

你可以将流水线的最终结果重定向到文件中,进行保存或后续分析。

# 将前面日志分析的结果保存到 top_ips.txt 文件中
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 10 > top_ips.txt

总结

恭喜你,坚持看到了这里!

掌握命令行,是每一位后端工程师从优秀走向卓越的必经之路。它赋予我们直接、高效地与系统对话的能力。本文中逐一详解的这50多个命令,构成了我们日常开发与运维工作的坚实骨架。

更重要的是,我们学习了如何通过管道符 |重定向 > 将这些独立的命令组合起来,构建出解决复杂问题的强大工作流。这正是Linux命令行的精髓所在。真心希望这本“终极宝典”能成为你探索Linux世界的一张详尽地图。


写在最后

大家好,这里是[编程实践录],一个热衷于分享实用开发技巧的技术博客。

写一篇高质量文章不易,如果这篇文章确实帮助到了你,希望可以点赞、收藏、关注一下,这也是我持续创作的最大动力!

当然,我更推荐你来我的公众号【编程实践录】找我。

为什么?因为在那里,除了所有文章的首发,我还准备了:

  • 深度交流:你可以随时在公众号后台向我提问,我都会逐一回复。
  • 硬核干货:更多关于编程实践的独家技巧和思考。

在微信搜索框里,直接搜索“编程实践录”,就可以找到我。我们换个地方,聊点更深的!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程实践录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值