【Linux指令3】
Linux指令篇 3

一 指令
1.echo
用法:
操作一 :打印字符串:echo “内容" (默认会输出到显示器上)
如:echo 'hello'

操作二:覆盖写入文件:echo “内容”>文件名
作用:用echo可以把内容写入到文件中。
如:echo ‘内容’> 文件名 echo ‘hello’>sss.txt
细节:如果我们要写入到文件名,而这个文件名不存在,那么就会新建,存在则清空原有内容后写入。
演示:
新创建一个文件

执行命令:echo ‘hello’ >ccc.txt

原本没有的ccc.txt文件经过上面的指令,创建了一个新的文件
为了验证这个文件有没有被写入内容:
我执行指令:cat ccc.txt cat + ‘内容’ 打印文件内容

到这里如果我们要写入到文件名,而这个文件名不存在,那么就会新建这一个细节就被验证了。
继续验证存在则清空原有内容后写入
现在继续执行:echo 'ni hao' > ccc.txt

从上述图中可以明显的到如果你要写入的文件中有内容,你用echo去写那么就会先清空在继续对你的内容进行写入
操作三:追加入文件:echo “内容” >> 文件名
作用:把内容追加到echo文件中
如:echo ‘hello world’ >> ccc.txt
细节:在文件末尾新增内容,不覆盖原有数据
演示:
现在我们知道:ccc.txt文件中的内容— ’ni hao‘

追加操作
执行指令:
echo 'xiao ming' >> ccc.txt

注意:echo 和 cat的对比
echo :后面+的内容不管是不是文件 如: echo ccc.txt 或者 echo hello echo都会当作字符串进行打印到显示器上cat:后面+的内容是显示指定文件名里面的内容
2.mv
用法:
操作一:把文件或者目录剪切到另一个目录中
作用:移动文件/目录:omv 源文件/目录 目标路径(如mv test.c lesson2,将test.c移动到lesson2目录)
指令:mv '文件或者目录‘ ’目标路径‘
演示:
我们把ccc.txt移动到上级目录下


操作二:重命名
作用:mv 原文件名 新文件名(如mv 1.txt 222.txt,将1.txt重命名为222.txt,目录不变)
代码:mv ‘文件’ ‘你要重命名的文件’
演示:
我们把ccc.txt 重命名成aaa.txt

3.tac
用法:
操作一:反向打印文件内容(与cat相反,从最后一行开始向前打印)
作用:就是你在查找文件内容的时候如果你要直接查看最后的信息,那么就可以用tac
指令:tac '文件名'
演示:
打印aaa.txt中的最后信息

4. more/less
用法:
操作一:逐行查看文件(适合大文件,避免内容一次性刷屏)
作用:对日志或者大型文件内容进行查看,
more -数字:
从数字行开始查看,按Enter键逐行向下查看(不能回退),按q键退出
less:
功能与more一致,更常用;支持搜索(输入/ 查找内容后按Enter,按n查看下一个匹配项)用上下键来进行查看,按q退出
指令:more -数字 ’文件名‘ less 文件名
演示:用/usr/include/search.h我路径下的文件进行指令查看
more -数字 /usr/include/search.h

但是现在查看不用more了,因为不能往上查看,只能往下。所以推荐用less
less /usr/include/search.h
输入 / 然后按Enter进行查找


