情景

cat是linux命令中最为基础的命令之一,它是“concatenate”(连接)的简写,作用概述是concatenate and print files,即:连接和查看文件内容。

常见用法有:

  • 查看单个文件:cat file1
  • 顺序查看多个文件:cat file1 file2 ...

一般cat会结合重定向符号(重写>、追加>>)使用,如常见的用法有:

  • 将一个文件的内容追加到另一个文件中:cat file1 >> file2
  • 合并多个文件产生新文件:cat file1 file2 > newfile
  • 用键盘输入创建一个新文件:cat << EOF > file3
$ cat << EOF > file3
> a
> b
> c
> EOF

>是命令行的提示符,不是你需要输入的内容。当输入“EOF”按回车后命令自动结束。

$ cat file3
a
b
c

cat命令本身也支持参数,但用法简单,功能单一,感兴趣的话可以自行man cat

cat还可以通过管道符“|”连接其它命令,但许多时候cat并不是必需的:

想知道文件的行数,可以使用cat file1 | wc -l,但wc -l file1一样可以做到。

想过滤文件中特定的字符串,可以使用cat file2 | grep "some string",但grep "some string" file2一样可以做到。

突破

在搜索引擎项目工作时,看到过研发工程师在调试问题时这样使用了cat——他们启动服务后,使用了命令cat some_data.txt > /dev/null,虽然当时没有直接向他们请教原委,但这个命令给我留下了深刻的印象:

  1. /dev/null是linux的位桶文件,写入它的内容会永远丢失,从它那里什么也读取不到。一般用法是想丢弃命令产生的标准输出和标准错误时,通常使用command > /dev/null 2>&1,因此,cat some_data.txt > /dev/null似乎没有任何效果。
  2. 当时观察到cat some_data.txt > /dev/null这个命令的执行时间非常长,这说明了some_data.txt这个文件也足够大。但第二次执行这个命令时,执行时间则大大缩减了。

由以上大致可以判断出,该用法是为了将文件内容导入到内存中,以便需要使用文件内容时能够快速获取。一般来说,从硬盘中读取数据需要5ms到10ms的时间,而从内存中读取数据时通常只需要50ns到100ns的时间,这就是page cache(页高速缓冲存储器)的作用。

总结

这个经历给我的体会是,许多时候,我们认为自己掌握了全部或绝大部分,而实际上,只是因为自己知道的太少,并且不认为自己知道的太少——我们压根不觉得是因为自己不知道。就像美国前国防部长拉姆斯菲尔德说过的那样:

because as we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we do not know. But there are also unknown unknowns - the ones we don't know we don't know.

我们有已知的已知,已知的未知,以及未知的未知。

相关链接

https://fulmicoton.com/posts/pagecache/

https://hoytech.com/vmtouch/

https://www.zhihu.com/question/28511196/answer/45604224

情景linux—不曾了解的cat用法的更多相关文章

  1. linux下find查找命令用法

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  2. linux mount命令参数及用法详解

    linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...

  3. 【转】linux expr命令参数及用法详解

    在抓包过程中,查看某个设定时间内,数据上下行多少,用命令expr 计算! --------------------------------------------------------------- ...

  4. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  5. linux sed命令参数及用法详解

    linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...

  6. Linux中yum和apt-get用法及区别

    Linux中yum和apt-get用法及区别   一般来说著名的linux系统基本上分两大类:   1.RedHat系列:Redhat.Centos.Fedora等   2.Debian系列:Debi ...

  7. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)

    linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至:            linux dd命令使用详解 dd 的主要 ...

  8. linux c语言 select函数用法

    linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...

  9. Linux中find命令的用法汇总

    Linux中find命令的用法汇总 https://www.jb51.net/article/108198.htm

随机推荐

  1. java里程碑之泛型--泛型注意的几点

    1,泛型的基本语法:类名<具体类> 对象名 = new 类名<具体类>().类型参数规范如下: 1),K键,比如映射的键,key的类型 2),V值,比如Map的值,value类 ...

  2. linkin大话设计模式--单例模式

    linkin大话设计模式 开文前先弱弱的问一句:什么是设计模式?我在研究java2ee的时候有研究过,在学js的时候也有看到.设计模式的概念最早源于建筑设计大师<建筑的永恒算法>一书,它表 ...

  3. php之快速排序

     <?phpfunction shell_sort(array $arr){        $right=$left = array();    $Rights=$Lefts = array() ...

  4. js发展历史

    1992年Nombas开发和醋C-minus-minus(c--),的嵌入式脚本语言,最初是绑定在Cenvi软件中,后将其改名scriptEase(客户端执行的语言) Netscape 接受Nomba ...

  5. 一个简单的node.js服务

    var http = require('http'); var qs = require('querystring'); var server = http.createServer(function ...

  6. 关于Kafka 的 consumer 消费者处理的一些见解

    前言 在上一篇 Kafka使用Java实现数据的生产和消费demo 中介绍如何简单的使用kafka进行数据传输.本篇则重点介绍kafka中的 consumer 消费者的讲解. 应用场景 在上一篇kaf ...

  7. iOS设备唯一标识的前世今生

    设备唯一标识 估计很多开发都有被要求过获取一下设备的唯一标识,获取设备的唯一标识经常使用在我们做统计或者是在保证一台设备登录亦或者是做IM的时候可能会考虑去使用它,这一次在自己的需求当中就有一个&qu ...

  8. ffmpeg转码使用硬件加速

    需求源于手机拍摄的视频,默认参数码率较大,拍摄的文件体积较大,不便于保存和转发.手机默认拍照的720P视频,默认码率达到4M,实际上转成1M就差不多了.FFmpeg默认的转码是使用软件解码,然后软件编 ...

  9. P1045 麦森数

    别问我为什么要写水题 #include <iostream> #include <cstdio> #include <cstring> #include <a ...

  10. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...