# Linux 文本处理命令

URL: https://caijiao.org/linux/commands/text-processing
Source: docs/linux/commands/text-processing.md
Description: Linux文本处理命令详解，包括grep、sed、awk、cut、sort等强大工具的使用方法和实例，掌握这些命令可以高效地分析、修改和转换文本数据。

在Linux系统中，文本处理是一项非常常见的任务。Linux提供了一系列强大的文本处理命令，可以帮助用户高效地分析、修改和转换文本数据。本章节将详细介绍Linux中常用的文本处理命令。

## 文本搜索命令

### grep 命令

`grep` 命令是Linux中最常用的文本搜索工具，用于在文件中查找指定的字符串模式。

```bash
# 在文件中搜索文本
grep "pattern" filename.txt

# 在多个文件中搜索文本
grep "pattern" file1.txt file2.txt

# 递归搜索目录中的所有文件
grep -r "pattern" directory/

# 忽略大小写
grep -i "pattern" filename.txt

# 显示行号
grep -n "pattern" filename.txt

# 显示不匹配的行
grep -v "pattern" filename.txt

# 显示匹配的行数
grep -c "pattern" filename.txt

# 显示匹配行的前后上下文
grep -A 3 -B 2 "pattern" filename.txt  # 显示匹配行及其后3行和前2行

# 使用正则表达式
grep -E "^[A-Z].*\\.$" filename.txt  # 匹配以大写字母开头、以句号结尾的行
```

## 文本替换命令

### sed 命令

`sed` 命令是一个流编辑器，用于对文本进行过滤和替换。

```bash
# 替换文本（不修改原文件）
sed 's/pattern/replacement/' filename.txt

# 替换文本并保存修改
sed -i 's/pattern/replacement/' filename.txt  # 在Linux中
# 或
sed -i '' 's/pattern/replacement/' filename.txt  # 在macOS中

# 全局替换（一行中所有匹配项）
sed 's/pattern/replacement/g' filename.txt

# 替换指定行范围的文本
sed '1,10s/pattern/replacement/' filename.txt  # 替换第1到10行

# 删除匹配的行
sed '/pattern/d' filename.txt

# 在指定行后插入文本
sed '/pattern/a new line of text' filename.txt

# 在指定行前插入文本
sed '/pattern/i new line of text' filename.txt

# 使用正则表达式
sed 's/^ *//g' filename.txt  # 删除行首的空格
```

## 文本分析命令

### awk 命令

`awk` 是一个强大的文本分析工具，它可以处理文件中的行，并根据指定的条件执行相应的操作。

```bash
# 打印文件的指定列（默认以空格分隔）
awk '{print $1, $3}' filename.txt  # 打印第1列和第3列

# 使用自定义分隔符
awk -F, '{print $1, $2}' filename.csv  # 以逗号分隔

# 使用条件过滤
awk '$1 > 100 {print $0}' filename.txt  # 打印第1列大于100的行

# 计算列的总和
awk '{sum += $1} END {print sum}' filename.txt

# 统计行数
awk 'END {print NR}' filename.txt

# 使用内置变量
awk '{print NR ":" $0}' filename.txt  # 显示行号

# 使用函数
awk '{print toupper($1)}' filename.txt  # 将第1列转换为大写
```

## 文本截取命令

### cut 命令

`cut` 命令用于从文件的每一行中提取指定的列。

```bash
# 提取指定范围的字符
cut -c 1-5 filename.txt  # 提取每行的第1到5个字符

# 提取指定字段（默认以制表符分隔）
cut -f 1,3 filename.txt  # 提取第1和第3个字段

# 使用自定义分隔符
cut -d "," -f 1,2 filename.csv  # 以逗号分隔，提取第1和第2个字段

# 排除指定字段
cut --complement -f 2 filename.txt  # 排除第2个字段
```

### head 和 tail 命令

`head` 和 `tail` 命令用于查看文件的开头和结尾部分。

```bash
# 查看文件的前10行
head filename.txt

# 查看文件的前n行
head -n 20 filename.txt

# 查看文件的后10行
tail filename.txt

# 查看文件的后n行
tail -n 20 filename.txt

# 实时查看文件的更新（常用于日志文件）
tail -f logfile.txt
```

## 文本排序和合并命令

### sort 命令

`sort` 命令用于对文本文件的行进行排序。

