深入理解 Unix Shell 管道 Pipes:基础和高级用法 xargs tee awk sed等(中英双语)
深入理解 Unix Shell 管道(|)
1. 什么是管道(Pipe)?
管道(|
)是 Unix/Linux Shell 中最强大的功能之一,它允许将一个命令的输出作为另一个命令的输入,从而实现数据流的处理。通过管道,可以将多个简单的命令组合成更复杂的功能,而无需创建临时文件。
例如,以下命令会列出当前目录下所有包含“txt”字符串的文件:
ls -l | grep txt
这里 ls -l
生成的输出被 grep txt
读取并处理,最终输出匹配的文件。
2. 管道的基本用法
2.1 过滤文本数据
grep
命令用于查找特定的文本:
cat access.log | grep "404"
这里 cat access.log
输出整个日志文件,而 grep "404"
仅提取包含 “404” 的行。
2.2 排序数据
sort
命令用于对数据排序,可以与 uniq
结合使用去重:
cat names.txt | sort | uniq
解释见下文。
2.3 统计数据
wc
命令用于计算行数、单词数和字符数,例如:
cat data.txt | wc -l # 计算文件的行数
2.4 组合多个命令
ls -l | grep ".sh" | wc -l
该命令先列出所有文件,然后筛选出 .sh
结尾的文件,并计算数量。
3. 高级管道用法
3.1 使用 tee
在管道中保存数据
通常,管道中的数据只会传递给下一个命令,不会存储。如果需要边处理边保存,可以使用 tee
:
ls -l | tee output.txt | grep "log"
这会将 ls -l
的输出同时写入 output.txt
并传递给 grep "log"
处理。
3.2 使用 xargs
处理管道数据
有些命令不能直接处理管道输入,例如 rm
不能接受 ls | rm
,此时可以使用 xargs
:
ls | grep "tmp" | xargs rm -rf
这里 xargs
将管道数据转换为 rm
命令的参数。详细解析 xargs
的作用请见下文。
3.3 使用 cut
提取特定列
cut
用于从输入数据中提取特定的字段。例如:
cat /etc/passwd | cut -d: -f1
该命令从 /etc/passwd
文件中提取用户名(:
分隔的第一列)。
关于cut详细使用,见后文。
3.4 使用 awk
进行高级文本处理
awk
是一种强大的文本处理工具,例如计算 CSV 文件的某一列总和:
cat sales.csv | awk -F"," '{sum += $2} END {print sum}'
这里 -F","
指定 ,
为分隔符,$2
表示第二列。
3.5 使用 sed
进行文本替换
sed
可以用来替换文本,例如:
cat file.txt | sed 's/old/new/g'
将 file.txt
中所有 old
替换为 new
。
关于sed的解析请看后文。
4. 实际开发中的应用
4.1 监控日志文件
可以使用 tail -f
实时查看日志并过滤关键字:
tail -f /var/log/syslog | grep "error"
4.2 查找并删除大文件
查找大于 100MB 的文件并删除:
find /var/log -size +100M | xargs rm -rf
4.3 统计访问量最高的 IP
分析 access.log
中访问最多的 IP 地址:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
这个命令的具体解析见后文
5. 性能优化与注意事项
5.1 避免 cat
的无用使用
cat file.txt | grep "error"
可以优化为:
grep "error" file.txt
5.2 使用 pv
监控管道数据流
pv
可以显示管道中的数据流量,例如:
dd if=/dev/zero bs=1M count=100 | pv | dd of=/dev/null
解析看后文。
5.3 使用 parallel
提高处理效率
xargs
可以并行执行命令,但 parallel
更强大:
cat urls.txt | parallel wget {}
解释见后文。
6. 结论
管道(|
)是 Unix Shell 中的核心功能,它允许将多个命令组合起来,创建强大的数据处理流程。掌握基本的管道用法,以及 xargs
、tee
、awk
、sed
等高级工具,可以极大地提高 Shell 编程效率。在实际开发中,管道被广泛用于日志分析、数据处理、批量任务执行等场景。
cat names.txt | sort | uniq解释
cat names.txt | sort | uniq
这个命令的作用是读取 names.txt
文件中的内容,进行排序,并去除重复的行,具体执行过程如下:
-
cat names.txt
cat
命令用于读取names.txt
文件的内容,并将其输出到标准输出(终端)。- 例如,如果
names.txt
包含以下内容:Alice Bob Alice Charlie Bob
- 运行
cat names.txt
后的输出:Alice Bob Alice Charlie Bob
-
sort
sort
命令对输入的数据进行排序(按字母顺序排列)。- 经过
sort
处理后,数据变成:Alice Alice Bob Bob Charlie
-
uniq
uniq
命令会去除连续的重复行,只保留唯一的行。- 由于
sort
已经将相同的名称排列在一起,uniq
可以有效去重:Alice Bob Charlie
总结
该命令的整体作用是:
- 读取
names.txt
文件 - 对内容进行排序
- 去除重复的名称
最终得到一个去重后按字母顺序排列的名单。
如果你想保留重复的计数,可以使用:
cat names.txt | sort | uniq -c
这会显示每个名称的出现次数,例如:
2 Alice2 Bob1 Charlie
详细解析 xargs
的作用
在 Unix/Linux Shell 中,xargs
是一个非常强大的命令,它的主要作用是 将标准输入的数据转换为命令行参数,并传递给指定的命令执行。
示例命令
ls | grep "tmp" | xargs rm -rf
该命令的作用是 删除当前目录下所有包含“tmp”字符串的文件或文件夹。
下面分步解析执行过程:
1. ls
ls
ls
列出当前目录下的所有文件和文件夹。- 假设当前目录包含以下文件:
file1.txt temp1.log temp2.tmp example.tmp script.sh
2. grep "tmp"
ls | grep "tmp"
grep "tmp"
过滤ls
输出的文件列表,仅保留包含 “tmp” 的文件。- 经过
grep
处理后,输出结果如下:temp2.tmp example.tmp
3. xargs rm -rf
ls | grep "tmp" | xargs rm -rf
xargs
读取前面grep
过滤后的标准输入,将其转换为rm -rf
命令的参数。- 实际执行的
rm
命令等价于:rm -rf temp2.tmp example.tmp
rm -rf
解释:-r
:递归删除(用于删除目录)-f
:强制删除,不提示
最终效果:删除 temp2.tmp
和 example.tmp
这两个匹配的文件。
为什么需要 xargs
?
有些命令(如 rm
)不能直接处理管道输入,例如:
ls | grep "tmp" | rm -rf
这条命令无法正常工作,因为 rm
不能直接从标准输入读取参数,而 xargs
可以将管道输出转换为命令参数,让 rm
能够正确执行。
xargs
的扩展用法
1. 显示删除的文件
使用 -t
选项可以让 xargs
在执行命令时显示具体的执行过程:
ls | grep "tmp" | xargs -t rm -rf
输出示例(显示要执行的 rm
命令):
rm -rf temp2.tmp example.tmp
2. 交互式删除(逐个确认)
ls | grep "tmp" | xargs -p rm -rf
-p
选项会在执行每个 rm
操作前询问用户是否确认:
rm -rf temp2.tmp ?...y
rm -rf example.tmp ?...y
3. 并行执行(提高性能)
当删除大量文件时,可以使用 -P
选项来并行执行多个 rm
命令,提高执行速度:
ls | grep "tmp" | xargs -P 4 rm -rf
这里 -P 4
表示同时并行执行 4 个 rm
进程。
4. 处理带空格的文件
如果文件名包含空格,例如:
my temp file.txt
another tmp file.log
默认 xargs
会把空格当作分隔符,导致命令执行失败。可以用 -d '\n'
让 xargs
以 换行符 作为分隔符:
ls | grep "tmp" | xargs -d '\n' rm -rf
总结
xargs
主要用于 将标准输入转换为命令参数,并传递给rm
、cp
、mv
等命令。- 适用于 无法直接处理管道输入的命令(如
rm
)。 - 结合
-t
(显示命令)、-p
(交互执行)、-P
(并行执行)等选项可以增强功能。 - 处理特殊情况时,可以使用
-d '\n'
解决文件名包含空格的问题。
xargs
是 Shell 脚本中高效批量处理文件的利器,尤其适用于大规模文件管理、日志清理、批量任务执行等场景。
详细解析 cut
命令
cut
是一个文本处理工具,用于从每一行提取指定的字段或字符。它可以按照字符数、字节数、分隔符等方式进行数据截取。常见用于日志分析、处理 CSV 文件、提取特定字段等。
1. cut
示例解析
示例命令
cat /etc/passwd | cut -d: -f1
该命令的作用是 从 /etc/passwd
文件中提取用户名(第一列)。
命令解析
-
cat /etc/passwd
cat
命令用于查看/etc/passwd
文件,该文件是 Unix/Linux 系统的用户信息数据库,格式如下:root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin user1:x:1000:1000:User One:/home/user1:/bin/bash
- 每一行表示一个用户信息。
- 字段之间由 冒号(
:
)分隔。 - 第 1 列:用户名
- 第 2 列:加密密码(
x
表示存储在/etc/shadow
) - 第 3 列:用户 ID(UID)
- 第 4 列:组 ID(GID)
- 第 5 列:用户描述信息
- 第 6 列:用户主目录
- 第 7 列:默认 Shell(登录时使用的命令解释器)
-
cut -d: -f1
-d:
选项:指定分隔符(delimiter),这里使用:
作为字段分隔符。-f1
选项:提取 第 1 列(用户名)。
最终输出示例:
root
daemon
user1
2. cut
命令的基本用法
2.1 按列提取(基于分隔符)
cut -d: -f1,3 /etc/passwd
-d:
设定 冒号 作为分隔符。-f1,3
提取第 1 列(用户名)和第 3 列(UID)。
示例输出:
root:0
daemon:1
user1:1000
2.2 按字符提取
可以使用 -c
选项按字符位置提取:
echo "abcdef" | cut -c1-3
-c1-3
选项:提取 第 1 到第 3 个字符。
输出:
abc
示例:提取 /etc/passwd
中每行的前 5 个字符
cut -c1-5 /etc/passwd
2.3 提取多个字段
提取多个列
cut -d: -f1,5,7 /etc/passwd
- 提取 用户名、用户描述、默认 Shell。
输出示例:
root:root:/bin/bash
daemon:daemon:/usr/sbin/nologin
user1:User One:/bin/bash
提取 从第 n 列到最后
cut -d: -f3- /etc/passwd
-f3-
:提取 从第 3 列开始的所有列。
2.4 与 echo
结合
echo "apple,banana,orange" | cut -d',' -f2
- 以
,
作为分隔符,提取 第二个字段(banana
)。 - 输出:
banana
3. cut
的局限性
3.1 cut
只能用于 定长格式
cut
适用于结构固定的文本,例如 /etc/passwd
或 CSV 文件。但对于不规则的多空格分隔数据,cut
可能无法正确解析,例如:
echo "name age city" | cut -d' ' -f2
不会返回 age
,因为空格数量不固定。
解决方案:使用 awk
或 tr
处理:
echo "name age city" | awk '{print $2}'
4. cut
结合其他命令
4.1 统计 /etc/passwd
中的用户名数量
cut -d: -f1 /etc/passwd | wc -l
cut -d: -f1
提取用户名。wc -l
统计行数。
4.2 提取日志文件中的 IP 地址
cat access.log | cut -d' ' -f1 | sort | uniq -c | sort -nr | head -10
cut -d' ' -f1
提取日志文件的第一列(IP 地址)。sort | uniq -c
统计每个 IP 出现次数。sort -nr
按次数降序排序。head -10
显示访问最多的前 10 个 IP。
5. 总结
5.1 cut
的关键用法
选项 | 作用 | 示例 |
---|---|---|
-d | 指定分隔符 | cut -d: -f1 |
-f | 提取指定字段 | cut -d, -f2 |
-c | 按字符位置截取 | cut -c1-5 |
5.2 cut
适用场景
✅ 处理 CSV、/etc/passwd
等结构化文本
✅ 提取固定格式数据
✅ 高效,适用于大文件处理
5.3 cut
不适用的场景
❌ 多空格或不规则分隔(建议用 awk
)
❌ 提取多个复杂匹配字段(awk
更灵活)
5.4 相关命令
awk
:适用于复杂文本处理sed
:适用于文本替换tr
:用于删除或转换字符xargs
:配合cut
进行参数传递
6. 结论
cut
是 Unix/Linux 中的强大工具,适用于提取结构化文本中的特定列或字符。- 主要通过
-d
指定分隔符,-f
选择字段,-c
提取字符。 - 与
grep
、awk
、sort
等命令结合,可用于日志分析、CSV 处理、批量文本操作。 - 在非固定格式数据场景下,
awk
可能更适合。
如果你要处理 结构清晰的数据提取任务,cut
是一个高效、快速 的选择! 🚀
解析 sed
替换命令
cat file.txt | sed 's/old/new/g'
该命令的作用是将 file.txt
文件中所有出现的 old
替换为 new
,并输出到终端。
1. 分步解析
1.1 cat file.txt
cat file.txt
读取file.txt
文件,并将内容输出到标准输出(即终端)。- 假设
file.txt
内容如下:This is an old book. The old man is reading. Keep the old files.
1.2 sed 's/old/new/g'
sed
(Stream Editor,流编辑器)用于文本流的查找和替换。's/old/new/g'
具体作用:s
:表示 substitute(替换) 操作。old
:要查找的原文本。new
:要替换的新文本。/g
:表示 全局替换(global
),即一行中所有出现的old
都替换,而不仅是第一个匹配项。
1.3 实际执行
sed 's/old/new/g'
处理后的输出:This is a new book. The new man is reading. Keep the new files.
2. sed
替换的更多用法
2.1 仅替换 每行第一个匹配项
如果去掉 /g
选项:
cat file.txt | sed 's/old/new/'
那么,每行只替换第一个 old
:
This is a new book.
The new man is reading.
Keep the old files. # 最后这行的第二个 "old" 没有被替换
2.2 直接修改文件
默认情况下,sed
不会修改原文件,而是将结果输出到终端。
如果要直接修改 file.txt
文件,使用 -i
选项:
sed -i 's/old/new/g' file.txt
注意:
-i
选项表示 直接在文件中执行替换,不会创建备份。- 运行后
file.txt
中的old
都会被替换为new
。
如果希望保留原文件的备份,可以这样做:
sed -i.bak 's/old/new/g' file.txt
这会生成 file.txt.bak
作为原始备份文件。
2.3 替换包含 /
的文本
如果 old
或 new
里面包含 斜杠 /
,例如路径:
cat config.txt | sed 's/home\/user\/oldpath/home\/user\/newpath/g'
由于 /
是 sed
默认分隔符,我们需要用 \\
进行转义。
但也可以改用 #
作为分隔符,避免转义:
sed 's#/home/user/oldpath#/home/user/newpath#g' config.txt
2.4 仅替换特定行
2.4.1 仅替换第 2 行
sed '2s/old/new/' file.txt
- 只会替换 第 2 行 中的
old
,而不会影响其他行。
2.4.2 替换 2-4 行
sed '2,4s/old/new/g' file.txt
- 仅在第 2 到第 4 行执行
old
替换为new
。
2.5 删除包含特定字符串的行
如果想删除所有包含 old
的行:
sed '/old/d' file.txt
示例:
This is an old book. # 这一行会被删除
The old man is reading. # 这一行会被删除
Keep the old files. # 这一行会被删除
最终输出:
# 变成空文件
3. sed
结合 grep
和 awk
3.1 仅替换匹配 grep
过滤的行
grep "old" file.txt | sed 's/old/new/g'
grep "old"
先筛选出包含old
的行,再用sed
进行替换。
3.2 awk
进行更复杂的替换
如果 sed
无法满足需求,可以使用 awk
:
awk '{gsub(/old/, "new"); print}' file.txt
gsub(/old/, "new")
:替换所有old
为new
。print
:输出替换后的行。
4. sed
VS awk
特性 | sed | awk |
---|---|---|
适用场景 | 文本替换 | 复杂文本处理 |
是否支持正则 | ✅ | ✅ |
替换能力 | 适合简单替换 | 适合复杂匹配和计算 |
行处理能力 | 按行操作 | 按字段和模式匹配操作 |
如果只是进行简单替换,sed
更快;如果需要复杂的逻辑处理,awk
更合适。
5. 总结
✅ sed
是一个强大的文本处理工具,用于 文本替换、删除、行编辑 等。
✅ 基本用法:
sed 's/old/new/g' file.txt # 替换所有 old
sed -i 's/old/new/g' file.txt # 直接修改文件
sed '/old/d' file.txt # 删除包含 old 的行
✅ 适用于日志处理、文本格式化、批量修改文件。
✅ 结合 grep
、awk
可以增强功能。
🚀 掌握 sed
,让你的 Shell 文本处理更加高效!
解析统计访问量最高的 IP的命令
解析 cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
该命令的作用是分析 access.log
日志文件中访问最多的 IP 地址,并按访问次数降序排列,显示前 10 名。
1. 命令拆解与执行流程
(1) cat access.log
cat access.log
- 读取
access.log
文件并输出到标准输出(终端)。 - 示例
access.log
日志格式(典型的 Nginx/Apache 访问日志):192.168.1.1 - - [01/Feb/2024:12:30:45 +0800] "GET /index.html HTTP/1.1" 200 1024 192.168.1.2 - - [01/Feb/2024:12:30:46 +0800] "GET /about.html HTTP/1.1" 200 2048 192.168.1.1 - - [01/Feb/2024:12:30:47 +0800] "GET /contact.html HTTP/1.1" 200 512 192.168.1.3 - - [01/Feb/2024:12:30:48 +0800] "GET /index.html HTTP/1.1" 200 1024 192.168.1.1 - - [01/Feb/2024:12:30:49 +0800] "GET /index.html HTTP/1.1" 200 1024
- 日志的第一列是 IP 地址,这是我们关心的数据。
(2) awk '{print $1}'
awk '{print $1}'
awk
用于文本处理,{print $1}
表示 提取第一列(IP 地址)。- 处理
access.log
后的输出:192.168.1.1 192.168.1.2 192.168.1.1 192.168.1.3 192.168.1.1
(3) sort
sort
sort
对 IP 地址列表排序,使相同的 IP 地址排在一起:192.168.1.1 192.168.1.1 192.168.1.1 192.168.1.2 192.168.1.3
(4) uniq -c
uniq -c
uniq -c
统计连续相同 IP 的出现次数:3 192.168.1.1 1 192.168.1.2 1 192.168.1.3
-c
选项用于在每个唯一的 IP 前添加 出现次数。
(5) sort -nr
sort -nr
sort -n
:按照数字排序(默认升序)。-r
选项:表示降序排序,让访问次数最多的 IP 地址排在最前。- 排序后的结果:
3 192.168.1.1 1 192.168.1.2 1 192.168.1.3
(6) head -10
head -10
head -10
取前 10 行,即访问次数最多的前 10 个 IP 地址。
2. 综合示例
假设 access.log
原始数据:
192.168.1.1 - - [01/Feb/2024:12:30:45] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [01/Feb/2024:12:30:46] "GET /about.html HTTP/1.1" 200 2048
192.168.1.1 - - [01/Feb/2024:12:30:47] "GET /contact.html HTTP/1.1" 200 512
192.168.1.3 - - [01/Feb/2024:12:30:48] "GET /index.html HTTP/1.1" 200 1024
192.168.1.1 - - [01/Feb/2024:12:30:49] "GET /index.html HTTP/1.1" 200 1024
192.168.1.2 - - [01/Feb/2024:12:30:50] "GET /home.html HTTP/1.1" 200 512
192.168.1.2 - - [01/Feb/2024:12:30:51] "GET /home.html HTTP/1.1" 200 512
执行:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
最终输出:
3 192.168.1.1
3 192.168.1.2
1 192.168.1.3
表示:
192.168.1.1
访问了 3 次。192.168.1.2
访问了 3 次。192.168.1.3
访问了 1 次。
3. 优化版本
3.1 避免 cat
(UUOC 问题)
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
awk
直接读取文件,去掉 cat
提高效率。
3.2 仅统计 200 OK
的 IP
如果想只统计 HTTP 状态码为 200
的访问:
awk '$9 == 200 {print $1}' access.log | sort | uniq -c | sort -nr | head -10
$9
是 HTTP 状态码(200、404、500 等)。- 仅统计返回
200
的访问。
3.3 统计 GET
请求的 IP
如果想只统计 GET
请求的 IP:
awk '$6 == "\"GET" {print $1}' access.log | sort | uniq -c | sort -nr | head -10
$6
代表请求方法(GET、POST 等)。- 只计算
GET
访问次数最多的 IP。
4. 总结
命令部分 | 作用 |
---|---|
cat access.log | 读取日志文件 |
awk '{print $1}' | 提取第一列(IP 地址) |
sort | 按 IP 地址排序 |
uniq -c | 统计相同 IP 出现的次数 |
sort -nr | 按访问次数降序排列 |
head -10 | 取访问最多的前 10 个 IP |
5. 适用场景
✅ 网站流量分析(找出访问最多的用户)
✅ 日志分析(查找异常 IP)
✅ 攻击检测(排查某 IP 是否异常请求过多)
✅ 负载均衡分析(哪些 IP 访问频率最高)
🚀 通过 awk
、sort
、uniq
组合,可以高效分析日志数据,提高网站运维效率!
使用 pv
监控管道数据流解析
解析 dd if=/dev/zero bs=1M count=100 | pv | dd of=/dev/null
该命令的作用是创建一个 100MB 的数据流,并通过 pv
监控其流速,最终丢弃数据。
1. 命令拆解
dd if=/dev/zero bs=1M count=100 | pv | dd of=/dev/null
按执行顺序拆解如下:
(1) dd if=/dev/zero bs=1M count=100
dd if=/dev/zero bs=1M count=100
dd
是 Unix/Linux 下的数据拷贝工具,可以直接对设备、文件、标准输入输出进行读写。if=/dev/zero
指定输入文件为/dev/zero
:/dev/zero
是一个特殊设备文件,读取它会返回无限的二进制 0(\x00
)。- 这个设备常用于创建特定大小的空文件或测试磁盘 IO。
bs=1M
:bs
(block size,块大小)设为 1MB,表示每次读取 1MB 数据。
count=100
:- 读取 100 个 1MB 块,总计 100MB 数据。
- 这个命令的作用是从
/dev/zero
生成一个 100MB 的数据流。
示例:执行 dd if=/dev/zero bs=1M count=5
dd if=/dev/zero bs=1M count=5 | hexdump -C
输出(只显示部分):
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00500000
表示 5MB 的数据全部为 \x00
。
(2) | pv
| pv
pv
(Pipe Viewer)是监控数据流速的工具,可以显示数据传输速率、进度条、已传输字节等信息。pv
直接从管道 (|
) 获取数据流,并实时统计数据流量。
示例:运行 pv
dd if=/dev/zero bs=1M count=100 | pv > /dev/null
输出示例:
100MiB 0:00:01 [97.6MiB/s]
100MiB
:已传输的数据量。0:00:01
:传输时间(1 秒)。[97.6MiB/s]
:当前数据流速(97.6MB/秒)。
(3) | dd of=/dev/null
| dd of=/dev/null
of=/dev/null
指定输出文件为/dev/null
:/dev/null
是 Linux 的“黑洞”,写入它的数据会被直接丢弃。- 该操作不会占用磁盘空间,适用于测试数据传输速度。
- 最终作用:数据流经过
pv
监控后,直接丢弃。
2. 综合执行流程
完整执行顺序如下:
dd
从/dev/zero
生成 100MB 的数据流。pv
实时监控数据流,显示传输速率和进度。dd
将数据丢弃到/dev/null
,不会实际写入文件。
3. 示例应用
(1) 测试磁盘写入速度
dd if=/dev/zero bs=1M count=1000 | pv | dd of=testfile.img
- 生成 1GB 的测试文件
testfile.img
,并用pv
监控写入速度。
(2) 测试磁盘读取速度
dd if=testfile.img bs=1M | pv | dd of=/dev/null
- 从
testfile.img
读取数据,并通过pv
监控读取速率。
(3) 测试网络传输速度
dd if=/dev/zero bs=1M count=100 | pv | nc -l -p 1234
- 使用
nc
(netcat)监听端口 1234,发送 100MB 数据流。 - 另一台服务器接收:
nc sender_ip 1234 | pv | dd of=/dev/null
- 显示实际网络传输速率。
4. 总结
命令部分 | 作用 |
---|---|
dd if=/dev/zero bs=1M count=100 | 生成 100MB 数据流(全 0) |
pv | 监控数据流量和速率 |
dd of=/dev/null | 丢弃数据,避免占用磁盘 |
🚀 这个命令主要用于:
- 测试 IO 读写性能
- 监测数据流量
- 模拟大数据流处理
通过 pv
,可以轻松监控数据流速,适用于磁盘测试、网络测速、大文件传输分析等场景!
解析 cat urls.txt | parallel wget {}
该命令的作用是 并行下载 urls.txt
文件中的所有 URL,相比 xargs
,parallel
具备更强的控制能力。
1. 命令拆解
cat urls.txt | parallel wget {}
按照执行顺序拆解如下:
(1) cat urls.txt
cat urls.txt
cat
命令用于读取urls.txt
文件的内容并将其输出到标准输出(终端)。- 假设
urls.txt
内容如下:https://example.com/file1.zip https://example.com/file2.zip https://example.com/file3.zip https://example.com/file4.zip
cat urls.txt
的输出:https://example.com/file1.zip https://example.com/file2.zip https://example.com/file3.zip https://example.com/file4.zip
(2) parallel wget {}
parallel wget {}
parallel
是 GNU 并行处理工具,允许多个任务并行执行,相比xargs -P
具有更强的控制能力。wget {}
解释:{}
是parallel
的 占位符,表示从stdin
(标准输入,即cat urls.txt
的输出)读取的每一行。wget {}
意味着对于urls.txt
中的每个 URL,执行:wget https://example.com/file1.zip wget https://example.com/file2.zip wget https://example.com/file3.zip wget https://example.com/file4.zip
- 但不同于
xargs
串行执行,parallel
默认是并行执行的!
2. parallel
相比 xargs
的优势
如果使用 xargs
并行执行,通常使用:
cat urls.txt | xargs -P 4 -I {} wget {}
-P 4
表示 并发 4 个任务(同时最多 4 个wget
运行)。-I {}
使xargs
识别{}
作为占位符。
但 parallel
更强大:
- 更智能的任务分配:自动利用 CPU 核心数 控制并发,不需要手动指定
-P
。 - 更友好的进度显示:可以显示 执行进度。
- 更强的控制能力(如限制速率、日志记录)。
3. parallel
的高级用法
(1) 指定并发数
默认情况下,parallel
自动根据 CPU 核心数选择最佳并发数。如果想限制并发数(如 4 个),可以使用:
cat urls.txt | parallel -j 4 wget {}
-j 4
:最多 4 个任务并行执行。
(2) 从文件直接读取输入
parallel wget {} < urls.txt
- 省略
cat
,直接让parallel
读取urls.txt
。
(3) 显示进度
cat urls.txt | parallel --progress wget {}
--progress
选项会显示 任务完成百分比,方便监控进度。
(4) 记录下载日志
cat urls.txt | parallel wget {} 2>&1 | tee download.log
2>&1
:捕获标准错误输出。tee download.log
:将输出保存到download.log
,同时显示在终端。
(5) 限制每个 wget
下载速率
如果你希望每个 wget
限速(如 500KB/s),可以:
cat urls.txt | parallel wget --limit-rate=500k {}
--limit-rate=500k
:每个任务最大下载速度 500KB/s。
(6) 让 parallel
处理多个参数
如果 urls.txt
里有多个字段(比如 URL 和文件名),可以:
cat urls.txt | parallel -d ' ' wget -O {2} {1}
假设 urls.txt
:
https://example.com/file1.zip file1.zip
https://example.com/file2.zip file2.zip
{1}
代表 第 1 列(URL)。{2}
代表 第 2 列(目标文件名)。wget -O {2} {1}
相当于:wget -O file1.zip https://example.com/file1.zip wget -O file2.zip https://example.com/file2.zip
4. parallel
VS xargs
特性 | parallel | xargs |
---|---|---|
默认并行 | ✅ | ❌(需 -P ) |
自动 CPU 负载控制 | ✅ | ❌ |
进度显示 | ✅ (--progress ) | ❌ |
多参数支持 | ✅ ({1} {2} ) | 仅 -I |
错误处理 | 更智能 | 相对简单 |
parallel
比 xargs
更高效、更灵活、更强大,是大规模批量任务的最佳选择。
5. 适用场景
✅ 批量下载(如爬虫、文件同步)
✅ 批量压缩/解压(如 tar
)
✅ 批量图片处理(如 convert
)
✅ 大规模数据处理(如 ffmpeg
转码)
6. 总结
🚀 parallel
是比 xargs
更强大的并行处理工具!
cat urls.txt | parallel wget {}
:并行下载 URL,比xargs -P
更高效。- 支持 CPU 负载控制、进度显示、智能任务分配。
- 适用于大规模并行任务,如批量下载、视频处理、文件压缩等。
掌握 parallel
,提升 Shell 脚本效率! 🚀
Deep Understanding of Unix Shell Pipes (|)
1. What is a Pipe?
A pipe (|
) is one of the most powerful features in Unix/Linux Shell. It allows the output of one command to be used as the input of another, enabling streamlined data processing. By using pipes, multiple simple commands can be combined to create more complex functionalities without requiring temporary files.
For example, the following command lists all files in the current directory that contain the string “txt”:
ls -l | grep txt
Here, the output of ls -l
is passed to grep txt
, which filters and displays matching files.
2. Basic Usage of Pipes
2.1 Filtering Text Data
The grep
command is used to find specific text:
cat access.log | grep "404"
Here, cat access.log
outputs the entire log file, while grep "404"
extracts only lines containing “404.”
2.2 Sorting Data
The sort
command sorts data and can be combined with uniq
to remove duplicates:
cat names.txt | sort | uniq
2.3 Counting Data
The wc
command counts lines, words, and characters, e.g.:
cat data.txt | wc -l # Count the number of lines in the file
2.4 Combining Multiple Commands
ls -l | grep ".sh" | wc -l
This command lists all files, filters those ending with .sh
, and counts them.
3. Advanced Pipe Usage
3.1 Using tee
to Save Data in a Pipe
Normally, data in a pipe is passed to the next command without being saved. If you need to process and store it simultaneously, use tee
:
ls -l | tee output.txt | grep "log"
This saves the output of ls -l
into output.txt
while passing it to grep "log"
for further filtering.
3.2 Using xargs
to Process Piped Data
Some commands cannot directly accept pipe input. For example, rm
cannot process ls | rm
, so xargs
is used:
ls | grep "tmp" | xargs rm -rf
Here, xargs
converts the piped data into arguments for the rm
command.
3.3 Using cut
to Extract Specific Columns
cut
extracts specific fields from input data. For example:
cat /etc/passwd | cut -d: -f1
This extracts usernames (the first column delimited by :
) from /etc/passwd
.
3.4 Using awk
for Advanced Text Processing
awk
is a powerful text processing tool. For example, to calculate the sum of the second column in a CSV file:
cat sales.csv | awk -F"," '{sum += $2} END {print sum}'
Here, -F","
specifies ,
as the delimiter, and $2
represents the second column.
3.5 Using sed
for Text Replacement
sed
can replace text, e.g.:
cat file.txt | sed 's/old/new/g'
This replaces all instances of old
with new
in file.txt
.
4. Practical Applications in Development
4.1 Monitoring Log Files
Use tail -f
to view logs in real-time and filter keywords:
tail -f /var/log/syslog | grep "error"
4.2 Finding and Deleting Large Files
Find and delete files larger than 100MB:
find /var/log -size +100M | xargs rm -rf
4.3 Finding the Most Frequent IPs in Logs
Analyze the most accessed IP addresses in access.log
:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
5. Performance Optimization and Best Practices
5.1 Avoiding Unnecessary cat
Usage
cat file.txt | grep "error"
Can be optimized as:
grep "error" file.txt
5.2 Using pv
to Monitor Pipe Data Flow
pv
displays data flow within pipes, e.g.:
dd if=/dev/zero bs=1M count=100 | pv | dd of=/dev/null
5.3 Using parallel
for Efficient Execution
xargs
can execute commands in parallel, but parallel
is more powerful:
cat urls.txt | parallel wget {}
6. Conclusion
Pipes (|
) are a core feature of Unix Shell, allowing multiple commands to be combined to create powerful data processing workflows. Mastering basic pipe usage and advanced tools like xargs
, tee
, awk
, and sed
can significantly improve Shell scripting efficiency. In practical development, pipes are widely used in log analysis, data processing, and batch task execution.
后记
2025年2月3日于山东日照。在GPT4o大模型辅助下完成。
相关文章:

