介绍
本实验将带你了解 Linux 中必不可少的文本处理命令:tr、col、join 和 paste。你将学习如何使用这些工具高效地操作文本文件,它们是完成许多 Linux 任务的基础。本指南专为初学者设计,提供了详细的解释和示例,帮助你透彻理解每个命令。
本实验将带你了解 Linux 中必不可少的文本处理命令:tr、col、join 和 paste。你将学习如何使用这些工具高效地操作文本文件,它们是完成许多 Linux 任务的基础。本指南专为初学者设计,提供了详细的解释和示例,帮助你透彻理解每个命令。
tr 命令是「translate」(转换)的缩写,是一个用于在文本流中转换或删除字符的强大工具。它在转换大小写、删除特定字符或替换字符等任务中非常有用。
让我们从一些基础的 tr 操作开始:
echo 'hello labex' | tr -d 'olh'
此命令将从输入字符串中删除所有出现的「o」、「l」和「h」。具体原理如下:
echo 'hello labex' 输出文本「hello labex」。|(管道)符号将此输出发送给 tr 命令。tr -d 'olh' 告诉 tr 删除(-d)它找到的任何「o」、「l」或「h」字符。你应该会看到 e abex 作为输出。注意所有的「o」、「l」和「h」字符都已被移除。
echo 'hello' | tr -s 'l'
此命令将压缩(-s)或移除输入字符串中重复的字母「l」。你应该会看到 helo 作为输出。
echo 'balloon' | tr -s 'o'
你应该会看到 ballon 作为输出。重复的「o」已被压缩为单个「o」。
echo 'hello labex' | tr '[:lower:]' '[:upper:]'
此命令将所有小写字母转换为大写。具体原理如下:
'[:lower:]' 是一个代表所有小写字母的字符类。'[:upper:]' 是一个代表所有大写字母的字符类。tr 将第一组中的任何字符替换为第二组中对应的字符。你应该会看到 HELLO LABEX 作为输出。
尝试这些命令并观察输出。如果你犯了错误也不要担心——你可以随时重新运行命令。如果你好奇会发生什么,可以尝试更改输入文本或 tr 命令中的字符。
例如,你认为运行以下命令会发生什么:
echo 'hello world' | tr 'ol' 'OL'
动手试一试吧!
如果你想了解更多关于 tr 的信息,可以使用 man tr 查看其手册页。这将为你提供 tr 所有选项和用途的详尽列表。要退出手册页,只需按「q」。
请记住,在 Linux 中,大多数命令都遵循类似的结构:command [options] arguments。理解这一模式将有助于你学习更多命令。
col 命令用于过滤输入中的反向换行符。它在将制表符(Tab)转换为空格(反之亦然)时特别有用。当处理格式可能不一致的文件时,尤其是跨不同操作系统移动文件时,经常会用到这个命令。
让我们看看 col 的实际应用:
cat -A /etc/protocols | head -n 10
此命令执行以下操作:
cat 用于显示文件内容。-A 选项告诉 cat 显示所有字符,包括不可打印字符。/etc/protocols 是我们要查看的文件(这是一个列出互联网协议的系统文件)。| 将输出通过管道传输到下一个命令。head -n 10 仅显示输出的前 10 行。你会在输出中看到 ^I 字符。这些代表制表符。^ 符号用于表示控制字符,而 I(字母表第 9 个字母)代表制表符的 ASCII 字符(其十进制值为 9)。
col 将这些制表符转换为空格:cat /etc/protocols | col -x | cat -A | head -n 10
这个命令管道执行以下操作:
cat /etc/protocols 输出文件内容。| 将输出传给 col。col -x 将制表符转换为空格。-x 选项告诉 col 执行此转换。| 将输出传给 cat -A 以显示所有字符。head -n 10 显示前 10 行。将输出与之前的命令进行比较。你会发现 ^I 字符已被空格替换。
-x 选项在需要确保不同系统或文本编辑器(它们处理制表符的方式可能不同)之间格式一致时非常有用。
如果你好奇 col 还有哪些其他选项,可以使用 man col 查看其手册页。记住,按「q」可以退出。
join 命令用于根据共同字段合并两个文件的行。它类似于数据库中的连接(Join)操作。当你有关联的数据分布在多个文件中,并希望根据共同的键或标识符将它们合并时,这个命令非常有用。
让我们创建两个简单的文件并合并它们:
echo -e "1 apple\n2 banana\n3 cherry" > fruits.txt
此命令执行以下操作:
echo 用于输出文本。-e 启用反斜杠转义解释。\n 代表换行。> 将输出重定向到名为 fruits.txt 的文件。echo -e "1 red\n2 yellow\n3 red" > colors.txt
这创建了另一个具有匹配编号但第二个字段不同的文件。
join fruits.txt colors.txt
此命令将根据第一个字段(编号)合并两个文件的行。
你应该会看到如下输出:
1 apple red
2 banana yellow
3 cherry red
join 命令根据第一个字段(编号 1, 2, 3)匹配行,并将两个文件中的其余字段组合在一起。
join -1 2 -2 2 <(sort -k2 fruits.txt) <(sort -k2 colors.txt)
这个更复杂的命令执行以下操作:
-1 2 告诉 join 使用第一个文件的第二个字段进行合并。-2 2 告诉 join 使用第二个文件的第二个字段进行合并。<(...) 是进程替换,允许我们在需要文件名的地方使用命令的输出。sort -k2 根据第二个字段对文件进行排序。我们需要先对文件进行排序,因为 join 要求输入在合并字段上是有序的。
如果两个文件之间没有匹配的第二个字段,此命令可能不会产生任何输出。这是 join 在没有匹配项时的预期行为。
如果你想查看排序是如何工作的,可以分别尝试这些命令:
sort -k2 fruits.txt
sort -k2 colors.txt
请记住,join 对输入文件中行的顺序很敏感。如果文件没有在合并字段上排序,你可能会得到意外的结果或根本没有输出。
paste 命令用于合并文件的行。与 join 不同,它不需要共同字段。当你想要并排合并文件或从多个文件创建类似表格的输出时,它非常有用。
让我们看看 paste 是如何工作的:
echo -e "apple\nbanana\ncherry" > fruits.txt
echo -e "red\nyellow\nred" > colors.txt
echo -e "sweet\nsweet\nsweet" > tastes.txt
这些命令创建了三个文件,每个文件有三行。
paste 合并这些文件:paste fruits.txt colors.txt tastes.txt
此命令将并排合并所有三个文件的行。你应该会看到如下输出:
apple red sweet
banana yellow sweet
cherry red sweet
默认情况下,paste 使用制表符来分隔字段。
paste -d ':' fruits.txt colors.txt tastes.txt
-d ':' 选项告诉 paste 使用「:」作为不同文件字段之间的分隔符。你应该会看到如下输出:
apple:red:sweet
banana:yellow:sweet
cherry:red:sweet
-s 选项,它会将合并操作序列化:paste -s fruits.txt colors.txt tastes.txt
-s 选项告诉 paste 将每个文件的内容合并为单行。你应该会看到如下输出:
apple banana cherry
red yellow red
sweet sweet sweet
输出中的每一行代表一个完整文件的内容。
当你处理需要以各种方式组合的数据时,这些 paste 操作非常有用。例如,你可以使用 paste 合并日志文件、创建 CSV 文件或格式化数据以便其他程序处理。
记住,如果你想探索 paste 的更多选项,可以随时使用 man paste 查看其手册页。
既然你已经学习了这些文本处理命令,让我们来找点乐子!我们将安装并玩一个名为 Space Invaders(太空侵略者)的文本游戏。这将展示文本处理如何创造性地应用于 Linux 环境。
sudo apt-get update
此命令更新可用软件包及其版本的列表。在安装新软件之前运行此命令是一个好习惯。
sudo 以超级用户权限运行命令。apt-get 是 Ubuntu 中的软件包处理工具。update 告诉 apt-get 更新软件包列表。sudo apt-get install ninvaders -y
此命令安装 ninvaders 游戏。
install 告诉 apt-get 安装新软件包。ninvaders 是我们要安装的软件包名称。-y 自动对安装过程中的任何提示回答「yes」。如果你好奇 apt-get 还有哪些其他选项,可以使用 man apt-get 查看其手册页。
ninvaders
此命令启动 Space Invaders 游戏。操作方法如下:
尝试玩几分钟。你能打破最高分吗?