按n可以查找下一个匹配项
二. Linux对于文件的理解
一 理解文件
我们自己创建的文件才叫做文件吗?
在 Linux 系统中,所有资源(包括用户创建的普通文件、键盘 / 显示器等设备)都以 “文件” 的形式抽象管理。这一设计是理解 Linux IO(输入输出)操作的基础
二 “设备文件” 的访问逻辑
键盘、显示器这类硬件设备,在 Linux 中属于 “设备文件”。和普通文件一样,访问它们之前必须先 “打开”(这是 Linux 文件操作的统一要求)。
三 标准 IO 函数的本质:文件操作
我们常用的 printf/scanf(C 语言)、cout/cin(C++),本质都是对 “文件” 的操作—— 它们默认操作的是 “标准输入(键盘)”“标准输出(显示器)” 这些设备文件。
为什么我们感觉不到printf/scanf这些是文件操作呢?
因为:这个函数是被封装了,所以我们感觉不到试文件操作。 printf和scanf是高层封装的 “易用接口”。它们的底层其实依赖于文件操作的核心逻辑(比如fopen、fwrite、fread),但这些底层细节被标准库 “包裹”
起来了。
对应到文件操作的底层函数:
C 语言中,通过 fopen 函数打开文件,返回 FILE 指针来管理文件;
C++ 中,通过 fstream 系列类来实现文件的打开、读写。
四 底层系统操作
这时候我们发现我们也没有主动打开文件,为什么就可以读写呢?
这是因为系统在我们之前帮我们打开了三个必要的文件
stdin,stdout,stderr
#include <stdio.h>
FILE *fopen(const char* path,const char* mode)
extern FILE* stdin //标准输入
extern FILE* stdout//标准输出
extern FILE* stderr//标准错误
如何理解系统帮我们打开呢?
这是考虑到我们在编写代码的时候,我们的程序是从main函数开始跑的,系统会在main函数之前在编译的时候会文件帮我们打开文件。系统执行代码的时候不一定是从main函数中开始的。
为什么系统要帮我们打开?
通用性:无论程序运行在什么环境(命令行、图形界面、甚至被重定向到文件 / 管道),只要基于stdin/stdout/stderr编程,就能保证逻辑的一致性。比如你写的printf既可以在屏幕上输出,也可以被重定向到日志文件里,这就是 “一切皆文件” 和 “自动打开标准文件” 共同带来的灵活性。
怎么不打开其他文件?
过渡打开文件,会导致资源浪费,你需要什么文件就手动打开就行了
操作模式:

模式 含义 关键特点
r 以只读方式打开文本文件 只能读取文件内容,文件必须已存在,否则报错
r+ 以读写方式打开文件 可同时读写,文件必须已存在,否则报错
w 以只写方式打开文件 若文件不存在则新建;若文件存在则清空原有内容
w+ 以读写方式打开文件 若文件不存在则新建;若文件存在则清空原有内容,支持读写操作
a 以追加方式打开文件 若文件不存在则新建;写入内容时会追加到文件末尾,原有内容不会被覆盖
a+ 以追加和读取方式打开文件 若文件不存在则新建;可读取文件内容,写入时追加到末尾
文件类型:

注意:linux 下系统不关心后缀,但是相关工具关心后缀,比如gcc 编译.c文件要用.c后缀。
三 文件理论和实践
一 终端也是一个文件
理论:
在我们的终端中输入指令ls /dev/pts 就可以看到你终端文件了

如果我们在创建一个终端,那么就会多一个文件。

实践:
既然终端是一个文件,我们可以写入数据到文件中,那么我也可以把数据打印到终端中,
echo ‘ni hao’ > /dev/pts/数字

所以当我们在进行打印的时候,系统默认给我们打印终端显示器上。同时我们也可以在我们创建文件中进行打印到其他文件中。
四 linux下的时间
用到指令date就可以访问当前时间

时间输出格式:
在date后面加上:%Y 代表年 %m 代表月 %d代表日
在date后面加上 +%s,代表的就是Unix时间戳 这个时间戳是从1970年1月1日开始计算的
date +%s

作用:
1 转换时间
将时间戳转换为具体时间:使用 date +%Y-%m-%d %H:%M:%S -d @时间戳,比如 date +%Y-%m-%d
%H:%M:%S -d @1725974749 可得到 2024-09-10 21:25:49。
2 查找信息
我们可以用指定信息
日志中的时间戳是「可读字符串格式」(如 2024-10-26 15:30:45)
前提:
日志行格式类似:[2024-10-26 15:30:45] 用户登录成功[2024-10-26 15:31:20] 数据查询失败
操作步骤:
(1)确定要查找的时间戳范围(如 2024-10-26 15:30:00 到 2024-10-26 15:31:00)。
(2)用 grep 直接匹配时间戳字符串
grep "2024-10-26 15:30:45" app.log
日志中的时间戳是「Unix 时间戳」
前提:
日志行格式类似(时间戳通常在首列或固定位置):1729942245 用户登录成功1729942280 数据查询失败
我们可以用date date +%Y-%m-%d %H:%M:%S -d @时间戳查找文件
今天就介绍到这里了 结束!!!
