每天一个linux命令:cat

时间:2022-12-18 17:42:34

每天一个linux命令:cat

cat 命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。

更多精彩请查看:www.zicreate.com

1.命令功能

cat主要有三大功能:

  • a. 显示整个文件:cat filename
  • b. 从标准输入 stdin 创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件。
  • c. 将几个文件合并为一个文件:cat file1 file2 > file

2.命令格式

cat [选项] [文件]…

3.命令参数

    -A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFDTAB 之外

4.使用场景

场景1:读取文件内容

命令:

$ cat -n zicreate.txt
1 刚上初中的时候,有一天晚自习,同桌突然对我说道:下课后我咱俩去后操场看搞对象的去吧。
2
3 我:不去,人家都是初二初三的。万一靠太近,把咱俩打一顿怎么办?
4
5 同桌:放心吧,咱俩也拉着手装情侣,黑灯瞎火的,他们看不出来。
6
7 结果当晚我俩赶上了全校严打,抓住了不少早恋学生,第二天还全校通告批评,其中女生13人,男生15人。
8
9 作者:阿勒藏
10 链接:https://www.zhihu.com/question/65389861/answer/274473109
11 来源:知乎
12 著作权归作者所有,转载请联系作者获得授权。
13

场景2:查看文件内是否有window格式符

在window下编辑的文件copy到 Linux 下使用时,有事会遇到莫名奇妙的错误,如下:

$ ./window_edit.sh

-bash: ./window_edit.sh: /bin/bash^M: bad interpreter: No such file or directory

cat 输出显示文件中不可显格式符的方式如下:

$ cat -e window_edit.sh
#!/bin/bash^M$
^M$
echo "I'm from windows."^M$
^M$

上面的“^M$”就是不可见的特殊字符,“^M” 是windows下的换行符,在Linux下会出现识别错误,要解决这个问题至少可以通过 vim/sed/dos2unix 这三种方案进行处理。处理方案如下:

1. $ dos2unix window_edit.sh
2. 使用 vim/vi 的替换功能。
:%s/^M//g # 去掉所有的^M。
3. $ sed -e 's/^M/\n/g' window_edit.sh

注意:这里的“^M”要使用“CTRL-V CTRL-M”生成,而不是直接键入“^M”。

场景3:多文件合并输出

命令:

$ cat -b joke.txt onlyOne.txt
1 一个本科男找了一个女博士。
2 情人节,本科男给女博士发了一个520元的红包,附言:我爱你。
3 稍后,女博士给本科男发了一个5.20元的红包,并附言:我爱你多一点!
4 I have only one line

上面的示例视乎太简单了,下面讲一个实际应用的场景,在很久很久以前,我们的一个产品需要实现一个OTA功能,目标是将一个3M左右的文件通过GPRS下载到远程终端,由于GPRS稳定性较差,所以必须实现一个高效且节省流量的断点续传功能。实现原理简略如下:

tar -czvf - bin/ | split -b 30k      #将 bin 目录打包压缩并分割为30kb大小的分片
ls xa* | xargs -i mv {} {}.bin #将分片批量重命名为 .bin 为后缀的文件
cat *.bin > OTA.tar.gz #将分片重新合并为压缩包

通过上面的方法,将一个大文件分割为多个小的切片,传输时按照分片进行传输,如果一个分片出现错误只需要传输当前分片,通过以上方法极大的提高了文件传输效率,实际效果很好。

场景4:直接编辑生成文件

命令:

$ cat > test.txt <<END
>在学校里面打水排队的时候,旁边估计一对小情侣,腻腻歪歪的。
>女生对男生说,我想当国家主席。
>男生没说话
>女生看男生没反应,就生气的锤了他一下,说咋了,我想当国家主席,你咋不帮帮我
>男生这时候一脸无辜的憋了一句出来
>那我只能投你一票了。
>END

上文中的”END”为分界符,也可以是其他随便什么字符串,当输入第二个分界符实现闭合时,分界符之间的内容会自动写入指定的文件中。

在Linux的世界中,“>” 表示覆盖写入,“>>” 表示追加,所以,通过 cat 向文件中追加内容时,命令如下:

$ cat >> test.txt << END
> 我是追加的.
>END

扩展

cat 命令有一个好兄弟tac,tac就是将 cat 反写过来,所以他的功能就跟 cat 相反(仅指输出功能), cat 是从第一行到最后一行输出,而 tac 则是由最后一行到第一行反向输出!

命令:

$ tac test.txt
我是追加的.
那我只能投你一票了。
男生这时候一脸无辜的憋了一句出来
女生看男生没反应,就生气的锤了他一下,说咋了,我想当国家主席,你咋不帮帮我
男生没说话
女生对男生说,我想当国家主席。
在学校里面打水排队的时候,旁边估计一对小情侣,腻腻歪歪的。