这个游戏是文本如何被操作以在终端中创建交互式体验的绝佳示例。它使用简单的 ASCII 字符来代表飞船、外星人和子弹,证明了即使是复杂的交互也可以仅使用文本来表示。
玩完后,记得按「q」退出游戏。
在本实验中,你学习了 Linux 中几个强大的文本处理命令:
tr:用于在文本中转换或删除字符。你用它删除了特定字符、移除了重复项并更改了文本大小写。col:用于在制表符和空格之间转换。你用它查看并操作了系统文件中的制表符。join:用于根据共同字段合并两个文件的行。你创建了示例文件并根据不同字段合并了它们。paste:用于合并文件的行。你创建了多个文件并使用不同的 paste 选项以各种方式组合它们。这些命令是 Linux 文本处理工具箱中的基本工具。它们可以以各种方式组合,以高效地操作和分析文本数据。以下是一些关键要点:
|)符号在链接命令时非常强大。command [options] arguments。man 命令)是学习任何命令的绝佳资源。最后,我们通过安装和玩文本游戏探索了文本处理的创意用途。这展示了 Linux 环境中文本的多功能性——即使是复杂的交互式应用程序也可以仅使用文本字符构建!
随着你继续 Linux 之旅,你会发现这些文本处理技能在系统管理、数据分析甚至编程任务的许多方面都非常有价值。继续练习这些命令,你将变得更加精通 Linux 文本处理!
记住,最好的学习方式就是实践。不要害怕尝试这些命令,尝试不同的选项,看看会发生什么。祝你文本处理愉快!