L16.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- cat和tac命令

3.1 cat:合并文件或查看文件内容

3.1.1 命令详解

【命令星级】 ★★★★★

【功能说明】

​ cat命令可以理解为英文单词concatenate的缩写,其功能是连接多个文件并且打印到屏幕输出,或者重定向到指定文件中。此命令常用于显示单个文件内容,或者将几个文件内容连接起来一起显示,还可以从标准输入中读取内容并显示,生产环境中,它常与重定向或追加符号配合使用。

​ cat命令的记忆方法:cat的中文意思是猫,可以理解为“瞄”一下文件内容,那就是显示文件内容了。根据笔者的运维经验,cat具备5大常用功能,具体请见表3-1。

​ 表3-1 cat命令常用功能
在这里插入图片描述
【语法格式】

cat [option] [file]
cat [选项] [文件]

​ 说明:在cat命令及后面的选项和文件里,每个元素之间都至少要有一个空格。

【选项说明】

​ 表3-2针对cat命令的参数选项进行了说明。

​ 表3-2 cat命令的参数选项及说明

在这里插入图片描述

3.1.2 使用示例

3.1.2.1 基础范例

​ **范例3-1:**执行cat的完整命令生产test.txt文件内容。

方法1:

[root@centos7 ~]# cat >test.txt<<EOF
> welcome to Linux
>
> if you like Linux please support me
>
>
>
> bye! boys and girls
> EOF	#这里要敲回车才能结束,另外,EOF必须成对出现,但也可以用别的成对标签进行替换。例如:neteagle字符标签,默认情况下结尾的EOF必须要顶格写。

方法2:

[root@centos7 ~]# cat >test.txt<<-EOF	#如果cat后面使用了“<<-”符号,则结尾的EOF可以不用顶格,但是要用tab键缩进。
>welcome to Linux
>
>if you like Linux please support me
>
>
>
>bye! boys and girls
> EOF

​ 以上就是cat命令在生产环境中常用的非交互式编辑文件的方法,请不用忽略上下文中的恐慌,那是下文测试选项时需要用到的。另外,如果内容中包含$符号时要用“\”符号进行转义。

​ 以上命令的执行结果如下:

[root@centos7 ~]# cat >test.txt<<EOF                                     
> welcome to Linux
> 
> if you like Linux please support me
> 
> 
> 
> bye! boys and girls
> EOF
[root@centos7 ~]# cat test.txt 
welcome to Linux
#此行是空行。
if you like Linux please support me
#此行是空行。
#此行是空行。
#此行是空行。
bye! boys and girls

​ **范例3-2:**直接执行cat命令查看文件内容,不带任何选项。

[root@centos7 ~]# cat test.txt 
welcome to Linux

if you like Linux please support me



bye! boys and girls

​ 这就是最简单最基本的查看文件内容的使用方法了。

​ **范例3-3:**执行cat命令,分别带-n及-b选项,并对比两者的区别。

[root@centos7 ~]# cat -n test.txt 
     1	welcome to Linux
     2	
     3	if you like Linux please support me
     4	
     5	
     6	
     7	bye! boys and girls
#说明:从上面的例子中可以看出,“-n”选项就是执行为文件内容编号并打印输出,包括空行。
[root@centos7 ~]# cat -b test.txt 
     1	welcome to Linux

     2	if you like Linux please support me



     3	bye! boys and girls
# 说明:从上面的例子中可以看出,-b选项与-n选项类似,但是-b选项并不为空行编号。    

​ **范例3-4:**执行cat命令,带-E选项。

[root@centos7 ~]# cat -E test.txt 
welcome to Linux$
$
if you like Linux please support me$
$
$
$
bye! boys and girls$

​ 从上面的例子可以看出,-E选项就是将文件结尾的隐藏结束标识符$符显示出来。即使是空行,结尾也是有结束标识符的,这一点大家需要注意。

​ 再来个小例子:

[root@centos7 ~]# cp test.txt test1.txt
[root@centos7 ~]# echo >test1.txt 
[root@centos7 ~]# cat -E test1.txt 
$
[root@centos7 ~]# ll test1.txt 
-rw-r--r--. 1 root root 1 Oct  9 14:13 test1.txt

​ 这个小例子更好地说明了即使是空行结尾也是有标识符$的。因此,在计算文件占用空间时,要注意这点。

​ -A(-vET)、-e(-vE)这两个选项都包含-E选项,因此,有与-E类似的功能,但-v、-T这两个选项在工作中使用得不多,了解一下即可。

​ **范例3-5:**执行cat命令,带-s选项。

[root@centos7 ~]# cat -s test.txt 
welcome to Linux

if you like Linux please support me
#此处原来是3行空行,现在,由于-s选项的原因,变成了一个空行了。
bye! boys and girls

