• 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 [选项] [文件]
    
    • 1
    • 2

    ​ 说明:在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必须要顶格写。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    方法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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ​ 以上就是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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    [root@centos7 ~]# cat test.txt 
    welcome to Linux
    
    if you like Linux please support me
    
    
    
    bye! boys and girls
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    ​ **范例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选项并不为空行编号。    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    [root@centos7 ~]# cat -E test.txt 
    welcome to Linux$
    $
    if you like Linux please support me$
    $
    $
    $
    bye! boys and girls$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ​ 从上面的例子可以看出,-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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    ​ -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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ​ 从上面的例子可以看出,-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
    
    • 1
    • 2
    • 3
    • 4

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

    [root@centos7 ~]# cat >test3.txt
    hi,here is Linux os.
    ^C
    [root@centos7 ~]# cat test3.txt
    hi,here is Linux os.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ​ 从上面的例子可以看出,这里是利用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的内容。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ​ **提示:**这样两个文件会一起显示,但还是会有先后顺序之分的,前面的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    ​ **注意:**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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    ​ 这里的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

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

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

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    [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
    
    • 1
    • 2
    • 3

    ​ 改进后的脚本如下:

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

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

    cat web01_access_20130522.log web02_access_20160522.log >web_access_20130522.log
    
    • 1

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

    在这里插入图片描述
    在这里插入图片描述
    上面用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    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    3.2 tac:反向显示文件内容

    3.2.1 命令详解

    【命令星级】 ★★☆☆☆

    【功能说明】

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

    【语法格式】

    tac [option] [file]
    tac [选项] [文件]
    
    • 1
    • 2

    ​ **说明:**在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    Tomcat 源码分析 (连接器) (六)
    泛洪攻击(Flood Attack)
    『亚马逊云科技产品测评』活动征文|通过Lightsail搭建个人笔记
    【leetcode】2578.最小和分割
    APOLLO UDACITY自动驾驶课程笔记——规划、控制
    华为s5720s-28p-power-li-ac堆叠配置
    Ubuntu24多版本python解释器使用
    《七月集训》第二十二日——有序集合
    教你如何制作vue+springboot项目
    抖音自媒体运营的5个技巧,让你的账号快速涨粉
  • 原文地址:https://blog.csdn.net/qq_25599925/article/details/125356832