Linux教程 / 第 50 节

第5章:文件编辑与处理

掌握文本编辑器和文本处理工具

本章目标

  • 掌握vim基本操作
  • 学会使用sed进行文本替换
  • 了解awk文本处理
  • 掌握文件比较工具
  • 能够高效编辑和处理配置文件

5.1 Vim文本编辑器

5.1.1 Vim简介

Vim (Vi IMproved) 是Linux中最强大的文本编辑器。

为什么学习Vim?

  • 🚀 高效: 纯键盘操作,无需鼠标
  • 🌍 普及: 几乎所有Linux系统都预装
  • 💪 强大: 支持插件,功能丰富
  • 🔧 必备: 服务器环境常用编辑器

5.1.2 Vim模式

Vim有三种主要模式:

普通模式 (Normal Mode)     ← 默认模式,用于导航和命令
    ↓ 按 i, a, o
插入模式 (Insert Mode)     ← 编辑文本
    ↓ 按 ESC
普通模式
    ↓ 按 :
命令模式 (Command Mode)    ← 执行命令 (保存、退出等)

5.1.3 基本操作

打开和退出

# 打开文件
vim file.txt

# 打开文件并跳到第10行
vim +10 file.txt

# 打开多个文件
vim file1.txt file2.txt

# 退出Vim (在命令模式)
:q          # 退出
:q!         # 强制退出,不保存
:w          # 保存
:wq         # 保存并退出
:x          # 保存并退出 (等同于:wq)
ZZ          # 保存并退出 (普通模式)
ZQ          # 不保存退出 (普通模式)

进入插入模式

i           # 在光标前插入
a           # 在光标后插入
I           # 在行首插入
A           # 在行尾插入
o           # 在下一行插入
O           # 在上一行插入

移动光标 (普通模式)

# 基本移动
h           # 左移
j           # 下移
k           # 上移
l           # 右移

# 单词移动
w           # 下一个单词开头
b           # 上一个单词开头
e           # 下一个单词结尾

# 行内移动
0           # 行首
^           # 行首(非空白字符)
$           # 行尾

# 页面移动
gg          # 文件开头
G           # 文件结尾
10G         # 第10行
Ctrl+f      # 下一页
Ctrl+b      # 上一页
Ctrl+d      # 下半页
Ctrl+u      # 上半页

编辑操作

# 删除
x           # 删除字符
dd          # 删除行
dw          # 删除单词
d$          # 删除到行尾
5dd         # 删除5行

# 复制粘贴
yy          # 复制行
yw          # 复制单词
p           # 粘贴到后面
P           # 粘贴到前面
5yy         # 复制5行

# 撤销和重做
u           # 撤销
Ctrl+r      # 重做

# 查找替换
/keyword    # 向下查找
?keyword    # 向上查找
n           # 下一个
N           # 上一个
:%s/old/new/g        # 全文替换
:s/old/new/g         # 当前行替换
:10,20s/old/new/g    # 10-20行替换

5.1.4 实用技巧

# 显示行号
:set number
:set nu

# 取消行号
:set nonumber
:set nonu

# 语法高亮
:syntax on

# 自动缩进
:set autoindent

# 搜索高亮
:set hlsearch

# 取消搜索高亮
:noh

# 分屏
:split          # 水平分屏
:vsplit         # 垂直分屏
Ctrl+w w        # 切换窗口

# 多文件编辑
:e file2.txt    # 打开另一个文件
:bn             # 下一个文件
:bp             # 上一个文件

Vim配置文件 (~/.vimrc)

# 创建配置文件
cat > ~/.vimrc << 'EOF'
set number              " 显示行号
set autoindent          " 自动缩进
set tabstop=4           " Tab宽度
set shiftwidth=4        " 缩进宽度
set expandtab           " Tab转空格
syntax on               " 语法高亮
set hlsearch            " 搜索高亮
set ignorecase          " 忽略大小写
set smartcase           " 智能大小写
EOF

5.2 sed文本处理

5.2.1 sed简介

sed = Stream Editor (流编辑器)

用于文本替换、删除、插入等操作。

5.2.2 基本用法

# 替换 (只显示,不修改文件)
sed 's/old/new/' file.txt          # 替换每行第一个
sed 's/old/new/g' file.txt         # 替换所有
sed 's/old/new/2' file.txt         # 替换每行第2个

# 修改文件 (-i)
sed -i 's/old/new/g' file.txt      # 直接修改文件

# 备份并修改
sed -i.bak 's/old/new/g' file.txt  # 创建.bak备份

# 删除行 (d)
sed '3d' file.txt                  # 删除第3行
sed '1,5d' file.txt                # 删除1-5行
sed '/pattern/d' file.txt          # 删除匹配的行
sed '/^$/d' file.txt               # 删除空行
sed '/^#/d' file.txt               # 删除注释行

# 插入行 (i)
sed '3i\New Line' file.txt         # 在第3行前插入

# 追加行 (a)
sed '3a\New Line' file.txt         # 在第3行后追加

# 打印行 (p)
sed -n '1,5p' file.txt             # 打印1-5行
sed -n '/pattern/p' file.txt       # 打印匹配的行

5.2.3 实用示例

# 删除配置文件的注释和空行
sed '/^#/d; /^$/d' /etc/nginx/nginx.conf

# 批量替换IP地址
sed -i 's/192\.168\.1\.100/192.168.1.200/g' *.conf

# 在文件开头添加内容
sed -i '1i\#!/bin/bash' script.sh

# 替换环境变量
sed 's/${PORT}/8080/g' config.yml

# 删除行尾空格
sed 's/[[:space:]]*$//' file.txt

# 每行前添加行号
sed = file.txt | sed 'N;s/\n/\t/'

5.3 awk文本处理

5.3.1 awk简介

awk是强大的文本分析工具,特别适合处理列数据。

5.3.2 基本用法

# 打印所有行
awk '{print}' file.txt

# 打印第1列
awk '{print $1}' file.txt

# 打印第1和第3列
awk '{print $1, $3}' file.txt

# 打印最后一列
awk '{print $NF}' file.txt

# 指定分隔符 (-F)
awk -F: '{print $1}' /etc/passwd   # 以:分隔

# 条件过滤
awk '$3 > 100' file.txt            # 第3列大于100
awk '/pattern/' file.txt           # 包含pattern的行

# 统计
awk '{sum+=$1} END {print sum}' file.txt    # 求和
awk '{count++} END {print count}' file.txt  # 计数

5.3.3 实用示例

# 统计文件大小
ls -l | awk '{sum+=$5} END {print sum}'

# 查看内存使用
free -m | awk 'NR==2 {print $3"MB used"}'

# 处理CSV文件
awk -F, '{print $1, $3}' data.csv

# 格式化输出
awk '{printf "%-10s %s\n", $1, $2}' file.txt

# 去重
awk '!seen[$0]++' file.txt

# 统计访问IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn

5.4 文件比较

5.4.1 diff命令

# 比较两个文件
diff file1.txt file2.txt

# 并排显示 (-y)
diff -y file1.txt file2.txt

# 忽略空白 (-w)
diff -w file1.txt file2.txt

# 递归比较目录 (-r)
diff -r dir1/ dir2/

# 生成补丁
diff -u file1.txt file2.txt > changes.patch

# 应用补丁
patch file1.txt < changes.patch

5.4.2 其他比较工具

# comm - 比较已排序的文件
comm file1.txt file2.txt

# cmp - 字节比较
cmp file1.txt file2.txt

# vimdiff - 可视化比较
vimdiff file1.txt file2.txt

5.5 实战场景:修改配置文件

场景: 批量修改Nginx配置

# 1. 备份配置文件
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 2. 查看当前配置
grep "listen" /etc/nginx/nginx.conf

# 3. 替换端口号
sed -i 's/listen 80/listen 8080/g' /etc/nginx/nginx.conf

# 4. 删除注释和空行
sed -i '/^#/d; /^$/d' /etc/nginx/nginx.conf

# 5. 验证修改
diff /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf

# 6. 测试配置
nginx -t

# 7. 重载配置
systemctl reload nginx

5.6 常用命令速查

命令说明示例
vim文本编辑器vim file.txt
sed流编辑器sed 's/old/new/g' file.txt
awk文本分析awk '{print $1}' file.txt
diff文件比较diff file1.txt file2.txt

5.7 本章小结

Vim编辑器: 掌握基本操作和常用命令
sed处理: 文本替换、删除、插入
awk分析: 列数据处理和统计
文件比较: diff比较文件差异

下一步学习

  • 第6章: 文件压缩与归档

🎉 恭喜!你已经掌握了文件编辑与处理!

继续学习 → 第6章:文件压缩与归档