​ 从上面的例子可以看出,-s选项就是将两个以上的空行变成一个空行,如果文件中连续的空行很多,那么这个选项可以让文件显示更加精炼易读。

​ 但是在实际生产工作中,我们还是习惯使用grep -v “^$” test.txt过滤掉所有的空行(一个空行都不留),从而让显示更紧凑一些,示例代码如下。有关grep的讲解,详见后文。

[root@centos7 ~]# grep -v "^$" test.txt	#"^$"是正则表达式字符组合,表示空行。
welcome to Linux
if you like Linux please support me
bye! boys and girls

​ **范例3-6:**执行cat命令编辑新文件。

[root@centos7 ~]# cat >test3.txt
hi,here is Linux os.
^C
[root@centos7 ~]# cat test3.txt
hi,here is Linux os.

​ 从上面的例子可以看出,这里是利用cat和“>”重定向将标准输出定向到文件,这是一张特殊的编辑文件的方法。

​ 这里有几个问题需要注意一下,具体如下:

​ 1)结束标记可以用快捷键Ctrl+d或Ctrl+c退出,但是必须要先执行回车操作,将光标定位到新的末输入的行才行。

​ 2)利用此种方式输入时,会发现如果输入错了,只按退格键(Backspace)将无法删除,需要按住“Ctrl+退格键”才能删除。

​ 3)此操作是一种特殊编辑方法,此处仅作为扩展知识点提及,生产环境中使用得很少。

​ **范例3-7:**执行cat命令连接并显示多个文件。

[root@centos7 ~]# cat test.txt test3.txt 
welcome to Linux

if you like Linux please support me



bye! boys and girls	#此行以上是test.txt 的内容。
hi,here is Linux os.	#这是test3.txt的内容。

​ **提示:**这样两个文件会一起显示,但还是会有先后顺序之分的,前面的test.txt的内容会优先显示。

3.1.2.2 生产案例

​ 说明:后面的生产案例会涉及Shell编程相关知识,如果没有Shell编程功底,则只需关注cat命令的用法即可。

​ **范例3-8:**利用cat实现一键优化Linux系统脚本。

​ 这是使用cat命令实现非交互式地在文件结尾增加内容的功能。下面的优化脚本是批量修改配置文件的方法,是生产环境中经常用到的用法,要熟练掌握才好。

​ 下面以一键优化脚本中的一部分Linux服务器内核选项优化为例来说明cat的功能。

​ 说明:本优化适合Apache、Nginx、Squid等多种Web相关应用,特殊的业务可能需要略做调整。

​ 所谓内核优化,主要是在Linux系统中针对业务服务应用而进行的系统内核选项优化,优化并无特殊的标准,下面以常见的生产换 中Linux的内核优化为例进行讲解,仅供大家参考。示例代码如下:

[root@centos7 ~]# vim opt_sysctl.sh
#!/bin/bash

/bin/cp /etc/sysctl.conf /etc/sysctl.conf.`date +%F_%T`
#备份sysctl.conf

cat >>/etc/sysctl.conf<<EOF	#修改sysctl.conf。
#added by neteagle at 2020 start
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_backets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.ipv4.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#end
EOF
sysctl -p &>/dev/null	#加载sysctl.conf。
:wq

​ 以上是脚本内容,下面是执行情况:

[root@centos7 ~]# sh opt_sysctl.sh
[root@centos7 ~]# tail -16 /etc/sysctl.conf
#added by neteagle at 2020 start
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_backets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.ipv4.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#end

​ **注意:**EOF可以使用任意成对字符串来代替,通常习惯使用EOF。

​ **范例3-9:**利用cat在脚本中显示帮助菜单。

[root@centos7 ~]# vim exportfs_usage.sh
#/bin/bash

exportfs_usage()
{
    
    
	cat <<END
	USAGE: $0 {start|stop|monitor|status|validate-all}
END
}
exportfs_usage
:wq

​ 执行上述脚本后的效果:

[root@centos7 ~]# sh exportfs_usage.sh 
	USAGE: exportfs_usage.sh {
    
    start|stop|monitor|status|validate-all}

​ 这里的cat命令可以用echo命令来代替,对于单行的内容显示和追加内容,使用echo命令是非常合适的,cat的优势是针对多行文本内容进行编辑,或者在已有内容的结尾追加新内容。

​ **范例3-10:**利用cat在脚本中显示内容选择菜单

[root@centos7 ~]# vim menu.sh
#/bin/bash

menu(){
    
    
	cat <<END
	1.[apple]
	2.[pear]
	3.[banana]
	4.[cherry]
	5.[orange]
	please select one that you like:
END
}
menu
:wq

​ 执行上述脚本后的效果如下:

