文本处理预科

一、seq 命令 - 数字序列生成器

1.1 seq 命令基础

功能说明

生成数字序列,支持整数和浮点数

基本语法

seq [选项] 第一个数 [增量] 最后一个数

常用选项

选项 说明 示例
-w 等宽输出(前导零) seq -w 1 10
-s 指定分隔符 seq -s " " 1 5
-f 格式化输出 seq -f "%02g" 1 5

实战示例

# 基础序列生成
seq 5                    # 1到5
# 输出:1 2 3 4 5

seq 3 7                 # 3到7
# 输出:3 4 5 6 7

seq 1 2 10              # 1到10,步长为2
# 输出:1 3 5 7 9

# 等宽输出(前导零)
seq -w 8 12             # 08到12
# 输出:08 09 10 11 12

# 自定义分隔符
seq -s " -> " 1 3       # 使用箭头分隔
# 输出:1 -> 2 -> 3

seq -s $'\n' 1 3        # 每行一个数字(默认)
# 输出:
# 1
# 2
# 3

# 格式化输出
seq -f "Number %02g" 1 3
# 输出:
# Number 01
# Number 02
# Number 03

# 浮点数序列
seq 0.5 0.1 1.0         # 0.5到1.0,步长0.1
# 输出:0.5 0.6 0.7 0.8 0.9 1.0

二、wc 命令 - 文本统计工具

2.1 wc 命令基础

功能说明

统计文件的行数、单词数、字节数

基本语法

wc [选项] 文件...

常用选项

选项 说明 示例
-l 只统计行数 wc -l file.txt
-w 只统计单词数 wc -w file.txt
-c 只统计字节数 wc -c file.txt
-m 统计字符数 wc -m file.txt
-L 显示最长行的长度 wc -L file.txt

实战示例

# 创建测试文件
echo -e "Hello World\nThis is a test\nLinux commands" > test.txt

# 完整统计
wc test.txt
# 输出:3 7 38 test.txt
# 含义:3行 7个单词 38字节

# 分别统计
wc -l test.txt          # 行数:3
wc -w test.txt          # 单词数:7  
wc -c test.txt          # 字节数:38
wc -m test.txt          # 字符数:38(ASCII相同)

# 统计多个文件
wc *.txt
# 输出:
#  3  7 38 test.txt
#  5 12 60 another.txt
#  8 19 98 total

# 统计最长行
wc -L test.txt          # 最长行:13个字符

# 结合管道使用
ls -l /bin | wc -l      # 统计/bin下文件数量
ps aux | wc -l          # 统计进程数量

管道

Linux 管道(Pipe)详解

一、管道的基本概念

1.1 什么是管道?

管道(Pipe) 是Linux/Unix系统中一种强大的进程间通信机制,用竖线符号 | 表示。它允许将一个命令的输出作为另一个命令的输入

基本语法

命令1 | 命令2 | 命令3 ...

1.2 管道的工作原理

输入 → 命令1 → 输出 → 命令2 → 输出 → 命令3 → 最终输出
              ↑
             管道连接

二、管道的基础用法

2.1 基本管道操作

简单示例

# 查看进程,然后过滤出包含"chrome"的进程
ps aux | grep chrome

# 列出文件,然后统计行数
ls -l | wc -l

# 查看日志,然后搜索错误信息
cat /var/log/syslog | grep "error"

实际工作流程分解

# 没有管道的情况(繁琐)
ps aux > temp.txt
grep chrome temp.txt
rm temp.txt

# 使用管道(简洁高效)
ps aux | grep chrome

2.2 管道的数据流向

标准流说明

流类型 文件描述符 默认方向 重定向符号
标准输入 0 键盘输入 <0<
标准输出 1 屏幕输出 >1>
标准错误 2 屏幕输出 2>

管道只传递标准输出

# 管道只传递标准输出,不传递标准错误
ls /存在目录 /不存在目录 2>/dev/null | wc -l
# 只有标准输出进入管道,错误被重定向到/dev/null

ls /存在目录 /不存在目录 | wc -l
# 错误信息会显示在屏幕上,但不会进入管道

三、管道的实战应用

3.1 数据处理管道

文本处理流水线

# 复杂的文本处理管道
cat access.log |          # 读取日志文件
    grep "GET" |          # 过滤GET请求
    cut -d' ' -f1 |       # 提取IP地址
    sort |                # 排序IP
    uniq -c |             # 统计每个IP出现次数
    sort -nr |            # 按次数降序排序
    head -10              # 显示前10个

