Ict-创新/LPI/103.2
考生应能够将过滤器应用于文本流。
关键知识领域
- 将文本文件和输出流通过文本工具过滤器,以使用 GNU textutils 包中找到的标准 UNIX 命令修改输出。
Linux 拥有丰富的工具集,用于处理和操作文本文件。在本节中,我们将介绍其中一些工具。
cat - cat 是 concatenate 的缩写,是一个 Linux 命令,用于将文件内容写入标准输出。cat 通常与其他命令结合使用以执行对文件操作,或者如果您想快速了解文件内容。
# cat /etc/aliases |
cat 可以接受多个参数,最常用的是 -n 和 -b,它们分别对所有行和非空行输出行号。
head 和 tail - 工具 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 的输出。
-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 |
这将创建名为 xaa、xab、xac、xad ... 的文件,每个文件至少包含 5 行。可以在命令行中为文件提供更有意义的前缀名称(而不是 x),例如 passwd-5.
# split -l 5 /etc/passwd passwd-5 |
这将创建与上述文件(aa、xab、xac、xad ...)相同的文件,但名称现在是 passwd-5aa、passwd-5ab、passwd-5ac、passwd-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 是一种简单的文本格式化工具,它可以将文本重新格式化为指定长度的行。
您可以使用 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