一、课前复习(5分钟)

正式开始新内容之前,我们先快速回顾一下之前讲过的重点。

1.1 Linux 历史回顾

  • 计算机发展史:从 ENIAC(1945年)到摩尔定律推动计算机小型化

  • 操作系统诞生:UNIX 由肯·汤普森(汇编)和丹尼斯·里奇(C语言重写)开发

  • Linux 诞生:1991年,芬兰赫尔辛基大学学生 林纳斯·托瓦兹 开源了 Linux 内核

  • 开源 vs 闭源:开源系统(如 Linux)进化速度快,性能、稳定性、安全性更优

1.2 发行版与内核版本

类型 说明 示例
商业化发行版 不同厂商打包的 Linux 系统 Ubuntu、CentOS、Red Hat、Kali
内核版本 技术路线,数字标识 3.10、5.10、6.10

不同发行版底层可能使用相同的内核版本。

1.3 环境搭建与用户管理

  • 推荐方案:云服务器 + Xshell 远程登录

  • 用户管理命令

    • whoami:查看当前用户

    • pwd:查看当前路径

    • adduser 用户名:新建用户

    • passwd 用户名:设置密码

    • userdel -r 用户名:删除用户(必须带 -r

1.4 核心知识点回顾

知识点 说明
目录 = 文件夹 Linux 中的"目录"等同于 Windows 的"文件夹"
文件 = 内容 + 属性 空文件也占用磁盘空间(存储属性信息)
文件类型 d=目录,-=普通文件
隐藏文件 以 . 开头的文件,ls -a 查看
当前目录/上级目录 .=当前目录,..=上级目录
路径 绝对路径(从 / 开始),相对路径(从当前位置开始)
家目录 root:/root,普通用户:/home/用户名cd ~ 快速回家
命令本质 命令就是可执行文件(C/C++ 程序)
快捷键 Ctrl+C 终止程序,上下键翻历史命令

二、一切皆文件

2.1 核心概念

Linux 下一切皆文件

Linux 系统不仅把 .c.txt、可执行程序当做文件,磁盘、网卡、显卡、键盘、鼠标、显示器等设备,在系统层面也被设计成了文件的形式。

2.2 默认打开的三个文件

我们以前学 C/C++ 时,直接用 printf/cout 输出、scanf/cin 输入,从来没有手动打开过键盘或显示器。这是因为:

系统在启动程序时,默认帮我们打开了三个文件:

  • stdin(标准输入)→ 对应键盘

  • stdout(标准输出)→ 对应显示器

  • stderr(标准错误)→ 对应显示器

所以,printfscanf 的本质就是文件操作——向显示器文件写入,从键盘文件读取。

2.3 终端也是文件

当我们用 Xshell 登录 Linux 时,系统会在 /dev/pts/ 目录下创建一个设备文件(如 012),代表当前终端。

ls -l /dev/pts
# 输出示例:
# crw------- 1 root root 136, 0 Sep 10 19:59 0
# crw------- 1 root root 136, 1 Sep 10 19:59 1
  • 文件类型为 c(字符文件),代表字符设备

  • 终端文件既能接收键盘输入,也能显示输出

2.4 C 语言验证

c

#include <stdio.h>

int main()
{
    FILE *fp = fopen("/dev/pts/0", "w");
    if (fp == NULL) {
        printf("open error\n");
        return 1;
    }
    fprintf(fp, "hello from C to terminal!\n");
    fclose(fp);
    return 0;
}

编译运行后,字符串会直接写入到指定的终端设备文件中。

三、重定向操作

3.1 输出重定向(>

默认情况下,echo "hello" 会将字符串写入显示器文件。使用 > 可以改变输出方向:

echo "hello world" > hello.txt
  • 如果 hello.txt 不存在 → 新建

  • 如果 hello.txt 已存在 → 先清空,再写入

3.2 清空文件

> hello.txt          # 什么都不写,只清空文件

3.3 追加重定向(>>

echo "new line" >> hello.txt   # 追加到文件末尾,不清空原有内容

3.4 输入重定向(<

cat 命令默认从键盘读取,使用 < 可以从指定文件读取:

cat < hello.txt     # 从 hello.txt 读取内容并显示

注意:这个输入重定向与cat直接打印还有点区别学到后面会细讲。

3.5 重定向与 C 语言打开方式的对应

重定向操作 对应 C 语言打开方式 行为
> fopen(path, "w") 不存在则新建,存在则清空
>> fopen(path, "a") 追加写入
< 输入重定向 从文件读,而非键盘

四、文件类型详解

使用 ls -l 查看文件详细信息,第一列的第一个字符表示文件类型:

字符 文件类型 示例 说明
- 普通文件 -rw-r--r-- 文本、可执行程序、图片、视频等
d 目录文件 drwxr-xr-x 文件夹
c 字符设备文件 crw------- 键盘、显示器、终端
b 块设备文件 brw-rw---- 磁盘(支持随机读写)
l 链接文件 lrwxrwxrwx 类似 Windows 快捷方式
p 管道文件 prw-r--r-- 进程间通信
s 套接字文件 srwxrwxrwx 网络通信

4.1 关于文件后缀

Linux 系统不通过后缀区分文件类型,而是通过文件属性(第一列第一个字符)。

但这不是说 Linux 禁止使用后缀。GCC 编译器仍然识别 .c 后缀,系统只是不强制要求。

# 把 .c 改成 .txt 后,gcc 就不认了
mv test.c test.txt
gcc test.txt   # 报错:文件格式不识别

# 改回 .c 后恢复正常
mv test.txt test.c
gcc test.c     # 正常编译

结论:后缀在 Linux 中只是文件名的一部分,但某些工具(如 GCC)会依赖后缀来识别文件类型。

五、新增指令详解

5.1 echo — 打印字符串

echo 'hello world'      # 输出:hello world
  • 将后面的内容当作字符串打印到显示器(默认写入显示器文件)

  • 会自动在末尾添加换行符 \n

5.2 printf — 格式化打印

printf "hello %d, %s\n" 100 "bit"
# 输出:hello 100, bit
  • 用法与 C 语言的 printf 类似

  • 不会自动添加换行符,需要手动加 \n

5.3 cat — 查看文件内容

cat test.c          # 显示 test.c 的内容
cat -n test.c       # 带行号显示
  • 适合查看短文件

  • 查看大文件会刷屏

5.4 tac — 反向查看文件内容

tac test.c          # 从最后一行开始显示
  • cat 的反向拼写,功能也是反向的

5.5 mv — 移动 / 重命名

mv 1.txt 2.txt              # 重命名:1.txt → 2.txt
mv file.txt /tmp/           # 移动:将 file.txt 移动到 /tmp 目录
mv dir1/ /tmp/              # 移动整个目录
  • 如果目标路径是目录 → 剪切

  • 如果目标路径不是目录且不存在 → 重命名

5.6 more — 分页查看文件

more /var/log/temp.txt
  • 空格/回车:向下翻页/翻行

  • q:退出

  • 不支持向上翻页

5.7 less — 更强大的分页查看器(推荐)

less /var/log/messages
  • 上下键:上下翻行

  • 空格/PageDown:向下翻页

  • PageUp:向上翻页

  • /关键词:向下搜索,n 下一个,N 上一个

  • ?关键词:向上搜索

  • q:退出

推荐使用 less,功能比 more 更全面。

5.8 head — 查看文件开头

head -n 10 log.txt    # 查看前10行(默认10行)

5.9 tail — 查看文件结尾

tail -n 10 log.txt    # 查看最后10行(默认10行)
tail -f log.txt       # 实时跟踪文件新增内容(常用于查看日志)

5.10 date — 查看/设置时间

date                          # 默认格式
date "+%Y:%m:%d %H:%M:%S"    # 自定义格式:年:月:日 时:分:秒

常用格式符

  • %Y:年(四位数)

  • %m:月

  • %d:日

  • %H:时(24小时制)

  • %M:分

  • %S:秒

5.11 时间戳(Timestamp)

date +%s    # 显示当前时间戳(从1970-01-01 00:00:00 UTC 到现在的秒数)
  • 格林威治时间戳:全球统一的时间计数方式

  • 计算机内部维护一个线性递增的计数器(每秒+1)

  • 1970年1月1日午夜(UTC)为起点

  • 东八区比 UTC 早8小时,所以 date -d @0 显示 1970-01-01 08:00:00

时间戳与可读时间互转

date -d @时间戳              # 时间戳 → 可读时间
date -d "2024-09-10 12:00:00" +%s   # 可读时间 → 时间戳

时间戳的作用

  • 计算机内部存储和计算更方便(整数递增)

  • 便于做区间查找(如查某段时间内的日志)

5.12 cal — 查看日历

cal                 # 当前月
cal 2024            # 全年
cal 9 2024          # 指定年月的日历

5.13 find — 查找文件

find / -name "*.c"          # 从根目录开始找所有 .c 文件
find /root -name "test.c"   # 在指定目录下查找
  • 在整棵目录树中按文件名查找

  • 范围大时可能较慢

5.14 which / whereis — 查找命令位置

which ls            # /usr/bin/ls
whereis ls          # 查找命令、源码、手册等相关文件

六、管道(|

6.1 什么是管道

管道 | 可以将左边命令的输出作为右边命令的输入,实现命令的组合。

命令1 | 命令2 | 命令3 ...

6.2 管道示例

示例1:查看文件第500~510行

head -n 510 log.txt | tail -n 10
  • head -n 510:取前510行

  • tail -n 10:取后10行 → 得到第501~510行

示例2:统计行数

cat log.txt | wc -l        # 统计 log.txt 的行数

示例3:组合多个命令

head -n 510 log.txt | tail -n 10 | tac | wc -l
  • 取第501~510行 → 反向显示 → 统计行数(输出10)

6.3 管道的本质

  • 管道也是一个文件(内存级文件)

  • 左边命令向管道文件写入,右边命令从管道文件读取

  • 实现"流水线"式的文本处理

七、日志与文本处理

7.1 什么是日志

日志是程序运行时记录的信息,用于:

  • 排查错误

  • 追踪用户行为

  • 监控系统状态

Linux 系统日志通常位于 /var/log/ 目录下,如 /var/log/syslog。不同的系统有不同差异我的系统是Ubantu。

7.2 日志中的时间戳

日志通常带时间戳,方便定位问题发生的时间段。例如:

  • 将开始时间和结束时间转换为时间戳

  • 在日志中查找该区间内的记录

7.3 常用日志查看方式

# 查看最新日志(实时跟踪)
tail -f /var/log/syslog


# 搜索包含 "error" 的行
grep "error" /var/log/syslog

# 分页查看
less /var/log/syslog

# 查看某段时间的日志(需配合时间戳转换)

grep 命令下节课详细讲解,是文本搜索的利器。

八、本节课指令清单

指令 作用 常用选项
echo 打印字符串
printf 格式化打印
cat 查看文件内容 -n 显示行号
tac 反向查看文件内容
mv 移动/重命名文件或目录
more 分页查看(仅向下)
less 分页查看(支持上下、搜索) /搜索,q退出
head 查看文件开头 -n 指定行数
tail 查看文件结尾 -n 指定行数,-f 实时跟踪
date 查看/设置时间 +%Y%m%d... 格式化,+%s 时间戳
cal 查看日历
find 查找文件 -name 按名称查找
which 查找命令位置
whereis 查找命令及手册位置

九、本节课简单总结

今天我们围绕 Linux 的核心设计哲学——"一切皆文件",展开了一系列深入的学习:

  1. 一切皆文件:这是理解 Linux 的钥匙。键盘、显示器、终端、甚至管道,在系统层面都被抽象成文件。正是因为这个设计,我们才能用统一的文件操作接口去处理各种设备。

  2. 重定向>>>< 让我们可以灵活控制数据的流向,把本应输出到屏幕的内容写入文件,或从文件读取输入。这本质上对应了 C 语言中 fopen 的不同打开方式(war)。

  3. 管道 |:管道让命令可以像流水线一样组合起来,左边命令的输出变成右边命令的输入。这是 Linux 命令行"小而美"哲学的体现——每个命令只做一件事,但组合起来可以完成复杂任务。

  4. 文件类型:Linux 通过 ls -l 第一列的第一个字符区分文件类型(-普通文件、d目录、c字符设备、b块设备、l链接等)。系统不依赖后缀,但工具(如 GCC)可能依赖。

  5. 文本查看工具链cat(短文件)、less(分页+搜索)、head/tail(头尾)、more(已过时),配合管道可以做到"指哪打哪"的文本分析。

  6. 时间与日志date 获取时间,时间戳(date +%s)是计算机内部的时间表示方式,从 1970-01-01 UTC 开始计数。日志是排查问题的关键,时间戳让区间查找成为可能。

重点提醒:命令本身不需要死记硬背,多用自然就记住了。真正重要的是理解"一切皆文件"的思想,以及重定向、管道这些组合方式——它们才是 Linux 命令行的灵魂。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