Shell 二三事之过滤器cat

cat - concatenate files and print on the standard output

Updated on 2017-09-18 02:22 (Created on: 2017-09-18 00:53)

过滤器

何谓过滤器呢,诸如 cat,grep,wl 之类的命令就是过滤器了。这样的命令 读取数据,对数据执行一些操作,然后输出结果。更准确地说,过滤器就是任何能够从标准 输入读取 文本 数据,并向标准输出写入 文本 数据的命令。又因为Unix 的 KISS(keep it simple, stupid) 设计理念,所以每个程序都被设计成能够出色完成一项特定任务的工具。又因为重定向和 管道的存在,使得可以将这些工具组合起来,发挥无穷威力

cat

在 Shell 里面运行cat,你会被要求输入文本数据,当你输入一行数据以后,然后按下回 车, 你输入的数据就会显示在屏幕,当你按下 ^D(<ctrl>+d),发送 eof 信号给 Shell,退出 catcat 做的事就是把你输入的字符,复制到标准输出 (一般情况是指你的屏幕).看到 这里有人或许会质疑,这东西有什么用呢?似乎什么都做不了。不,它的用处很大呢, 且容我细细禀来

使用场景

针对不同的使用场景,cat 可以发挥不同的作用

场景1

假如你要新建一个文本文件,里面只是很少的文本,你会怎么做呢?一般情况下,都是用 vim/emacs 之类的文本编辑器新建一个文本文件,然后输入几行文字,然后保存退出。这是 常见的做法. 看到这里,很自然有人会发问,这么说来,难道有更优雅的解决方法?有,这 是不用打开文本编辑器就能写入文本的 Hacking 方法:

cat > data

输入数据,然后 ^D(<ctrl>+d) 保存。你就新建了一个文本了。但是,如果你已经有一个 data 文件 ,里面的数据就会被覆盖; 当然,你也可以在原来文本末尾添加数据:

cat >> data

场景2

如果你有一个短文件,你想查看一下,同样,你可以使用cat

cat < data

当然,你也可以省略 < 这个重定向符号:

cat data

抑或是,你想显示某个大文件的最后一部分,你也可以如上操作。或许你会觉得,这个功能 很多命令也有实现,最典型的就是 tail. 但是 cat 可以很完美地和其他过滤器结合, 以充当整套管道线工具流的起始端,这个以后慢慢再阐述

场景3

如果你想复制文本文件,你首先会想起什么命令? cp,很自然嘛,我也不例外,但是 cat 也可以实现同样的功能,很意外吧:

cat < file > newfile

即把 file 复制到标准输出,然后再把 file 当作标准输入复制到 newfile. Amazing!

场景4

如果你想把多个文本文件的组合到一个文件,你会怎么做?用编辑器打开所有的文件 然后 select,cut,paste,save.我也会很自然地想到这个方法,但是是否存在着更 优雅的解决方案呢?当然:

cat file1 file2 file3 > newfile

总结

上面已经介绍了挺多 cat 的使用场景了,你觉得 cat 表现滴怎么样呢?相信你的感觉是 还行,但是并没有,我吹嘘的那么令人惊艳。因为这只是cat 最基本的功能,它最大的 用法还没有完全展现出来,笔者先举一例,以后再慢慢详叙:

cat file |grep "something" |sort -n |tee newfile
  • cat > file 读取输入,创建新的文件或替换
  • cat >>file 读取输入,追加新的文件
  • cat file/cat <file 显示一个已有文件
  • cat <oldfile> newfile 复制一个文件
  • cat file1 file2 file3>file4 组合多个文件