深入理解 Unix Shell 管道 Pipes:基础和高级用法 xargs tee awk sed等(中英双语)
深入理解 Unix Shell 管道(|) 1. 什么是管道(Pipe)? 管道(|)是 Unix/Linux Shell 中最强大的功能之一,它允许将一个命令的输出作为另一个命令的输入,从而实现数据流的处…...

[MySQL]事务的理论、属性与常见操作
目录 一、事物的理论 1.什么是事务 2.事务的属性(ACID) 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…...

RS485接口EMC
A.滤波设计要点 L1为共模电感,共模电感能够衰减共模干扰,对单板内部的干扰以及外部的干扰都能抑制,能提高产品的抗干扰能力,同时也能减小通过485信号线对外的辐射,共模电感阻抗选择范围为120Ω/100MHz ~2200Ω/100MHz…...

快速上手mybatis教程
基础知识 MyBatis 是一款优秀的持久层框架,其核心组件主要包括以下部分: SqlSession 作用:SqlSession 是 MyBatis 的核心接口,负责与数据库进行通信,执行 SQL 语句,并返回查询结果。它是 MyBatis 的一次会…...

本地部署DeepSeek-R1保姆级教程
近期,我国一款开源模型 DeepSeek-R1以低成本和高性能震撼了全球科技界。该模型的开源性使开发者能够在本地环境中部署和运行,提供了更高的灵活性和控制力。如果你也想在本地部署 DeepSeek-R1,可以参考以下完整的教程,涵盖Mac 版本…...

blender 相机参数
目录 设置相机参数: 3. 设置相机参数示例 4. 相机透视与正交 5. 额外的高级设置 设置相机参数: 设置渲染器: 外参转换函数 转换测试代码: 获取blender渲染外参: 设置相机参数: 3. 设置相机参数示…...

在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用
上下拉电阻作用 在通用输入的时候,也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态,这样才能检测到不同电平状态。 如何保持电平状态? 1. 可以通过芯片内部的上下拉电阻,由于是弱上下拉一般不用 2. 硬件外界一个…...

Maven工程核心概念GAVP详解:从命名规范到项目协作的基石
Maven工程核心概念GAVP详解:从命名规范到项目协作的基石 一、GAVP是什么? 在Maven工程中,GAVP是四个核心属性的缩写:GroupId、ArtifactId、Version、Packaging。这组属性为项目在Maven仓库中提供了唯一标识,类似于“项…...

如何利用DeepSeek打造医疗领域专属AI助手?从微调到部署全流程解析
如何利用DeepSeek开源模型打造医疗领域专属AI助手?从微调到部署全流程解析 医疗人工智能正迎来爆发式增长,但在实际应用中,通用大模型往往存在医学知识不精准、诊断逻辑不严谨等问题。本文将手把手带您实现医疗垂直领域大模型的定制化训练&a…...

Redis|前言
文章目录 什么是 Redis?Redis 主流功能与应用 什么是 Redis? Redis,Remote Dictionary Server(远程字典服务器)。Redis 是完全开源的,使用 ANSIC 语言编写,遵守 BSD 协议,是一个高性…...

眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它
据悉折叠手机开创者三星披露了一份专利,通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力,希望通过这种方式进一步增强折叠手机的可靠性和耐用性,来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…...

Leetcode面试高频题分类刷题总结
https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类(Sort): 基础知识:快速排序(Quick Sort), 归并排序(Merge Sort)的…...

Vue.js `v-memo` 性能优化技巧
Vue.js v-memo 性能优化技巧 今天我们来聊聊 Vue 3.2 引入的一个性能优化指令:v-memo。如果你在处理大型列表或复杂组件时,遇到性能瓶颈,那么 v-memo 可能会成为你的得力助手。 什么是 v-memo? v-memo 是 Vue 3.2 新增的内置指…...

Altium Designer绘制原理图时画斜线的方法
第一步:检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项,点击OK即可。如下图所示: 然后在划线时,按下shift空格就能够切换划线…...

在K8S中,有哪几种控制器类型?
在Kubernetes中,控制器(Controller)是用来确保实际集群状态与所需状态保持一致的关键组件。它们监控并自动调整系统以达到预期状态,以下是Kubernetes中主要的几种控制器类型: ReplicationController(RC&am…...

什么是Rust?它有什么特点?为什么要学习Rust?
什么是Rust?它有什么特点?为什么要学习Rust? 如果你是一名编程初学者,或者已经有一些编程经验但对Rust感兴趣,那么这篇文章就是为你准备的!我们将用简单易懂的语言,带你了解Rust是什么、它有什…...

Golang 并发机制-3:通道(channels)机制详解
并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang(也称为 Go)通过通道(channels)这一特性,能够可靠且优雅地实现并发通信。本文将揭示通道的概念,解释其在并发编程中的作用,并提供…...

kamailio的kamctl的使用
kamctl 是 Kamailio SIP 服务器的管理工具,用于执行各种管理任务,如启动、停止、重启 Kamailio 进程,管理用户、ACL、路由、信任的 IP 地址等。以下是对 kamctl 命令的解释及举例说明: 1. 启动、停止、重启 Kamailio start: 启动…...

HarmonyOS:ArkWeb进程
ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…...

UI线程用到COM只能选单线程模型
无论用不用UI库,哪怕是用Win32 API手搓UI,UI线程要用COM的话,必须初始化为单线程单元(STA),即CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);,不能用MULTITHREADTHREADED。 实际上,很多(WPF等)UI库若…...

LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介:处理更…...

在C语言中使用条件变量实现线程同步
互斥量、原子操作都是实现线程同步的方法,今日介绍使用条件变量来实现线程同步。在多线程应用中,当某个线程的执行依赖于另一个线程对数据的处理时,这个线程可能没有被阻塞,只是不断地检查某个条件是否成立了(这个条件…...

图书管理系统 Axios 源码__新增图书
目录 功能介绍 核心代码解析 源码:新增图书功能 总结 本项目基于 HTML、Bootstrap、JavaScript 和 Axios 开发,实现了图书的增删改查功能。以下是新增图书的功能实现,适合前端开发学习和项目实践。 功能介绍 用户可以通过 模态框…...

Maven全解析:从基础到精通的实战指南
概念: Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建,依赖管理和项目信息管理项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 依赖管理: 对第三方依赖包的管理…...

数据密码解锁之DeepSeek 和其他 AI 大模型对比的神秘面纱
本篇将揭露DeepSeek 和其他 AI 大模型差异所在。 目录 编辑 一本篇背景: 二性能对比: 2.1训练效率: 2.2推理速度: 三语言理解与生成能力对比: 3.1语言理解: 3.2语言生成: 四本篇小结…...

python算法和数据结构刷题[5]:动态规划
动态规划(Dynamic Programming, DP)是一种算法思想,用于解决具有最优子结构的问题。它通过将大问题分解为小问题,并找到这些小问题的最优解,从而得到整个问题的最优解。动态规划与分治法相似,但区别在于动态…...

Ollama+OpenWebUI部署本地大模型
OllamaOpenWebUI部署本地大模型 前言 Ollama是一个强大且易于使用的本地大模型推理框架,它专注于简化和优化大型语言模型(LLMs)在本地环境中的部署、管理和推理工作流。可以将Ollama理解为一个大模型推理框架的后端服务。 Ollama Ollama安…...

Python从0到100(八十六):神经网络-ShuffleNet通道混合轻量级网络的深入介绍
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

【网络】传输层协议TCP(重点)
文章目录 1. TCP协议段格式2. 详解TCP2.1 4位首部长度2.2 32位序号与32位确认序号(确认应答机制)2.3 超时重传机制2.4 连接管理机制(3次握手、4次挥手 3个标志位)2.5 16位窗口大小(流量控制)2.6 滑动窗口2.7 3个标志位 16位紧急…...

海思ISP开发说明
1、概述 ISP(Image Signal Processor)图像信号处理器是专门用于处理图像信号的硬件或处理单元,广泛应用于图像传感器(如 CMOS 或 CCD 传感器)与显示设备之间的信号转换过程中。ISP通过一系列数字图像处理算法完成对数字…...