跳转到内容

Ict-创新/LPI/103.2

来自维基教科书,开放的书籍,开放的世界

103.2 使用过滤器处理文本流

[编辑 | 编辑源代码]

考生应能够将过滤器应用于文本流。


关键知识领域

  • 将文本文件和输出流通过文本工具过滤器,以使用 GNU textutils 包中找到的标准 UNIX 命令修改输出。

文本处理工具

[编辑 | 编辑源代码]

Linux 拥有丰富的工具集,用于处理和操作文本文件。在本节中,我们将介绍其中一些工具。

cat - cat 是 concatenate 的缩写,是一个 Linux 命令,用于将文件内容写入标准输出。cat 通常与其他命令结合使用以执行对文件操作,或者如果您想快速了解文件内容。

# cat /etc/aliases

cat 可以接受多个参数,最常用的是 -n 和 -b,它们分别对所有行和非空行输出行号。


headtail - 工具 head 和 tail 通常用于检查日志文件。默认情况下,它们输出 10 行文本。以下是主要用法。

列出 /var/log/messages 的前 20 行

# head -n 20 /var/log/messages

# head -20 /var/log/messages


列出 /etc/aliases 的最后 20 行

# tail -20 /etc/aliases

tail 工具还有一个额外的选项,允许您从给定行开始列出文本的末尾。


/var/log/messages 中的第 25 行开始列出文本

# tail +25 /etc/log/messages

最后,tail 可以使用 -f 选项连续读取文件。例如,当您检查实时日志文件时,这非常有用。


wc - wc 工具计算文件中的字节单词数。多个选项允许您控制 wc 的输出。

wc 的选项
-l 计算行数
-w 计算单词数
-c 或 -m 计算字节数或字符数


nl - nl 工具与 cat -b 的输出相同

对所有行(包括空白行)进行编号

# nl -ba /etc/lilo.conf


仅对包含文本的行进行编号

# nl -bt /etc/lilo.conf


expand/unexpand - expand 命令用于将 TAB 替换为空格。您也可以使用 unexpand 执行相反的操作。

od 有一些工具可用于此目的。最常见的是 od(八进制转储)和 hexdump。

split - 拆分文件 - split 工具可以根据大小或行数等标准将文件拆分成更小的文件。例如,我们可以将 /etc/passwd 拆分成包含 5 行的更小的文件

# split -l 5 /etc/passwd

这将创建名为 xaaxabxacxad ... 的文件,每个文件至少包含 5 行。可以在命令行中为文件提供更有意义的前缀名称(而不是 x),例如 passwd-5.

# split -l 5 /etc/passwd passwd-5

这将创建与上述文件(aaxabxacxad ...)相同的文件,但名称现在是 passwd-5aapasswd-5abpasswd-5acpasswd-5ad


删除连续的重复行

uniq 工具只会将连续的相同行的副本发送到 stdout。

考虑以下示例

# uniq > /tmp/UNIQUE

第 1 行

第 2 行

第 2 行

第 3 行

第 3 行

第 3 行

第 1 行

^D


/tmp/UNIQUE 文件具有以下内容

# cat /tmp/UNIQUE

第 1 行

第 2 行

第 3 行

第 1 行


注意:从上面的示例中我们可以看到,当使用 uniq 时,非连续的相同行仍然会打印到 STDOUT。通常,输出会先排序,以便所有相同的行都出现在一起。

# sort | uniq > /tmp/UNIQUE

cut cut 工具可以从文本每一行的字符或字段中提取一个范围。–c 选项用于根据字符位置进行切割。

语法

cut {range1,range2}

示例

# cut –c5-10,15- /etc/password


上面的示例对 /etc/password 中的每一行输出第 5 到 10 个字符和第 15 个字符到行尾。您也可以指定文件的字段分隔符(空格、逗号等),以及要输出的字段。这些选项分别使用 –d–f 标志设置。

语法

{delimiter} -f {fields}

示例

# cut -d: -f 1,7 --output-delimiter=" " /etc/passwd

这将输出 /etc/passwd 的第 1 和 7 个字段,并用空格分隔。默认的 output-delimiter 与原始输入分隔符相同。--output-delimiter 选项允许您更改它。

paste/join - 最简单的工具是 paste它将两个文件并排连接在一起。

语法

paste text1 text2

使用 join,您可以进一步指定要考虑的字段。

语法

join -j1 {field_num} -j2{field_num} text1 text2

join -1 {field_num} -2{field_num} text1 text2

只有当指定字段匹配时,文本才会被发送到 stdout。比较是一次进行一行,一旦没有匹配项,进程就会停止,即使文件末尾还有更多匹配项。

sort - 默认情况下,sort 将以字母顺序排列文本。要执行数字排序,请使用 -n 选项。

使用 fmt 和 pr 格式化输出

[编辑 | 编辑源代码]

fmt 是一种简单的文本格式化工具,它可以将文本重新格式化为指定长度的行。

您可以使用 fmt 修改每行输出的字符数。默认情况下,fmt 将连接行并输出 75 个字符的行。

fmt 选项

-w 每行的字符数

-s 拆分长行,但不要重新填充

-u 在每个单词之间放置一个空格,在句末放置两个空格

可以使用 pr 工具将长文件分页,以适应给定大小的纸张。文本被分成指定长度的页面,并添加页面页眉。您可以控制页面长度(默认值为 66 行)和页面宽度(默认值为 72 个字符),以及列数。


pr 也可以生成多列输出。

当将文本输出到多列时,每列将被均匀地截断到定义的页面宽度。这意味着字符会被删除,除非原始文本被编辑以避免这种情况。


tr tr 工具将一组字符转换为另一组字符。

将大写字母更改为小写字母的示例

tr 'A-B' 'a-b' < file.txt


替换 /etc/passwd 中的分隔符

# tr ':' ' ' < /etc/passwd


注意tr 只有两个参数!。


sed sed 代表流编辑器,用于操作文本流。tr 不会从文件中读取,它只读取标准输入。它最常用于转换 bash 脚本中其他命令生成的文本输入。sed 是一种复杂的工具,需要一定时间才能掌握。它最常见的用例是在输入流中查找和替换文本。sed 的输出写入标准输出,原始文件保持不变,并且需要重定向到文件才能使更改永久生效。

命令

# sed ‘s/linux/Linux/g‘ readme.txt > ReadMe.txt

将在 readme.txt 文件中将 linux 替换为 Linux。命令末尾的 g 用于使替换全局生效,因此 sed 将处理整行,而不是在第一次出现 linux 时停止。有关 sed 的更多信息,请参阅 103.7 节。



使用的文件、术语和工具:* cat

  • cut
  • expand
  • fmt
  • head
  • od
  • join
  • nl
  • paste
  • pr
  • sed
  • sort
  • split
  • tail
  • tr
  • unexpand
  • uniq
  • wc


上一章 | 下一章

华夏公益教科书