Linux 管理员 - cat 命令

cat 命令用于连接文件并打印到标准输出。之前,我们已演示了 cat 命令的用途和滥用情况。 cat 服务器具有以下不同的用途 −

  • 显示文件内容

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

  • 将多个文件合并为一个文件

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

开关 操作
-b 编号非空行
-E 显示行尾
-T 显示tabs
-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 "
". 
* Windows is Carriage Return followed by a Line Feed: CR LF or depicted as "
".
* Macintosh, in all moderne releases of OS X and now macOS, has adopted the Linux/Unix 
standard of LF or "
"

因此,假设我们在 GUI 文本编辑器(如 gedit)中打开文件,或者在应用过滤命令时遇到随机问题。文本出现在一行上,或者过滤命令无法按预期运行。

特别是,当文本文件是从互联网上下载时,我们想要检查换行符。以下是 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" ",从而破坏文件。然后将回车符翻译到每个文件的第一个字符上。

当不使用 -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/
$//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.html