[root@centos7 ~]# sh menu.sh
	1.[apple]
	2.[pear]
	3.[banana]
	4.[cherry]
	5.[orange]
	please select one that you like:

​ 为了实现自动化运维,有时高级运维人员不得不通过脚本将操作写好,然后让组内的初级运维或非运维的同事,通过傻瓜式的餐单选择,来完成相应的工作,进而提升工作效率。

​ 上面的脚本,从美感的角度来看,还是有缺陷。比如:

[root@centos7 ~]# vim menu.sh
#/bin/bash

menu(){
        cat <<END
        1.[apple]
        2.[pear]
        3.[banana]
        4.[cherry]
        5.[orange]
        please select one that you like:
        END	#此处定格写,没有保持队列。但是直接保持队列,脚本执行又会报错。
}
menu
[root@centos7 ~]# sh menu.sh
menu.sh: line 13: warning: here-document at line 4 delimited by end-of-file (wanted `END')
menu.sh: line 14: syntax error: unexpected end of file

​ 改进后的脚本如下:

[root@centos7 ~]# vim menu.sh
#/bin/bash

menu(){
    
    
	cat <<-END	#此处END前加了一个减号。
	1.[apple]
	2.[pear]
	3.[banana]
	4.[cherry]
	5.[orange]
	please select one that you like:
	END	#因为前面使用了“-END”,因此此处可以使用Tab键缩进,记住是以Tab键缩进而不是空格!
}
menu
:wq

​ **范例3-11:**利用cat连接多文件合并Web集群日志。

​ 在工作中,前端通常会有多个集群服务器节点,这时服务器记录日志都是在本地记录的,因此,完整的日志是所有服务器的日志总和。在Web节点把日志推到日志平台后,首先要做的就是对所有节点当天或者当小时的日志进行合并,这时就可以用cat的多文件功能,当然这不是必须的,还有别的方法,这里暂略,仅讲解cat的生产应用。

​ 合并Web集群节点日志的命令如下:

cat web01_access_20130522.log web02_access_20160522.log >web_access_20130522.log

​ 以下是生产环境下的演示:

在这里插入图片描述
在这里插入图片描述
上面用cat合并后的总日志文件的日志行并没有按照用户访问的时间进行排序,若要按访问时间进行排序,就要用到sort命令(请看后文详解)了,它可以让日志按第4列访问时间列进行排序,整个处理方法如下
在这里插入图片描述
在这里插入图片描述
​ **范例3-12:**利用cat命令实现一键Mysql主从同步。

​ 在进行MySQL主从同步时,最关键的步骤就是CHANGE MASTER…命令的使用了,如果希望非交互式地进行CHANGE MASTER…命令的完整选项配置,那么下面的命令就是最合适的了。

​ 以下是特殊生产场景下的应用,MySQL将自动批量制作主从同步所需要的语句。

cat |mysql -uroot -p'neteagle'<<EOF
	CHANGE MASTER TO
	MASTER_HOST='10.0.0.16',
    MASTER_PORT=3306,
    MASTER_USER='neteaglerep',
    MASTER_PASSWORD='neteaglerep',
    MASTER_LOG_file='mysql-bin.000025',
    MASTER_LOG_POS=4269;
EOF    

​ **提示:**请大家多注意整个语句中cat命令的语法,而不是cat中的内容,有关MySQL同步的内容,请参考相关资料。

3.2 tac:反向显示文件内容

3.2.1 命令详解

【命令星级】 ★★☆☆☆

【功能说明】

​ tac是cat的反向拼写,因此命令的功能为反向显示文件内容。cat命令是从第一行开始读取文本输出的,而tac则是从最后一行开始读取文本并进行反向输出,需要注意的是,2个命令都是以一行文本为单位的,每行文本的顺序不会改变的。

【语法格式】

tac [option] [file]
tac [选项] [文件]

​ **说明:**在tac命令及后面的选项和文件里,每个元素之间都至少要有一个空格。

【选项说明】

​ 表3-3针对该命令的参数选项进行了说明。

​ 表3-3 tac命令的参数选项及说明

在这里插入图片描述

3.2.2 使用范例

​ **范例3-13:**cat命令与tac命令的对比。

[root@centos7 ~]# cat /etc/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

[root@centos7 ~]# tac /etc/rc.local	#使用tac命令查看文件。 
touch /var/lock/subsys/local	#可以看到是最后一行最先输出,但是这行文本的字符顺序并没有改变。

# that this script will be executed during boot.
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
#
# this script will NOT be run after all other services.
# In contrast to previous versions due to parallel execution during boot
#
# to run scripts during boot instead of using this file.
# It is highly advisable to create own systemd services or udev rules
#
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#!/bin/bash

猜你喜欢

转载自blog.csdn.net/qq_25599925/article/details/125356832