```bash
# 按字母顺序排序
sort filename.txt

# 按数字顺序排序
sort -n filename.txt

# 按逆序排序
sort -r filename.txt

# 按特定字段排序
sort -k 2 filename.txt  # 按第2个字段排序

# 按多字段排序
sort -k 1,1 -k 2,2n filename.txt  # 先按第1个字段排序，再按第2个字段数字排序

# 忽略大小写排序
sort -f filename.txt

# 去重排序
sort -u filename.txt
```

### uniq 命令

`uniq` 命令用于删除文件中的重复行。

```bash
# 删除相邻的重复行
uniq filename.txt

# 统计每行出现的次数
uniq -c filename.txt

# 只显示重复的行
uniq -d filename.txt

# 只显示不重复的行
uniq -u filename.txt

# 忽略指定数量的字段进行比较
uniq -f 1 filename.txt  # 忽略前1个字段
```

> **注意**：`uniq` 命令只处理相邻的重复行，通常与 `sort` 命令结合使用。

```bash
# 先排序再去重
sort filename.txt | uniq
```

### join 命令

`join` 命令用于根据共同的字段合并两个文件。

```bash
# 根据第一个字段合并两个文件
join file1.txt file2.txt

# 根据指定字段合并
join -1 2 -2 3 file1.txt file2.txt  # 根据file1的第2个字段和file2的第3个字段合并

# 使用自定义分隔符
join -t "," file1.csv file2.csv  # 以逗号分隔

# 即使没有匹配项也显示所有行
join -a 1 file1.txt file2.txt  # 显示file1的所有行
```

## 文本格式化命令

### fmt 命令

`fmt` 命令用于重新格式化文本文件。

```bash
# 格式化文本，默认宽度75个字符
fmt filename.txt

# 指定宽度
fmt -w 100 filename.txt

# 保留空白行
fmt -s filename.txt
```

### pr 命令

`pr` 命令用于为打印准备文本文件。

```bash
# 为文件添加页头和页尾
pr filename.txt

# 设置每页行数
pr -l 50 filename.txt

# 双列打印
pr -2 filename.txt

# 显示行号
pr -n filename.txt
```

## 文本转换命令

### tr 命令

`tr` 命令用于转换或删除字符。

```bash
# 将大写字母转换为小写字母
cat filename.txt | tr 'A-Z' 'a-z'

# 将小写字母转换为大写字母
cat filename.txt | tr 'a-z' 'A-Z'

# 删除指定字符
cat filename.txt | tr -d '0-9'  # 删除所有数字

# 压缩连续的重复字符
cat filename.txt | tr -s ' '  # 压缩多余的空格

# 将制表符转换为空格
cat filename.txt | tr '\\t' ' '
```

### paste 命令

`paste` 命令用于横向合并文件的行。

```bash
# 合并两个文件的对应行
paste file1.txt file2.txt

# 使用自定义分隔符
paste -d ',' file1.txt file2.txt  # 以逗号分隔

# 将文件按列合并
paste -s file1.txt file2.txt  # 将每个文件的所有行合并为一行
```

## 高级文本处理技巧

### 命令组合

Linux文本处理的强大之处在于可以通过管道将多个命令组合使用。

```bash
# 查找包含特定文本的行，然后提取指定列，最后排序
cat filename.txt | grep "pattern" | cut -d ',' -f 2 | sort -n

# 统计文件中每个单词出现的次数
grep -o "\\b[a-zA-Z]\\+\\b" filename.txt | sort | uniq -c | sort -nr

# 替换文件中的文本，并备份原文件
sed -i.bak 's/old/new/g' filename.txt

# 查找并删除包含特定文本的行
sed -i '/pattern/d' filename.txt
```

### 多行文本处理

对于跨行的文本处理，可以使用特殊的方法。

```bash
# 替换跨行的文本
sed ':a;N;$!ba;s/pattern1\\npattern2/replacement/g' filename.txt

# 使用awk处理多行
awk 'BEGIN{RS=""} {print $0}' filename.txt  # 将空行视为记录分隔符
```

## 总结

本章节介绍了Linux系统中常用的文本处理命令，包括文本搜索、替换、分析、截取、排序、合并、格式化和转换等操作。这些命令是Linux用户处理文本数据的强大工具，可以大大提高工作效率。

在实际使用中，这些命令通常会结合使用，通过管道（|）连接多个命令，形成复杂的数据处理流水线。掌握这些文本处理命令是成为Linux高级用户的重要一步。
