Linux基础复习第三天
1.如何查看文件的大小、权限以及所属
以一个测试文件myfile.txt
举例:
-
查看文件大小、权限以及所属组
- 文件权限由 10 个字符表示,格式为:
[文件类型][所有者权限][组权限][其他用户权限]
。
都可以通过:
ls -lh <文件名> ls -l <文件名>
参数解析:
-l
:以长格式显示文件信息。-h
:以人类可读的格式(如 KB、MB)显示文件大小。
权限解析:
-
:表示普通文件(d
表示目录,l
表示符号链接)。rw-
:所有者(user
)有读(r
)和写(w
)权限。r--
:所属组(group
)有读权限。r--
:其他用户有读权限。
输出解析:
- 输出中第 3 列是 文件所有者,第 4 列是 所属组。
示例:
ls -lh myfile.txt #输出为: -rw-rw---- 1 longlijisi ymyw 240 Jul 3 11:23 myfile.txt ls -l <文件名> #输出为: -rw-rw---- 1 longlijisi ymyw 1495 Jul 3 13:00 myfile.txt
- 文件权限由 10 个字符表示,格式为:
-
查看文件的详细元数据
通过命令**
stat <文件名>
**,可以显示文件的详细信息,包括大小、权限、时间戳等。stat myfile.txt #输出为: File: myfile.txt Size: 1495 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 2490388 Links: 1 Access: (0660/-rw-rw----) Uid: ( 1000/longlijisi) Gid: ( 1003/ ymyw) Access: 2025-07-03 12:59:47.818078861 +0000 Modify: 2025-07-03 13:00:05.805932197 +0000 Change: 2025-07-03 13:00:05.805932197 +0000 Birth: 2025-07-03 02:48:22.358429987 +0000
输出解析:
Size
:文件的大小为1495字节,单位是字节,byte。文件内容的实际数据量;Blocks
:文件在磁盘上占用8个块(block)。文件系统以“块”为最小存储单位(通常为 4KB),即使文件很小(如 1495 字节),也会占用至少 1 个块(4KB)。这里占用 8 个块(8 × 4KB = 32KB),说明文件可能包含元数据或其他存储分配策略。IO Blocks
:文件系统的 块大小 为 4096 字节(4KB),文件系统的 块大小 为 4096 字节(4KB)。Device
:用于标识文件所在的磁盘或分区(如/dev/sda1
)。Inode
:inode 是文件系统的元数据结构,存储文件的权限、时间戳、链接数等信息。每个文件有唯一的 inode 编号,但文件名可能通过硬链接指向同一 inode。Links
:文件的硬链接数为1。硬链接数表示有多少个文件名指向该 inode,如果硬链接数大于 1,说明文件有多个名称(如通过ln
命令创建的硬链接)。这里为1
,表示文件只有一个名称。
2.如何更改此文件的权限及所属
-
修改文件的权限
-
符号法:
chmod [u/g/o/a][+/-/=][r/w/x] 文件名
#比如,给myfile文件,赋予所有人可执行权限 chmod u+x myfile.txt #再次查看文件权限,输出为: -rwxrw---- 1 longlijisi ymyw 1.5K Jul 3 13:00 myfile.txt
-
数字法:
chmod 权限数字 文件名
#755所有者可读、写、执行(7),组用户可读、执行(5),其他用户可读、执行(5)。 chmod 755 myfile.txt #输出为: -rwxr-xr-x 1 longlijisi ymyw 1.5K Jul 3 13:00 myfile.txt
-
-
修改文件所属组
在修改文件的所有者、所属组时,需进行提权,否则没有修改的权限。
-
chown :新属组 文件名
sudo chown :dev myfile.txt #输出为: -rwxr-xr-x 1 longlijisi dev 1.5K Jul 3 13:00 myfile.txt
-
chgrp 新属组 文件名
sudo chgrp ymyw myfile.txt #输出为: -rwxr-xr-x 1 longlijisi ymyw 1.5K Jul 3 13:00 myfile.txt
-
3.使用ll查看文件时,第一个字符串有什么含义。比如 drwxr-xr-x中开头的d和-rw-r–r–中开头的-。
在 Linux 中使用 ll
命令(即 ls -l
)查看文件时,第一个字符表示文件的类型。以下是常见的文件类型及其含义:
符号 | 含义 | 说明 |
---|---|---|
- | 普通文件 | 最常见的文件类型,如文本文件、图片、可执行文件等。 |
d | 目录(Directory) | 表示这是一个目录(文件夹)。 |
l | 符号链接(Symbolic Link) | 表示这是一个软链接(指向其他文件或目录的快捷方式)。 |
c | 字符设备文件 | 表示字符设备(如键盘、鼠标等按字符流输入输出的设备)。 |
b | 块设备文件 | 表示块设备(如硬盘、U盘等按块读写的设备)。 |
s | 套接字(Socket) | 表示网络套接字文件(用于进程间通信)。 |
p | 命名管道(FIFO) | 表示命名管道(用于进程间通信的先进先出队列)。 |
4.什么是管道符,有什么作用
管道符(|
)是 Unix/Linux 系统中用于连接命令的符号,它的作用是
-
将前一个命令的输出结果传递到后一个命令的输入,无需中间文件存储。
-
可以串联多个命令,完成多步骤的数据处理。
-
结合
wc
、sort
、uniq
等工具,实现计数、排序、去重等操作。 -
对大型文件或实时数据流(如日志)进行即时处理,无需等待数据全部加载。
-
避免使用临时文件,直接通过管道符连接命令,使操作更高效。
常见的应用场景:
-
过滤内容:
ls | grep "log" # 查找当前目录中包含 "log" 的文件名。
-
排序与查重:
cat data.txt | sort | uniq #对文件内容排序并去除重复行。
-
统计行数/单词数:
cat file.txt | wc -l # 统计行数 cat file.txt | wc -w # 统计单词数
-
提取特定字段:
ps aux | awk '{print $1}' # 提取进程所有者
-
处理日志文件:
cat access.log | awk '{print $1}' | sort | uniq -c # 统计访问日志中不同 IP 的访问次数。
-
杀掉占用端口的进程:
sudo netstat -tuln | grep ':80' | awk '{print $7}' | cut -d/ -f1 | xargs sudo kill -9 # 查找并终止占用 80 端口的进程。
5.如何统计目录下有多少文件和目录,比如/etc目录
-
方法1:使用
find
命令-
统计文件数量(包括子目录)
find /etc -type f | wc -l
解释:
find /etc
:从 /etc 目录开始搜索。
-type f
:仅匹配文件(不包括目录)。
wc -l
:统计输出的行数(即文件数量)。 -
统计目录数量(包括子目录)
find /etc -type d | wc -l
解释:
-type d
:仅匹配目录。
-
-
方法2:使用
ls
和grep
组合-
统计文件数量(包括子目录)
ls -lR /etc | grep "^-" | wc -l
解释:
ls -lR /etc
:递归列出 /etc 目录及其子目录下的所有文件和目录的详细信息。
grep "^-"
:过滤以 - 开头的行(表示普通文件)。
wc -l
:统计行数。 -
统计目录数量(包括子目录)
ls -lR /etc | grep "^d" | wc -l
解释:
grep "^d"
:过滤以 d 开头的行(表示目录)。
-
-
方法3:使用
tree
命令-
统计文件和目录总数,并过滤得到文件数量
tree -a /etc | grep "/$" | wc -l
解释:
grep "/$"
:筛选以 / 结尾的行(即目录)。
wc -l
:统计目录数量 -
统计目录数量
tree -d /etc | grep -v "directories" | tail -n 1 | awk '{print $1}'
解释:
-d
:仅显示目录。
grep -v "directories"
:排除包含 “directories” 的行。
-
-
方法4:Python脚本进行统计
import os etc_path = "/etc" file_count = 0 dir_count = 0 for root, dirs, files in os.walk(etc_path): dir_count += 1 # 当前目录也算一个 file_count += len(files) print(f"文件总数: {file_count}") print(f"目录总数: {dir_count}")
6.如何查看统计上面创建的文件有多少行
-
wc-l
命令(最常用)高效、简单。但是默认包含空行,即文件末尾的换行符也算一行。
wc -l myfile.txt # wc 是 "word count" 的缩写,-l 参数表示统计行数。 #输出为: 119 myfile.txt # 输出格式为:行数 文件名。
-
cat和wc组合
与
wc -l 文件名
效果相同,但略微低效(多了一次管道传输)。cat myfile.txt | wc -l #输出为: 119
-
使用
grep
命令可排除空行,适合大文件处理。
grep -v '^$' myfile.txt | wc -l # grep -v '^$' 过滤掉所有空行(^$ 表示空行)。 #输出为: 119
-
使用Python脚本
逐行读取文件并计数,适合大文件(内存占用低)
with open("myfile.txt", "r") as f: lines = sum(1 for line in f) print(f"行数: {lines}")
-
使用
sed
或awk
-
sed
方法,无需额外处理,适合快速获取总行数的情况。:sed -n '$=' myfile.txt # $= 表示输出最后一行的行号,即总行数。 #输出为: 119
-
awk
方法,简洁、适合脚本嵌套:awk 'END{print NR}' myfile.txt # NR 是 awk 内置变量,表示当前行号(总行数) #输出为: 119
-
7.如何只查看上面创建文件的前10行或者后10行
(1)查看文件前10行
-
head
命令-
head 文件名
,默认查看文件的前10行head myfile.txt
-
head -n 行数 文件名
,可自定义查看文件的前n行内容head -n 10 myfile.txt
-
-
sed
命令适用于小文件,或者结合脚本中进行操作。
-
sed -n '1,10p' 文件名
sed -n '1,10p' myfile.txt
解释:
-n
:禁用默认的输出(只输出匹配的行)。
'1,10p'
:指定打印第1到第10行。、
-
-
awk
命令需进行行号判断,适合结合字段处理,如特定列。
-
awk 'NR <= 10' 文件名
awk 'NR <= 10' myfile.txt
解释:
NR
:awk 内置变量,表示当前行号(从1开始计数)。
'NR <= 10'
:匹配行号小于等于10的行。
-
(2)查看文件后10行
-
tail
命令-
tail 文件名
,默认查看文件的后10行tail myfile.txt
-
tail -n 行数 文件名
,可自定义查看文件的后n行内容tail -10 myfile.txt
-
实时查看文件的末尾变化(动态监控)
tail -f myfile.txt # -f 可以实时查看新增的内容
-
-
sed
命令-
sed -n '$-9,$p' 文件名
sed -n '$-9,$p' myfile.txt
原理:
$
:表示文件的最后一行。
$-9
:表示倒数第10行($-9 = 最后一行 - 9
)。
'p'
:打印匹配的行。
注意:
此语法依赖 GNU sed(大多数 Linux 发行版默认支持)。
如果文件总行数少于10,会直接输出所有行。
-
-
awk
命令-
awk '{a[NR]=$0} END {for(i=NR-9;i<=NR;i++) print a[i]}' 文件名
awk '{a[NR]=$0} END {for(i=NR-9;i<=NR;i++) print a[i]}' myfile.txt
原理:
a[NR]=$0
:将每一行存储到数组a
中(键为行号,值为行内容)。
END
:文件读取完成后执行操作。
for(i=NR-9;i<=NR;i++)
:循环输出最后10行。
特点:
需要一次性读取整个文件到内存,适合小文件。
可扩展性高(如输出中间行或自定义范围)。
-
8.如何实时查看一个文件内容的增加,比如/var/log/kern.log
使用tail -f 文件名
,可以实时查看一个文件的末尾动态变化
tail -f /var/log/kern.log
实时追踪:首选 tail -f 或 tailf。
交互式查看:使用 less +F。
多文件监控:使用 multitail。
日志轮转处理:使用 tail -F。
高级分析:使用 logwatch 或 inotifywait。
9./var/log目录是干啥的,有哪些关键的日志
在 Linux 系统中,/var/log
是一个存储系统和应用程序日志文件的核心目录,记录了系统的运行状态、错误信息、安全事件、服务行为等关键数据。
/var/log的主要作用有:
-
系统日志:记录系统启动、运行、关闭过程中的事件(如内核消息、服务状态、硬件检测等)。
- 例如:系统崩溃、服务异常、硬件错误等。
-
应用日志:记录应用程序(如 Apache、MySQL、SSH 等)的运行日志。
- 例如:Web 服务器访问日志、数据库错误日志等。
-
安全日志:记录用户登录尝试、权限变更、认证失败等安全相关事件。
- 例如:SSH 登录失败、
sudo
命令执行记录等。
- 例如:SSH 登录失败、
-
定时任务日志:记录
cron
或anacron
定时任务的执行情况。 -
启动日志:记录系统启动过程中的硬件检测和初始化信息。
关键的日志和用途:
日志文件 | 作用 | 常见用途 |
---|---|---|
/var/log/messages | 系统全局日志(Red Hat/CentOS/Fedora 等系统默认使用)。 | 记录系统启动信息、内核消息、服务状态、硬件事件等。 |
/var/log/syslog | 系统日志(Debian/Ubuntu 等系统默认使用)。 | 类似 messages ,但由 rsyslog 或 syslog-ng 管理。 |
/var/log/auth.log | 认证相关日志(Debian/Ubuntu 等系统使用)。 | 记录用户登录、su 切换、sudo 命令、SSH 登录尝试(成功/失败)等。 |
/var/log/secure | 认证相关日志(Red Hat/CentOS/Fedora 等系统使用)。 | 与 auth.log 功能相同,但文件名不同。 |
/var/log/kern.log | 内核日志。 | 记录内核消息(如硬件错误、驱动问题、OOM 内存不足等)。 |
/var/log/dmesg | 内核环缓冲区日志(系统启动时的硬件检测信息)。 | 用于诊断硬件故障、驱动问题或启动失败。 |
/var/log/boot.log | 系统启动日志。 | 记录系统启动过程中的服务状态和错误信息。 |
/var/log/daemon.log | 后台守护进程日志(如 cron、atd 等)。 | 记录后台服务的运行状态和错误信息。 |
/var/log/cron.log | 定时任务日志。 | 记录 cron 或 anacron 定时任务的执行情况。 |
/var/log/mail.log | 邮件服务日志(如 Postfix、Sendmail)。 | 记录邮件发送、接收、错误信息等。 |
/var/log/apache2/ | Apache Web 服务器日志(如 access.log 和 error.log )。 | 记录网站访问请求和错误信息。 |
/var/log/nginx/ | Nginx Web 服务器日志(如 access.log 和 error.log )。 | 记录网站访问请求和错误信息。 |
/var/log/mysql/ | MySQL 数据库日志(如 error.log )。 | 记录数据库启动、错误、查询等信息。 |
/var/log/audit/ | 审计日志(由 auditd 服务生成)。 | 记录系统调用、文件访问等详细操作,用于安全审计。 |
/var/log/wtmp | 二进制格式日志,记录用户登录/登出信息。 | 通过 last 命令查看用户登录历史。 |
/var/log/btmp | 二进制格式日志,记录失败的登录尝试。 | 通过 lastb 命令查看登录失败记录。 |
/var/log/lastlog | 二进制格式日志,记录每个用户的最近一次登录信息。 | 通过 lastlog 命令查看。 |
查看日志的常用命令
- 实时监控日志
tail -f /var/log/syslog # 实时查看日志新增内容
tail -F /var/log/kern.log # 支持日志轮转(文件被压缩或重命名后自动跟踪新文件)
- 搜索特定关键词
grep "ERROR" /var/log/messages # 查找包含 "ERROR" 的行
grep "Failed password" /var/log/auth.log # 查找登录失败记录
- 分页查看大文件
less /var/log/syslog # 分页浏览日志
- 查看内核日志
dmesg # 查看内核环缓冲区日志
dmesg | grep -i error # 过滤内核错误
-
日志轮转管理
-
日志文件可能通过
logrotate
工具压缩或轮转,旧日志通常以.gz
结尾:zgrep "ERROR" /var/log/syslog-20250704.gz # 查看压缩日志
-
关键场景示例
-
系统崩溃或服务异常
- 查看
/var/log/messages
或/var/log/syslog
,搜索CRITICAL
、ERROR
、FAILED
等关键词。
- 查看
-
安全入侵检测
- 查看
/var/log/auth.log
或/var/log/secure
,搜索Failed password
、sudo
等记录。
- 查看
-
硬件故障排查
- 查看
/var/log/dmesg
或/var/log/kern.log
,搜索Hardware Error
、Driver
等。
- 查看
-
Web 服务问题
- 查看
/var/log/apache2/error.log
或/var/log/nginx/error.log
,分析 HTTP 错误。
- 查看
10.家目录有什么作用,每个用户的家目录相同吗?如何进入当前用户的家目录
在 Linux 系统中,家目录(Home Directory) 是分配给每个用户的个人工作空间。
主要作用包括:
-
个人文件存储:用户可以在家目录中保存个人文档、图片、音乐等文件。
- 例如:
/home/user1/Documents
、/home/user2/Pictures
。
- 例如:
-
配置文件管理:多数应用程序会将用户的配置文件(如
.bashrc
、.vimrc
)存储在家目录中,用于保存个性化设置。 -
隐私保护:家目录默认仅对用户本人可读写,其他用户无法访问(除非权限被显式开放),保障数据安全。
-
环境变量支持:系统通过环境变量
$HOME
标识用户的家目录路径,许多程序和脚本依赖此变量定位用户数据。 -
登录默认位置:用户登录后,系统会自动进入其家目录,方便用户直接操作个人文件。
每个用户的家目录是不相同的:
- 默认路径:普通用户的家目录位于
/home/用户名
(如/home/john
、/home/anna
)。 - 超级用户(root):其家目录通常为
/root
,而非/home/root
。 - 自定义设置:管理员可通过
usermod
命令更改用户的家目录路径(如迁移到其他分区)。
进入当前用户的家目录
- 使用
cd
命令:不带参数时,cd
会自动切换到当前用户的家目录。
cd
- 使用波浪号
~
:波浪号~
是$HOME
的快捷符号,表示当前用户的家目录。
cd ~
- 使用绝对路径:替换
用户名
为当前用户名(如cd /home/john
)。
cd /home/用户名
- 通过环境变量:
$HOME
是系统预定义的环境变量,直接指向当前用户的家目录。
cd $HOME
11.什么是相对路径,什么是绝对路径
-
相对路径
是基于基于当前工作目录(Current Working Directory)的位置,描述目标文件或目录的路径。它依赖于当前所处的位置,而非根目录。
.
:表示当前目录(如./file.txt
)。..
:表示上级目录(如../config/settings.json
)。
特点:
- 灵活性:路径较短,适应性强。
- 环境依赖:如果当前工作目录变化,相对路径可能失效。
- 可移植性:适合项目内部文件引用,便于迁移和协作。
示例:
- 如果当前目录是
/home/user
,文件路径为documents/report.txt
。 - 网页 HTML 中:
<img src="images/logo.png">
(相对于当前页面路径)。
-
绝对路径
是从文件系统的根目录(Linux 中为
/
,Windows 中为盘符如C:\
)开始,描述文件或目录的完整路径。它明确标识了文件在整个文件系统中的位置。特点:
- 唯一性:路径固定,不受当前工作目录的影响。
- 稳定性:无论程序运行在哪个位置,路径始终指向同一位置。
- 冗长:路径较长,可能降低可读性和灵活性。
示例:
- Linux:
/home/user/documents/report.txt
- Windows:
C:\Users\user\Documents\report.txt
- 网页 URL:
https://example.com/images/logo.png
(包含协议和域名)
12.什么场景下使用相对路径,什么场景下使用绝对路径
-
相对路径的使用场景
- 项目内部资源引用(如 HTML/CSS/JS 文件)。
- 命令行操作相邻文件(如
cd src/
、cp ../config.env .
)。 - 团队协作开发(避免机器路径差异)。
-
绝对路径的使用场景
- 系统配置文件(如 Nginx 配置)。
- 跨磁盘或跨分区访问文件。
- 脚本中需要确定性引用资源(如日志文件路径)。
13.如何在一个文件中筛选某关键字,并且只展示有关键字的行。
-
使用**
grep
**命令grep
是最常用的文本搜索工具,可以直接筛选包含关键字的行。基本语法:
grep "关键字" 文件名
示例:
假设文件名为
example.txt
,关键字为error
:grep "error" example.txt
- 输出:
example.txt
中所有包含error
的行。
常用选项:
-
忽略大小写:
grep -i "error" example.txt
-
显示行号:
grep -n "error" example.txt
-
递归搜索多个文件:
grep -r "error" /path/to/directory/
-
反向匹配(显示不包含关键字的行):
grep -v "error" example.txt
- 输出:
-
使用
awk
命令awk
是强大的文本处理工具,可以根据条件筛选行。基本语法:
awk '/关键字/' 文件名
示例:
awk '/error/' example.txt
- 输出:
example.txt
中所有包含error
的行。
进阶用法:
-
结合正则表达式:
awk '/^error/' example.txt # 匹配以 "error" 开头的行
-
输出特定字段:
awk '/error/ {print $1}' example.txt # 只输出匹配行的第一个字段
- 输出:
-
使用
sed
命令sed
是流编辑器,可以筛选并操作匹配的行。基本语法:
sed -n '/关键字/p' 文件名
示例:
sed -n '/error/p' example.txt
- 输出:
example.txt
中所有包含error
的行。
- 输出:
-
使用Python脚本(适用于复杂需求)
如果需要更灵活的处理(如计算数值、提取特定格式),可以用 Python 脚本。
示例:
with open("example.txt", "r") as file: for line in file: if "error" in line: print(line.strip())
-
结合
find
和grep
搜索目录如果需要搜索整个目录下的文件:
find /path/to/directory -type f -exec grep -l "error" {} \;
-l
选项会列出包含关键字的文件名。
14.如何在筛选后需要展示关键字的上下三行
-
使用
grep
的-C
选项(推荐)语法:
grep -C 3 "关键字" 文件名
-C 3
:表示显示匹配行的 前后各3行(总共7行)。- “关键字”:要搜索的文本。
- 文件名:目标文件。
-
分别指定上下文行数
如果需要更灵活地控制上下文行数(例如前2行、后3行),可以结合
-A
和-B
选项:-A NUM
:显示匹配行后的NUM
行。-B NUM
:显示匹配行前的NUM
行。
语法:
grep -A 3 -B 3 "关键字" 文件名
-
递归搜索目录中的上下文
如果需要在多个文件或目录中递归搜索,并显示上下文,可以添加
-r
选项:grep -r -C 3 "关键字" /path/to/directory/
-
其他常用选项
-
忽略大小写:添加
-i
。grep -i -C 3 "error" file.txt
-
显示行号:添加
-n
。grep -n -C 3 "keyword" file.txt
-
只输出匹配行数:添加
-c
。grep -c -C 3 "keyword" file.txt
-
15.如何替换文件中的关键字,比如将文件中的aaa替换为bbb。
-
使用
sed
命令(推荐)sed
是最常用的文本替换工具,支持直接修改文件或输出到新文件。语法:
sed -i 's/旧关键字/新关键字/g' 文件名
-
替换文件中的所有
aaa
为bbb
:sed -i 's/aaa/bbb/g' example.txt
-i
:直接修改原文件(若需备份,可使用-i.bak
生成备份文件)。s/aaa/bbb/g
:s
表示替换,g
表示全局替换(一行中所有匹配项)。 -
替换每行第一个匹配项(不加g):
sed -i 's/aaa/bbb/' example.txt
-
替换特定行的关键词:
sed -i '3s/old/new/' example.txt # 只替换第3行的第一个匹配项
-
-
**结合
grep
和sed
**批量替换多个文件中的关键字如果需要递归替换目录下所有文件中的关键字的情况
-
替换当前目录及其子目录中所有文件的
aaa
为bbb
:sed -i 's/aaa/bbb/g' $(grep -rl 'bbb' ./*)
注释:
grep -rl 'bbb' ./*
:递归查找包含bbb
的文件并列出文件名。$(...)
:将命令结果传递给sed
。
-
-
使用
awk
命令awk
也可以实现替换,但通常不如sed
直观。语法:
awk '{gsub(/旧关键字/, "新关键字"); print}' 文件名 > 新文件名
示例:
-
替换文件中的
aaa
为bbb
:awk '{gsub(/aaa/, "bbb"); print}' example.txt > new_example.txt
-
-
使用
tr
命令(字符级替换)tr
适用于逐字符替换(如替换单个字符或字符集)语法:
tr '旧字符' '新字符' < 文件名 > 新文件名
示例:
-
替换所有
aaa
为bbb
:tr 'aaa' 'bbb' < example.txt > new_example.txt
-
-
使用
vim
编辑器如果需要手动替换,可以使用
vim
步骤:
(1)打开文件:
vim example.txt
(1)进入命令模式(按
:
),输入以下命令::%s/aaa/bbb/g
%
:表示对整个文件操作。s/aaa/bbb/g
:替换所有匹配项。
(3)保存并退出:
:wq
-
使用
perl
命令perl
是功能强大的脚本语言,也可以用于替换示例:
-
替换文件中的
aaa
为bbb
:perl -pi -e 's/aaa/bbb/g' example.txt
-
-
注意事项
- 备份文件:在执行替换前,建议备份原文件(例如使用
cp
或sed -i.bak
)。 - 正则表达式:
sed
和awk
支持正则表达式,可实现复杂替换(例如匹配数字、特殊字符等)。 - 权限问题:确保有文件写入权限,否则替换会失败。
- 备份文件:在执行替换前,建议备份原文件(例如使用
16. >和>>是干啥的,各有什么场景
在 Linux 系统中,>
和 >>
是 输出重定向 的两个关键操作符,它们的作用和使用场景如下
-
>
:覆盖写入功能:将命令的标准输出(
stdout
)覆盖写入到指定文件中。- 如果目标文件 不存在,则创建新文件。
- 如果目标文件 已存在,则 清空文件内容,并将新输出写入文件。
场景:
-
生成新文件:需要将命令结果保存为一个新文件时。
ls > filelist.txt # 将当前目录列表写入 filelist.txt(覆盖原有内容)
-
替换旧数据:需要替换文件内容为最新结果时。
date > timestamp.txt # 每次执行都会更新 timestamp.txt 为当前时间
-
丢弃输出:将输出重定向到
/dev/null
(相当于丢弃)。command > /dev/null # 执行命令时不显示输出
-
>>
:追加写入功能:将命令的标准输出(
stdout
)追加到指定文件的末尾。- 如果目标文件 不存在,则创建新文件。
- 如果目标文件 已存在,则 保留原有内容,并将新输出追加到文件末尾。
场景:
-
日志记录:需要将多次执行的输出结果保存到同一个日志文件中。
echo "New log entry" >> log.txt # 追加日志到 log.txt
-
合并数据:将多个命令的输出结果合并到一个文件中。
cat file1.txt >> combined.txt # 追加 file1.txt 内容到 combined.txt cat file2.txt >> combined.txt # 追加 file2.txt 内容到 combined.txt
-
集群配置:在分布式系统中,将多个节点的公钥追加到认证文件中。
cat id_rsa.pub >> ~/.ssh/authorized_keys # 追加公钥到认证文件
17.如何在不打开文件的情况下,清空文件内容。
-
使用
>
重定向将空内容重定向到文件,直接覆盖文件内容
命令:
> 文件名
示例:
> example.txt
- 优点:语法简单,执行速度快。
- 注意:文件必须存在且可写;若文件不存在,会创建一个空文件。
-
使用
turncate
命令直接将文件大小设置为 0 字节
命令:
truncate -s 0 文件名
示例:
truncate -s 0 log.txt
- 优点:语义清晰,适合脚本中调用。
- 适用场景:对大文件高效,避免读取文件内容。
-
使用
cat /dev/null
重定向将
/dev/null
(空设备文件)的内容覆盖到目标文件。命令:
cat /dev/null > 文件名
示例:
cat /dev/null > access.log
- 优点:兼容性好,适合老版本系统或容器环境。
- 原理:
/dev/null
是一个特殊的“黑洞”设备,读取它会得到空内容。
-
使用
echo
命令向文件写入空字符串。
命令:
echo -n > 文件名
示例:
echo -n > data.txt
- 注意:
-n
参数避免在文件末尾添加换行符(默认echo
会添加换行)。
- 注意:
-
使用
dd
命令从
/dev/null
读取数据并写入目标文件。命令:
dd if=/dev/null of=文件名
示例:
dd if=/dev/null of=large_file.bin
- 优点:适合需要复制或转换文件的场景,但此方法主要用于清空文件时效率较低。
-
使用
cp /dev/null
命令将
/dev/null
的内容复制到目标文件。命令:
cp /dev/null 文件名
示例:
cp /dev/null output.txt
- 特点:与
cat /dev/null >
效果相同,但语法更简洁。
- 特点:与
-
使用
:>
操作符(Bash 特有)Bash 中的
:>
是>
的简写形式。命令:
:> 文件名
示例:
:> config.ini
- 注意:仅适用于支持此语法的 Shell(如 Bash)。
-
使用
true
或:
命令将
true
或:
命令的输出(无内容)重定向到文件。命令:
true > 文件名 : > 文件名
示例:
true > temp.log
- 特点:与
>
效果相同,但语义更明确(true
表示“无操作”)。
- 特点:与
18.什么是文件描述符
文件描述符(File Descriptor,FD)是 Linux/Unix 系统中用于标识打开文件或 I/O 资源的非负整数。
-
本质:
-
文件描述符是一个非负整数(如
0
、1
、2
、3
等)。 -
它是进程与内核之间的一个索引,指向内核维护的文件表项(记录文件状态、读写位置等信息)。
-
-
作用:
-
标识资源:每个打开的文件、设备、管道或网络连接都会被分配一个唯一的文件描述符。
-
操作资源:进程通过文件描述符调用系统调用(如
read()
、write()
、close()
)来读取、写入或关闭资源。
-
-
常见文件描述符编号:
- 0:标准输入(stdin),默认从键盘读取数据。
- 1:标准输出(stdout),默认输出到终端。
- 2:标准错误(stderr),默认输出错误信息到终端。
- 3+:其他资源(如文件、网络套接字等)。
-
如何查看文件描述符
-
通过
/proc/<PID>/fd
:Linux 系统中,每个进程的文件描述符存储在
/proc/<进程ID>/fd/
目录下。示例:
ls -l /proc/$$/fd # 查看当前 Shell 进程的文件描述符
-
通过
lsof
命令:使用
lsof -p <PID>
查看进程打开的所有文件描述符。示例:
lsof -p $$ # 查看当前 Shell 进程的所有文件描述符
-
-
文件描述符的生命周期
-
分配:
通过系统调用(如
open()
、socket()
、pipe()
)分配文件描述符。 -
使用:
通过
read()
、write()
、send()
、recv()
等操作读写资源。 -
关闭:
通过
close(fd)
释放文件描述符,防止资源泄漏。关闭后,文件描述符会被回收,可重新分配给其他资源。
-
19.什么是标准输入,标准输出,错误输出
-
标准输入(Standard Input, stdin)
定义:程序从外部接收数据的默认通道,通常与键盘关联,但也可以通过文件或管道重定向输入。
文件描述符:
0
(在 Unix/Linux 系统中)。用途:
-
用户通过键盘输入数据(如命令行参数、交互式输入)。
-
从文件或另一个程序的输出中读取数据(通过重定向或管道)。
-
示例:
在命令行中运行
cat
命令时,若不指定文件,cat
会从标准输入读取数据并输出:$ cat Hello World # 用户输入 Hello World # cat 输出
-
-
标准输出(Standard Output, stdout)
定义:程序向外部发送正常输出数据的默认通道,通常与终端屏幕关联,但可以通过重定向输出到文件或另一个程序。
文件描述符:
1
(在 Unix/Linux 系统中)。用途:
- 显示程序的正常运行结果(如计算结果、状态信息)。
- 将数据传递给其他程序(通过管道)。
示例:
-
在命令行中运行
echo "Hello"
:$ echo "Hello" Hello # 输出到终端
-
在 Python 中使用
print()
print("Hello, stdout") # 默认输出到 stdout
-
标准错误(Standard Error, stderr)
定义:
程序向外部发送错误信息的默认通道,通常与终端屏幕关联。与标准输出不同,标准错误不会被普通重定向操作影响。文件描述符:
2
(在 Unix/Linux 系统中)。用途:
- 显示程序运行中的错误信息(如文件未找到、语法错误)。
- 即使标准输出被重定向,标准错误仍会直接输出到终端,便于调试。
示例:
-
运行一个不存在的命令:
$ nonexistent_command bash: nonexistent_command: command not found # 错误信息输出到 stderr
20.如何查看历史执行的命令
-
使用
history
命令这是最直接的方式,直接输入以下命令即可查看当前用户的命令历史:
history
-
默认显示:通常显示最近的 500 条命令(可通过
HISTSIZE
环境变量调整)。 -
显示指定数量的命令:
history 10 # 显示最近的 10 条命令
-
如果需要查找特定命令,可以结合
grep
使用:history | grep "keyword"
示例:
查找所有包含apt的命令:
history | grep "apt"
-
显示带时间戳的命令历史
默认情况下,
history
命令不显示时间戳。可以通过设置环境变量启用时间记录:临时生效(当前会话):
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " history
永久生效(修改配置文件):
在
~/.bashrc
或~/.bash_profile
中添加export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
然后执行
source ~/.bashrc
生效。 -
清除历史命令
清除当前会话的历史记录:
history -c
清除
.bash_history
文件:> ~/.bash_history
-
-
cat
直接查看历史命令文件历史命令默认保存在用户主目录的
.bash_history
文件中(对于 Bash Shell):cat ~/.bash_history # 或使用分页工具查看 less ~/.bash_history
-
fc
命令fc
(fix command)是 Bash 提供的另一个历史命令管理工具-
列出历史命令:
fc -l # 列出所有命令 fc -l 10 # 列出第 10 条开始的命令
-
编辑并重新执行命令:
fc # 打开默认编辑器(如 Vim)修改并执行历史命令
-
21.什么是别名,如何设置别名,ll
是哪个命令的别名
别名(Alias) 是一种为命令、函数、接口或其他操作定义简短替代名称的机制。通过别名,用户可以用更简洁或更易记的方式执行复杂的命令,提高操作效率。
-
命令别名
将长命令或复杂命令参数替换为简短的名称。例如:
- 在 Linux 中,
ll
可以作为ls -l
的别名。 - 在 PowerShell 中,
dir
是Get-ChildItem
的别名。
- 在 Linux 中,
-
网络接口别名
为物理网卡绑定多个 IP 地址(虚拟接口),例如:
- 在 Linux 中,为
eth0
设置eth0:0
作为别名接口。
- 在 Linux 中,为
-
Linux/Bash 中的命令别名设置
-
临时设置(当前会话有效):
alias 别名='实际命令' # 示例:为 ls -l 设置别名 ll alias ll='ls -l'
-
永久设置(编辑配置文件):
修改
~/.bashrc
或~/.bash_profile
文件:echo "alias ll='ls -l'" >> ~/.bashrc
使配置生效:
source ~/.bashrc
-
查看已有别名:
alias # 查看单个别名 alias ll
-
删除别名:
unalias 别名 # 示例:删除 ll 别名 unalias ll
-
-
网络接口别名设置(Linux)
-
临时设置(重启后失效):
sudo ip addr add 192.168.1.100/24 dev eth0 label eth0:0
-
永久设置(以 Debian/Ubuntu 为例):
编辑
/etc/network/interfaces
文件:auto eth0:0 iface eth0:0 inet static address 192.168.1.100 netmask 255.255.255.0
重启网络服务:
sudo systemctl restart networking
-