Skip to content

文本与文件管理

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

大文件优先使用 lessheadtail,避免 cat 一次输出大量内容。


搜索与处理文本

grep

bash
# 递归查找包含 ERROR 的文本,并显示行号
grep -RIn --exclude-dir=.git 'ERROR' /var/log/myapp

# 使用扩展正则匹配多个关键字
grep -E 'ERROR|WARN' app.log

cut、sort 与 uniq

bash
# 按逗号分隔,提取第 1、3 列
cut -d ',' -f 1,3 data.csv

# 按第二列进行数值倒序排列
sort -k2,2nr data.txt

# 统计重复行;uniq 只能合并相邻的重复行,因此通常先排序
sort access.log | uniq -c | sort -nr

sort -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.log

sed

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 前应先用 lsfinddu 确认精确目标,避免对变量、通配符或宽泛目录执行递归删除。


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 --showgrep -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