1.自己编辑一个文件,随便编辑或者复制一些内容,20行以上,作为以下任务的练习对象。
2.如何查看上面文件的大小、权限以及所属
❯ ls -l ymyw_group.md-rw-rw---- 1 root ymyw 5431 Aug 16 15:43 ymyw_group.md
字段 | 含义 |
---|---|
-rw-r--r-- | 文件权限(所有者可读写,其他用户只读) |
1 | 硬链接数量 |
user | 文件所有者(用户) |
group | 文件所属组(用户组) |
1234 | 文件大小(单位:字节) |
Aug 15 10:00 | 最后修改时间 |
./ymyw_group.md | 文件名 |
3.如何更改此文件的权限及所属
1.更改文件权限
- 数字模式:
chmod 644 ./ymyw_group.md
6
(所有者:读写) =4(读) + 2(写)
4
(所属组:只读)4
(其他用户:只读)
- 符号模式:
chmod u=rw,g=r,o=r ./ymyw_group.md
u
:所有者(user)g
:所属组(group)o
:其他用户(others)=
:精确设置权限rw/r
:读写或只读
❯ chmod 644 ./ymyw_group.md❯ ls -l ymyw_group.md-rw-r--r-- 1 root ymyw 5431 Aug 16 15:43 ymyw_group.md
2.更改文件所有者
将文件所有者改为dev:
❯ ls -l ymyw_group.md-rw-r--r-- 1 root ymyw 5431 Aug 16 15:43 ymyw_group.md❯ chown dev ./ymyw_group.md❯ ls -l ymyw_group.md-rw-r--r-- 1 dev ymyw 5431 Aug 16 15:43 ymyw_group.md
4.使用ls -l查看文件时,第一个字符串有什么含义。比如 drwxr-xr-x中开头的d和-rw-r—r—中开头的-。
使用 ls -l
命令查看文件时,第一个字符(如 d
、-
、l
等)表示 文件类型,它揭示了该条目是文件、目录、链接还是其他特殊类型
首字符 | 类型 | 示例 | 说明 |
---|---|---|---|
- | 普通文件 | -rw-r--r-- | 常规文件(如文本、图片、二进制可执行文件等)。 |
d | 目录 | drwxr-xr-x | 文件夹,包含其他文件或子目录。 |
l | 符号链接 | lrwxrwxrwx | 快捷方式,指向另一个文件或目录(如 ln -s 目标 链接名 创建的链接)。 |
c | 字符设备文件 | crw--w---- | 按字符流操作的设备(如键盘、终端 /dev/tty )。 |
b | 块设备文件 | brw-rw---- | 按数据块操作的设备(如硬盘 /dev/sda )。 |
s | 套接字(Socket) | srwxr-xr-x | 进程间通信的文件(如 MySQL 的 /var/run/mysqld/mysqld.sock )。 |
p | 管道(FIFO) | prw-r--r-- | 先进先出的特殊文件(用于进程间通信)。 |
5.什么是管道符,有什么作用
管道符(|
),用于将 前一个命令的输出 作为 后一个命令的输入
例如:ifconfig | less
,就是将ifconfig本应该输出的结果通过less来查看
例如:ps aux | grep nginx
,就是从所有进程中筛选出包含nginx的行
6.如何统计目录下有多少文件和目录,比如/etc目录
ls -l
:长格式列出内容,每行开头字符表示类型(-
文件,d
目录)。grep -c
:统计匹配行数。
❯ ls -l /etc | grep -c '^-' # 统计文件数量79❯ ls -l /etc | grep -c '^d' # 统计目录数量85
7.如何查看统计上面创建的文件有多少行
❯ wc -l ymyw_group.md89 ymyw_group.md❯ cat ymyw_group.md | wc -l89
8.如何只查看上面创建文件的前10行或者后10行
❯ head -n 10 ymyw_group.md # 显示前10行❯ tail -n 10 ymyw_group.md # 显示后10行
9.如何实时查看一个文件内容的增加,比如/var/log/kern.log
1.使用tail -f
sudo tail -f /var/log/kern.log
-
实时输出新增内容:文件末尾新增的内容会立即显示在终端。
-
快捷键控制:
-
按
Ctrl+C
退出监控。 -
按
Ctrl+S
暂停输出,Ctrl+Q
恢复输出。 -
结合过滤(如只显示包含 “error” 的行):
Terminal window sudo tail -f /var/log/kern.log | grep "error"
-
2. 使用 less
的实时监控模式
less +F /var/log/kern.log
- 按
Ctrl+C
暂停监控(返回普通less
模式)。 - 在普通模式下按
F
重新进入实时监控。 - 按
q
完全退出less
。 - 可随时切换为普通
less
模式,支持全文搜索(/
键)、跳转行号(:
后输入行号)等。
10./var/log目录是干啥的,有哪些关键的日志
/var/log
目录是 Linux 系统中 集中存储所有日志文件的核心目录,记录了系统、服务、应用程序的运行状态和事件。
日志文件 | 作用 | 查看命令 |
---|---|---|
messages | 通用系统日志(CentOS/RHEL),包含内核、服务等混合信息。 | sudo cat /var/log/messages |
syslog | 系统日志(Ubuntu/Debian),记录内核、服务等事件。 | sudo less /var/log/syslog |
kern.log | 内核专属日志(硬件错误、驱动加载、内核崩溃等)。 | sudo tail -f /var/log/kern.log |
boot.log | 系统启动过程的详细记录。 |
11.家目录有什么作用,每个用户的家目录相同吗?如何进入当前用户的家目录
-
存储个人文件:默认存放用户的文档、下载、图片等(如
~/Documents
、~/Downloads
)。 -
保存用户配置:隐藏文件(如
~/.bashrc
、~/.ssh/
)存储个性化设置和密钥。 -
隔离用户数据:不同用户的文件互不可见(除非显式设置权限)。
-
环境变量锚点:
~
符号在命令行中自动展开为当前用户的家目录路径(如cd ~
)。
普通用户:/home/用户名
,例如xh的路径是/home/xh
root 用户:/root
,注意:/root
不是 /home/root
12.什么是相对路径,什么是绝对路径
1.绝对路径(Absolute Path)
- 从 文件系统的根目录(
/
) 开始的完整路径,唯一指向目标文件/目录 - 以
/
开头 - 与当前目录无关,无论在哪里执行命令,路径始终有效。
- 唯一性:每个文件只有一个绝对路径
2.相对路径(Relative Path)
- 从 当前工作目录(Current Working Directory) 出发的路径,依赖于执行命令时的位置
- 不以
/
开头 - 使用特殊符号:
.
:当前目录(同./
)。..
:上级目录(同../
)。
- 灵活性:路径随当前目录变化而变化
13.什么场景下使用相对路径,什么场景下使用绝对路径
1.使用相对路径
- 操作当前目录附近的文件
- 编写可移植脚本,脚本需在不同目录中运行时,避免硬编码绝对路径。
- 频繁切换邻近目录
2.使用绝对路径
- 操作系统级文件
- 确保命令在任何目录下执行结果一致时
- 路径可能因当前目录变化导致错误时
14.如何在一个文件中筛选某关键字,并且只展示有关键字的行。
grep "error" /var/log/kern.log
15.如何在筛选后需要展示关键字的上下三行
grep -A 3 -B 3 "error" /var/log/kern.log# 或者grep -C 3 "error" /var/log/kern.log
16.如何替换文件中的关键字,比如将文件中的aaa替换为bbb。
先备份原文件:cp ymyw_group.md ymyw_group.md.bak
1.使用sed命令修改
sed -i 's/aaa/bbb/g' ymyw_group.md
-i
:直接修改原文件(不加则仅预览不修改)。s/旧内容/新内容/
:替换语法。g
:全局替换(每行所有匹配,不加则每行仅替换第一个匹配)。
2.使用vim编辑器修改
进入命令模式,输入:%s/aaa/bbb/g
,然后回车,保存并退出:wq!
%
:全文范围(可改为行号如1,10
表示第1-10行)。s/aaa/bbb/g
:与sed
语法相同。
17.>和>>是干啥的,各有什么场景
1.>
:覆盖重定向
-
将命令的输出 覆盖写入 到指定文件(若文件不存在则创建,若存在则清空原有内容后写入)。
Terminal window echo "Hello World" > output.txt # 写入 "Hello World" 到 output.txt(覆盖原有内容)ls -l > file_list.txt # 将当前目录文件列表覆盖写入 file_list.txt
2.>>
:追加重定向
-
将命令的输出 追加到文件末尾(不修改原有内容)。
Terminal window echo "New line" >> log.txt # 在 log.txt 末尾追加一行 "New line"date >> timestamp.log # 将当前时间追加到日志文件
18.如何在不打开文件的情况下,清空文件内容。
> ymyw_group.md.bak
19.什么是文件描述符
在 Linux/Unix 系统中,文件描述符(File Descriptor,简称 fd) 是操作系统用于 跟踪和管理打开文件或 I/O 资源 的整数标识符。它是进程与文件、管道、套接字等资源交互的底层接口。
1.文件描述符的本质
-
内核级句柄
-
每个进程启动时,内核会为其维护一张 文件描述符表,记录该进程打开的所有资源。
-
文件描述符是此表中的 索引号(通常为 0、1、2、3…)。
-
-
抽象接口
- 对进程而言,文件描述符是访问文件、设备、网络套接字等的统一接口,无需关心底层实现细节。
2.文件描述符的分配规则
描述符值 | 默认分配对象 | 符号常量 | 典型用途 |
---|---|---|---|
0 | 标准输入(stdin) | STDIN_FILENO | 读取键盘输入或重定向输入。 |
1 | 标准输出(stdout) | STDOUT_FILENO | 输出到终端或重定向到文件。 |
2 | 标准错误(stderr) | STDERR_FILENO | 输出错误信息(默认到终端)。 |
3+ | 其他打开的文件 | - | 用户打开的文件、管道、套接字等。 |
3.文件描述符的核心特性
- 进程私有性
- 每个进程的文件描述符独立分配,相同数值在不同进程中可能指向不同文件。
- 继承性
- 子进程会继承父进程的文件描述符(除非显式关闭或设置
CLOEXEC
标志)。
- 子进程会继承父进程的文件描述符(除非显式关闭或设置
- 资源限制
- 系统限制单个进程可打开的文件描述符数量(通过
ulimit -n
查看,默认通常为 1024)。
- 系统限制单个进程可打开的文件描述符数量(通过
20.什么是标准输入,标准输出,错误输出
标准输入(stdin)、标准输出(stdout)和标准错误(stderr) 是进程与外部环境交互的三种基本数据流,统称为 标准 I/O 流。它们是操作系统为每个进程自动创建的通信通道,默认关联终端设备,但可通过重定向修改其目标
名称 | 文件描述符 | 符号常量 | 默认绑定 | 典型用途 |
---|---|---|---|---|
标准输入 | 0 | STDIN_FILENO | 键盘(/dev/tty) | 读取用户输入或重定向的文件输入。 |
标准输出 | 1 | STDOUT_FILENO | 终端屏幕 | 输出程序正常结果。 |
标准错误 | 2 | STDERR_FILENO | 终端屏幕 | 输出错误消息(与正常输出分离)。 |
21.如何查看历史执行的命令并重新执行
1.基础查看
history # 显示全部历史命令(带行号)history 20 # 显示最近20条命令
2.搜索历史命令:history | grep "apt"
3.重新执行历史命令
-
按行号执行:
!1025
,重新执行历史记录中编号为1025的命令 -
交互式选择执行:
Terminal window fc -l # 列出最近历史fc 1025 # 编辑编号1025的命令后执行(会打开编辑器)
22.什么是别名,如何设置别名,ll是哪个命令的别名
1.别名
在 Linux/Unix 系统中,别名(Alias) 是用户为常用命令或复杂命令序列定义的快捷方式,可以显著提升命令行操作效率。它的作用是将一个自定义的短字符串映射到长命令或命令组合。
- 仅对当前用户有效(除非全局配置)
- 临时生效(会话结束后消失)或永久生效(需写入配置文件)
2.设置别名的方法
-
临时设置:
alias 别名='原始命令'
,例如alias update='sudo apt update && sudo apt upgrade'
-
永久设置(对所有新会话生效):将别名定义写入 Shell 配置文件
-
Bash:
~/.bashrc
或~/.bash_profile
-
Zsh:
~/.zshrc
-
操作:
Terminal window echo "alias update='sudo apt update && sudo apt upgrade'" >> ~/.bashrc # 追加到配置文件source ~/.bashrc # 立即生效
-
-
查看已定义的别名:
alias
列出所有别名,alias update
查看update的具体定义 -
删除别名:
unalias update
3.经典别名 ll
的真相
默认定义:ll
通常是 ls -alF
或 ls -l
的别名。
验证方法:alias ll
,输出为ll='ls -lh'