Linux管理员 - cat命令



cat命令用于连接文件并打印到标准输出。之前,我们已经演示了cat命令的使用和滥用。cat服务于以下不同的目的:

  • 显示文件内容

  • 将一个文件的内容写入另一个文件

  • 将多个文件合并到一个文件中

  • 支持特殊功能:添加行号、显示特殊字符、消除空行

开关 操作
-b 编号非空行
-E 显示行尾
-T 显示制表符
-s 压缩空白,抑制重复的空行

如前所述,在使用grepsortuniq等实用程序时,我们希望尽可能避免将cat的输出通过管道传输。我们之前在简单演示管道命令时这样做了。但是,知道何时使用grep之类的实用程序执行操作才能将Linux管理员与Linux最终用户区分开来。

坏习惯

[root@centosLocal centos]# cat /etc/passwd | sort -t: -k1  | grep ":0" 
halt:x:7:0:halt:/sbin:/sbin/halt 
operator:x:11:0:operator:/root:/sbin/nologin 
root:x:0:0:root:/root:/bin/bash 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
sync:x:5:0:sync:/sbin:/bin/sync 
[root@centosLocal centos]#

好习惯

[root@centosLocal centos]# grep ":0" /etc/passwd | sort -t: -k 1  
halt:x:7:0:halt:/sbin:/sbin/halt 
operator:x:11:0:operator:/root:/sbin/nologin 
root:x:0:0:root:/root:/bin/bash 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
sync:x:5:0:sync:/sbin:/bin/sync 
[root@centosLocal centos]#

注意 - 将cat通过管道传输到诸如sort或grep之类的辅助命令仅在需要时才应执行。

cat的一个常见用法是处理Windows格式的行分隔符。Linux和Windows都根据内部设计,使用不同的控制代码来表示行尾(EOL):

* Linux line break is always a Line Feed: LF or depicted as "\n". 
* Windows is Carriage Return followed by a Line Feed: CR LF or depicted as "\r\n".
* Macintosh, in all moderne releases of OS X and now macOS, has adopted the Linux/Unix 
standard of LF or "\n"

因此,假设我们在像gedit这样的GUI文本编辑器中打开我们的文件,或者在应用过滤命令时遇到随机问题。文本显示在单行上,或者过滤命令无法按预期运行。

特别是当文本文件是从互联网上下载时,我们希望检查行分隔符。以下是cat显示EOL字符的示例输出。

[root@centosLocal centos]# cat -E  ./Desktop/WinNames.txt  
 $ed:Daniel:101 
 $enny:Colon:608 
 $ana:Maxwell:602 
 $arian:Little:903 
 $obbie:Chapman:403 
 $icolas:Singleton:203 
 $ale:Barton:901

注意每行前面的“$”?Linux正在读取CR“\n”,从而中断文件。然后将回车符转换到每个文件的第一个字符上。

在没有-E开关的情况下查看时,文件看起来不错:

[root@centosLocal centos]# cat  ./Desktop/WinNames.txt  
 Ted:Daniel:101 
 Jenny:Colon:608 
 Dana:Maxwell:602 
 Marian:Little:903 
 Bobbie:Chapman:403 
 Nicolas:Singleton:203 
 Dale:Barton:901

幸运的是,使用Linux过滤命令,这是一个简单的修复:

[root@centosLocal centos]# sed -i 's/\r$//g' ./Desktop/WinNames.txt  
[root@centosLocal centos]# cat -E ./Desktop/WinNames.txt  
Ted:Daniel:101$ 
Jenny:Colon:608$ 
Dana:Maxwell:602$

注意 - 使用-E开关查看时,所有Linux换行符都将以$结尾。

cat还可以用于将多个文件合并到一个文件中。

[root@centosLocal centos]# cat linux.txt  
CentOS 
Ubuntu 
Red Hat 
Suse 
Debian 
[root@centosLocal centos]# cat windwos.txt  
NT 3.5 
NT 4.0 
Server 2000 
Server 2003 
Server 2008 
Server 2012 
Server 2016 
[root@centosLocal centos]#

现在让我们使用cat将这两个文件合并。

[root@centosLocal centos]# cat windwos.txt linux.txt > server_class_operating_sytems.txt 
[root@centosLocal centos]# cat server_class_operating_sytems.txt  
NT 3.5 
NT 4.0 
Server 2000 
Server 2003 
Server 2008 
Server 2012 
Server 2016 
CentOS 
Ubuntu 
Red Hat 
Suse 
Debian 
[root@centosLocal centos]#

最后,我们可以使用-n开关对每一行输出进行编号。这将给我们一个总行数。

[root@centosLocal centos]# cat -n ./server_class_operating_sytems.txt  
 1  NT 3.5 
 2  NT 4.0 
 3  Server 2000 
 4  Server 2003 
 5  Server 2008 
 6  Server 2012 
 7  Server 2016 
 8  CentOS 
 9  Ubuntu 
10  Red Hat 
11  Suse 
12  Debian [root@centosLocal centos]#
basic_centos_linux_commands.htm
广告