- 文本处理预科
- 一、seq 命令 - 数字序列生成器
- 1.1 seq 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 二、wc 命令 - 文本统计工具
- 2.1 wc 命令基础
- 功能说明
- 基本语法
- 常用选项
- 实战示例
- 管道
- Linux 管道(Pipe)详解
- 一、管道的基本概念
- 1.1 什么是管道?
- 基本语法
- 1.2 管道的工作原理
- 二、管道的基础用法
- 2.1 基本管道操作
- 简单示例
- 实际工作流程分解
- 2.2 管道的数据流向
- 标准流说明
- 管道只传递标准输出
- 三、管道的实战应用
- 3.1 数据处理管道
- 文本处理流水线
- 系统监控管道
- 3.2 文件操作管道
- 批量文件处理
- 四、管道的特性与限制
- 4.1 管道的重要特性
- 1. 单向通信
- 2. 并行执行
- 3. 缓冲区机制
- 4.2 管道的限制与解决方案
- 管道只能使用一次
- 错误处理限制
- 5.2 进程替换(Process Substitution)
- 基本用法
- 进程替换实战
- 六、管道与重定向的结合
- 6.1 混合使用管道和重定向
- 保存中间结果
- 错误流重定向
- 6.2 复杂的重定向模式
- 三通管道(Tee Pipeline)
文本处理预科
一、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 chrome2.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% mysqld3.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.log6.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
最后编辑:严锋 更新时间:2025-11-04 21:50