# 等效于:
cat access.log | grep "GET" | cut -d' ' -f1 | sort | uniq -c | sort -nr | head -10

系统监控管道

# 监控系统资源的管道
ps aux |                  # 获取所有进程
    sort -nrk4 |          # 按内存使用率排序
    head -5 |             # 取前5个
    awk '{print $4 "% " $11}'  # 格式化输出

# 输出示例:
# 15.2% chrome
# 12.8% java
# 8.5%  mysqld

3.2 文件操作管道

批量文件处理

# 查找并处理特定文件
find . -name "*.log" |     # 查找所有日志文件
    xargs wc -l |          # 统计每个文件行数
    sort -nr |             # 按行数降序排序
    head -5                # 显示最大的5个文件

# 批量重命名文件
ls *.txt |                # 列出所有txt文件
    sed 's/\.txt$/.bak/' | # 修改扩展名
    xargs -I {} sh -c 'mv "${1%.txt}.txt" "$1"' _ {}  # 执行重命名

四、管道的特性与限制

4.1 管道的重要特性

1. 单向通信

# 管道是单向的,只能从左到右
命令1 | 命令2  # ✓ 正确
命令2 | 命令1  # ✗ 错误的数据流向

2. 并行执行

# 管道中的命令是并行执行的
echo "hello" | sed 's/hello/HELLO/' | tr 'A-Z' 'a-z'
# 三个命令同时运行,数据流式处理

3. 缓冲区机制

# 管道有缓冲区,小数据立即传递,大数据分段传递
dd if=/dev/zero bs=1M count=100 | gzip | wc -c
# 数据会分段通过管道传递

4.2 管道的限制与解决方案

管道只能使用一次

# 错误:试图多次使用同一个管道输出
ls -l | tee filelist.txt | wc -l
# 这里管道输出被tee和wc同时使用是可以的,因为tee会复制数据流

# 但如果需要多次处理同一数据,应该:
ls -l > temp.txt
wc -l < temp.txt
cat temp.txt | head -10
rm temp.txt

# 或者使用进程替换
wc -l <(ls -l)
head -10 <(ls -l)

错误处理限制

# 管道中某个命令失败,整个管道可能继续执行
ls /不存在的目录 | wc -l
# ls失败,但wc仍然会执行(统计0行)

# 设置pipefail可以检测管道中任何命令的失败
set -o pipefail
ls /不存在的目录 | wc -l
echo "上条命令退出状态: $?"  # 非0表示失败

5.2 进程替换(Process Substitution)

基本用法

# 比较两个命令的输出
diff <(ls /bin) <(ls /usr/bin)

# 将多个命令的输出作为输入
paste <(seq 1 5) <(seq 6 10) <(seq 11 15)
# 输出:
# 1       6       11
# 2       7       12
# 3       8       13
# 4       9       14
# 5       10      15

进程替换实战

# 比较文件差异
diff <(sort file1.txt) <(sort file2.txt)

# 多个数据源合并
join <(sort users.txt) <(sort sales.txt)

# 实时监控比较
watch -n1 'diff <(ps aux | sort) <(cat process_snapshot.txt)'

六、管道与重定向的结合

6.1 混合使用管道和重定向

保存中间结果

# 保存管道中的中间结果
ls -l | tee directory_listing.txt | grep "Dec" | tee december_files.txt | wc -l

# 同时输出到屏幕和文件
echo "系统报告" | tee report.txt
date | tee -a report.txt  # -a 表示追加
ps aux | tee -a report.txt

错误流重定向

# 将标准错误也重定向到管道
ls /存在目录 /不存在目录 2>&1 | wc -l
# 2>&1 表示将标准错误重定向到标准输出

# 分别处理标准输出和标准错误
{ ls /存在目录 /不存在目录 | wc -l; } 2> errors.log

6.2 复杂的重定向模式

三通管道(Tee Pipeline)

# 复杂的多路输出管道
cat data.txt | 
    tee >(grep "success" > success.txt) |
    tee >(grep "error" > errors.txt) |
    tee >(grep "warning" > warnings.txt) |
    wc -l > total_count.txt

# 查看结果
echo "成功: $(wc -l < success.txt)"
echo "错误: $(wc -l < errors.txt)"  
echo "警告: $(wc -l < warnings.txt)"
echo "总计: $(cat total_count.txt)"
作者:严锋  创建时间:2023-12-06 09:29
最后编辑:严锋  更新时间:2025-11-04 21:50