文本与文件管理
Linux 将普通文件、目录、设备和许多系统状态统一为文件接口。本篇整理日常查看、搜索、转换和安全删除文件时最常用的命令。
查看文件内容
| 命令 | 用途 | 示例 |
|---|---|---|
cat | 一次输出整个文件 | cat app.conf |
tac | 从最后一行开始反向输出 | tac app.log |
less | 分页浏览,可前后滚动和搜索 | less app.log |
head | 查看文件开头 | head -n 20 app.log |
tail | 查看文件末尾或持续跟踪 | tail -n 100 -f app.log |
wc | 统计行数、单词数和字节数 | wc -l app.log |
nl | 输出内容并添加行号 | nl -ba app.conf |
大文件优先使用 less、head 或 tail,避免 cat 一次输出大量内容。
搜索与处理文本
grep
bash
# 递归查找包含 ERROR 的文本,并显示行号
grep -RIn --exclude-dir=.git 'ERROR' /var/log/myapp
# 使用扩展正则匹配多个关键字
grep -E 'ERROR|WARN' app.logcut、sort 与 uniq
bash
# 按逗号分隔,提取第 1、3 列
cut -d ',' -f 1,3 data.csv
# 按第二列进行数值倒序排列
sort -k2,2nr data.txt
# 统计重复行;uniq 只能合并相邻的重复行,因此通常先排序
sort access.log | uniq -c | sort -nrsort -n 表示按数值比较,sort -r 表示反转排序结果。二者不是“正序”和“倒序”的简单对应关系。
awk
bash
# 输出第一列和倒数第二列
awk '{print $1, $(NF-1)}' data.txt
# 以斜杠分隔并输出倒数第二段
awk -F '/' '{print $(NF-1)}' paths.txt
# 删除指定字符串后输出
awk '{gsub(/DEBUG|TRACE/, ""); print}' app.logsed
bash
# 只预览替换结果,不修改原文件
sed 's/old.example.com/new.example.com/g' app.conf
# 修改文件并保留 .bak 备份
sed -i.bak 's/old.example.com/new.example.com/g' app.conf修改重要配置前先生成备份,并使用
diff -u app.conf.bak app.conf检查变化。
组合命令
| 命令 | 用途 | 注意事项 |
|---|---|---|
tr | 替换或删除字符 | 适合字符级处理,不支持普通字符串替换 |
paste | 按列合并文件 | 默认使用 Tab 分隔 |
comm | 比较两个已排序文件 | 默认输出仅在左侧、仅在右侧、两侧共有三列 |
diff | 按行比较文件 | diff -u old new 更适合阅读和生成补丁 |
tee | 同时写入文件和标准输出 | -a 表示追加,默认会覆盖文件 |
xargs | 将标准输入转换为命令参数 | 文件名场景应配合 NUL 分隔,避免空格和换行问题 |
iconv | 转换文本编码 | 转换前确认源编码 |
查找文件
find 的时间条件按完整的 24 小时或分钟区间计算:
| 条件 | 说明 |
|---|---|
-mmin -30 | 内容在最近 30 分钟内修改过 |
-mmin +30 | 内容修改时间早于 30 分钟前 |
-mtime -7 | 内容在最近 7 天内修改过 |
-mtime +30 | 内容修改时间早于 30 个完整的 24 小时前 |
-amin / -atime | 按最后访问时间筛选 |
-cmin / -ctime | 按元数据或内容状态变更时间筛选 |
bash
# 查找 30 天前修改过的普通日志文件
find /data/logs -type f -mtime +30 -print
# 正式删除前先使用 -print 核对,再将它替换为 -delete
find /data/logs -type f -mtime +30 -delete
# 安全地将结果传给其他命令
find /data/logs -type f -name '*.log' -print0 | xargs -0r gzip不要使用
find ... | xargs rm -rf删除目录。目录的修改时间不代表内部文件都已过期,文件名中的空格和换行也会导致目标解析错误。
管理文件与目录
bash
# 创建两个目录并设置权限
mkdir -p -m 755 /data/{app,backup}
# 复制文件并保留权限、时间和符号链接等属性
cp -a /data/app /data/backup/
# 删除空目录
rmdir /data/empty-dir
# 查看文件类型
file archive.tar.gz
# 查看目录占用空间
du -sh /data/*执行 rm -r 前应先用 ls、find 或 du 确认精确目标,避免对变量、通配符或宽泛目录执行递归删除。
Vim 常用操作
插入与编辑
| 按键 | 作用 |
|---|---|
i | 在光标前进入插入模式 |
a | 在光标后进入插入模式 |
I | 在当前行第一个非空字符前插入 |
A | 在当前行末尾插入 |
o | 在当前行下方新建一行 |
O | 在当前行上方新建一行 |
x | 删除光标处字符 |
dw | 删除到下一个单词开头 |
dd | 删除当前行 |
yy | 复制当前行 |
p / P | 在光标后 / 前粘贴 |
u / Ctrl+r | 撤销 / 重做 |
搜索、替换与跳转
| 命令 | 作用 |
|---|---|
/pattern | 向后搜索 |
?pattern | 向前搜索 |
n / N | 沿当前搜索方向 / 反方向跳转 |
:%s/old/new/g | 替换全文所有匹配项 |
:10,20s/old/new/g | 替换第 10~20 行中的匹配项 |
gg / G | 跳到文件开头 / 末尾 |
:e! | 放弃未保存修改并从磁盘重新加载 |
:set number | 显示行号 |
可视模式与窗口
| 按键 | 作用 |
|---|---|
v | 字符可视模式 |
V | 行可视模式 |
Ctrl+v | 块可视模式 |
Ctrl+w w | 切换到下一个窗口 |
Ctrl+w h/j/k/l | 切换到左/下/上/右窗口 |
:wincmd w | 终端截获快捷键时切换窗口 |
挂载 CIFS 共享目录
安装客户端:
bash
# RHEL 系列
sudo dnf install -y cifs-utils
# Debian / Ubuntu
sudo apt install -y cifs-utils不要在命令行中直接填写密码。创建仅 root 可读的凭据文件:
bash
sudo install -m 600 /dev/null /etc/samba/myshare.credentials
sudoedit /etc/samba/myshare.credentials文件内容:
ini
username=myuser
password=replace-with-password
# domain=EXAMPLE临时挂载:
bash
sudo mkdir -p /mnt/myshare
sudo mount -t cifs //server/share /mnt/myshare \
-o credentials=/etc/samba/myshare.credentials,vers=3.0持久化挂载可写入 /etc/fstab:
text
//server/share /mnt/myshare cifs credentials=/etc/samba/myshare.credentials,vers=3.0,_netdev,nofail 0 0写入后先执行 sudo mount -a 验证,确认无误后再重启。
创建 Swap 文件
下面创建一个 4 GiB Swap 文件。创建前先用 swapon --show 和 grep -n swap /etc/fstab 检查现有配置。
bash
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
swapon --show如果文件系统不支持 fallocate 创建的 Swap 文件,可改用:
bash
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress