paste 命令是一个非常实用但有时容易被忽略的工具,它的核心功能是 将多个文件的相应行合并(连接)起来,并将结果输出到标准输出(通常是你的终端)。

你可以把它想象成办公软件中的“并排粘贴”功能,或者像把多列数据横向拼接在一起。
基本语法
paste [选项]... [文件]...
- 选项: 用于控制
paste的行为。 - 文件: 指定一个或多个要合并的文件,如果不指定文件,或者使用 作为文件名,
paste会从标准输入读取数据。
核心工作原理
paste 逐行处理输入文件,它会:
- 同时读取所有输入文件的第一行。
- 用指定的分隔符(默认是制表符
\t)将它们连接起来。 - 输出合并后的第一行。
- 然后读取所有输入文件的第二行,重复上述过程。
- 直到所有文件中最长的文件被处理完毕。
重要特性: 如果某个文件比其他文件短,paste 会用空行来填充,直到所有文件都处理完毕,这与 paste 的“兄弟”命令 join 不同,join 只处理两个文件中键值匹配的行。
常用选项详解
a. -d 或 --delimiters
这是最常用的选项,用于指定合并行时使用的分隔符。

示例 1: 默认使用制表符
假设有两个文件 file1.txt 和 file2.txt:
# file1.txt apple banana cherry # file2.txt red yellow green
执行 paste file1.txt file2.txt:
apple red banana yellow cherry green
可以看到,apple 和 red 之间是一个制表符。
示例 2: 使用逗号作为分隔符
paste -d, file1.txt file2.txt
输出:
apple,red banana,yellow cherry,green
示例 3: 使用多个字符作为分隔符
你可以使用 -d 后跟一个字符序列,paste 会按顺序循环使用这些字符。
# file3.txt 10 20 30 40 # file4.txt A B C
执行 paste -d":;" file3.txt file4.txt file1.txt:
- 第一行用 连接
- 第二行用 连接
- 第三行又用 连接
- 第四行
file3.txt有内容,但file4.txt和file1.txt没有,所以用空格填充。
输出:
10:A: 20;B: 30:C: 40: :
b. -s 或 --serial
这个选项改变 paste 的行为,它不再将不同文件的行合并,而是将同一个文件内的行合并。
示例:
paste -s file1.txt
输出:
apple banana cherry
file1.txt 的所有行被合并成了一行,并用默认的制表符分隔。
你还可以指定分隔符:
paste -s -d, file1.txt file2.txt
输出:
apple,banana,cherry red,yellow,green
file1.txt 的所有行用逗号合并成一行,file2.txt 的所有行也用逗号合并成一行,然后这两大行再用制表符连接。
实用示例
示例 1: 创建 CSV 文件
假设你有一个用户名列表 users.txt 和一个对应的密码列表 passwords.txt,你可以用 paste 快速创建一个 CSV 文件。
# users.txt alice bob charlie # passwords.txt secret123 password456 qwerty789
paste -d, users.txt passwords.txt > users_passwords.csv
生成的 users_passwords.csv 内容如下:
alice,secret123 bob,password456 charlie,qwerty789
示例 2: 从日志中提取多列信息
假设你有一个日志文件 access.log,每行格式为 IP - - [timestamp] "request" status size,你想提取 IP 地址、请求方法和状态码。
# access.log (示例行) 192.168.1.100 - - [10/Oct/2025:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 1234 10.0.0.5 - - [10/Oct/2025:13:56:01 +0800] "POST /login HTTP/1.1" 302 567
我们可以用 cut 命令先提取出需要的列,然后用 paste 组合。
# 提取IP (第1列), 请求方法 (第6列), 状态码 (第9列) cut -d' ' -f1,6,9 access.log | paste -d, - -
命令分解:
cut -d' ' -f1,6,9 access.log: 提取 IP、请求方法和状态码。-d' '指定空格为分隔符。168.1.100 GET 200 10.0.0.5 POST 302
paste -d, - -:paste从标准输入读取(第一个 ),并将输入的每一行视为一个独立的“文件”来处理,由于只有“一个”输入文件,paste -s的效果就显现出来了,它把每一行的内容合并起来。-d,指定用逗号作为分隔符。168.1.100,GET,200 10.0.0.5,POST,302
示例 3: 与命令行管道结合
paste 可以从标准输入读取数据,非常适合在管道中使用。
假设你想将 ls -l 的输出(每行一个文件)和 wc -l 的输出(总行数)合并显示。
# ls -l 的输出
total 16
-rw-r--r-- 1 user user 123 Oct 10 13:55 file1.txt
-rw-r--r-- 1 user user 456 Oct 10 13:56 file2.txt
# wc -l file1.txt file2.txt 的输出
3 file1.txt
3 file2.txt
6 total
我们想得到这样的效果:
file1.txt: 3
file2.txt: 3
可以这样实现:
ls | paste -d: - <(wc -l *)
命令分解:
ls: 列出当前目录的文件名(每行一个)。<(wc -l *): 这是进程替换。wc -l *会计算当前目录所有文件的行数并输出。<(...)将这个命令的输出当作一个临时文件,paste可以读取它。paste -d: - <(...):paste读取ls的输出()和wc -l的输出(临时文件),并用冒号 连接它们。
输出:
file1.txt: 3 file2.txt: 3
paste vs join
这是一个常见的混淆点,简单对比一下:
| 特性 | paste |
join |
|---|---|---|
| 目的 | 横向合并多行 | 纵向连接两个文件中共享关键字段的行 |
| 输入文件数 | 两个或多个 | 通常是两个 |
| 匹配逻辑 | 无需匹配,按行号顺序合并 | 必须指定一个或多个关键字段,只有关键字段值相同的行才会被合并 |
| 短文件处理 | 用空行填充 | 短文件中不匹配的行会被忽略 |
| 主要用途 | 创建多列数据、格式化输出 | 数据库式连接,基于键值合并数据 |
paste 命令虽然简单,但在处理文本数据、进行格式化输出和快速创建结构化文件(如 CSV)时非常高效,记住它的核心思想:按行横向合并,并熟练使用 -d 和 -s 选项,你就能应对很多文本处理的场景了。
