专栏首页Opensource翻译专栏Linux tac命令入门【Linux-Command line】

Linux tac命令入门【Linux-Command line】

了解何时使用tac命令代替cat,以及为何使用tac命令。

图片来源:Image credits: Jeff Macharyas, CC BY-SA 4.0. Donald, the cat.

tac命令本质上是cat命令,但其目的是反向连接文件。 像cat一样,如果没有提供输出文件,它也具有方便的后备模式,可打印到标准输出(STDOUT),使其成为比lazy pager(像“less and more”)更常用的命令之一。该function因此命名。

cat命令经常被滥用,而tac通常被当作ddate或cowsay之类的玩笑命令。 愚人节的文章中经常详细介绍傻气的终端技巧。 所以当发现tac确实有合理的理由存在时,人们可能感到惊讶。

实际上tac是十分有效的命令。

tac的目的是什么?

tac手册在描述其自身功能方面表现不佳:

按照该语句写的内容,tac应该打印文件的最后一行,然后从第一行开始打印文件:

但这不是它的作用。 其信息页面表达得更为清晰:

例如:

忽略tac可以提供反向功能这一事实,其实它具有一些令人惊讶的实用且独特的选择。

Tac和分隔符

如信息页所示,该文件不必用行定界,这意味着tac对于CSV文件同样有效。 可以使用“--separator”或“-s”选项以及文件中使用的分隔符来定义文件的分隔符。

对于CSV文件,该字符可能是逗号(“,”),但是你可以定义任何字符。 然而,如果文件没有以分隔符结尾,那么你会得到意料之外的结果:

前两项之间没有分隔符。 文件的最终记录(在最终分隔符之后的字符串,在此情况下为逗号)本身并不后面跟逗号,因此tac会将其视为non-record。 要解决此问题,请使用“--before”或“-b”选项,它将分隔符放在每个记录之前:

分隔符不必是单个字符, 它也可以是正则表达式(regex)。

Tac和正则表达式

正则表达式的完整说明不在本文讨论范围之内,但是值得一提的是,扩展POSIX为环境变量所支持。 扩展的regex大大提高了正则表达式的可读性,为了简单起见,被本示例所采用。 假设有一个文件,其中包含所有用整数分隔的字符串:

你可以预见到字符串由整数分隔,但不能准确地预测这些整数是什么。 这正是正则表达式要解决的问题。

要在tac命令中使用regex,请在“--separator”定义之前使用“--regex”或“-r”选项。 另外,除非已经在你的环境中设置了它,否则必须激活REG_EXTENDED环境变量。 可以将此变量设置为除零以外的任何值以激活它,且可以通过所有常用方法进行操作:

  • 导出你正在使用的Shell会话的变量。
  • 在你的Shell配置文件(例如“〜/ .bashrc”)中设置环境变量。
  • 将环境变量添加到tac命令(使用Bash,Zsh和类似命令)之前,如下例所示:

即使使用“--before”选项,regex选项也不能很好地处理未终止的记录。 如果该功能对你而言很重要,则可能需要调整源文件。

何时使用tac

这些简单而有用的解析选项使tac可作为不复杂,甚至极简的解析命令使用。对于那些不太值得编写AWK或Perl表达式的简单工作,tac可能是一个明智的解决方案。

很明显,tac命令是受限的,因为它除了逆转记录外不会以其他任何方式操作记录。但这有时是你唯一需要的列表操作。

例如,如果你打包分发软件,通常会列出安装所需的依赖项。根据收集此列表的方式,可以按照建立依赖关系所需的顺序(而不是安装它们的必要顺序)来获取它。

这种做法相对普遍,因为编译器错误首先触及到高级依赖项。也就是说,如果你的系统缺少libavcodec,则GCC会停止并发出警报;但也有其他例子,由于GCC尚未有机会针对libvorbis和libvpx探测你的系统,它无法告诉你这些依赖项也丢失了(并且在编译libavcodec之前,通常需要系统里已存在这些依赖项)。

因此,当你发现系统需要哪些库(libraries)来构建所需的库(等等)时,依赖性列表将以自顶向下的形式增长。在此过程结束时,tac可简单迅速地反转该列表。

另一个常见的棘手问题是日志文件。条目通常会附加到日志文件中,因此管理员可以使用tail查看最新错误。效果很好,但是有时候你想看到条目的“块”,却不知道需要走多远。通过tac命令传送到less或more的内容会将最新条目放在屏幕顶部。

最后,对于给定的部分,许多配置文件没有明确的终止标记。你可以查找awk和sed命令以设计一种方法来确定配置文件中的块何时结束,或者可以使用tac反转顺序。一旦解析器在该块中找到第一个相关条目,它就知道什么时候停止阅读,因为以前是页眉,现在是页脚。

Tac on

tac还有很多其他的重要用途,也许有很多原因使tac因太基本而无法成为解决问题的对策。 但是,你的系统可能已安装了该命令,因此,下次你若在工作流程中发现确实需要反向攻击的极端情况时,请记住此命令。

原文链接:https://opensource.com/article/19/9/tac-command

原文作者:Seth Kenlon(Red Hat)

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Powershell中的变量

    在我们的迷你系列“Variables in Shells”中,了解如何在PowerShell中处理局部变量。

    QRosie
  • 9个基本的GNU binutils 工具【Linux-Command-line】

    想象一下,尽管无法访问软件的源代码,但仍然能够理解软件的实现方式,在其中找到漏洞,并且(更好的是)修复了错误。 凡此种种都源于二进制形式。 听起来像是拥有超能力...

    QRosie
  • API测试--HTTPie入门【Linux-Command line】

    使用HTTPie(一种使用Python编写的易于使用的命令行工具)调试API客户端。

    QRosie
  • Java多线程总结

    对于进程和线程的概念可以简单的理解成一个包含关系,例如:一个人个体可以称为社会的一个进程,人可以同时做很多事情,这个称之为线程

    付威
  • Python入门进阶教程-多线程与多进程

    如何同时对一个文件夹开启四个任务同时处理不同的任务,而不会产生冲突?接下来我们一起了解一下多线程和多进程。

    知秋小一
  • Java并发之线程中断

         前面的几篇文章主要介绍了线程的一些最基本的概念,包括线程的间的冲突及其解决办法,以及线程间的协作机制。本篇主要来学习下Java中对线程中断机制的实现。...

    Single
  • Java中Synchronized的优化原理

    我们知道,从 JDK1.6 开始,Java 对 Synchronized 同步锁做了充分的优化,甚至在某些场景下,它的性能已经超越了 Lock 同步锁。那么就让...

    健程之道
  • 亿级流量场景下,大型缓存架构设计实现【3】---- 实现高可用

    在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的。

    小勇DW3
  • 【小家java】记录Java守护线程使用时因忽略细节,导致的一个线上问题的排查过程(守护线程异常退出)

    记得我在之前某一篇博文里讲到过一个案例:使用java的守护线程来模拟redis缓存的过期时间设定。

    BAT的乌托邦
  • 线程池实现原理-1

    这个看起来好像没有用到线程池,其实是因为没有可复用的线程,所以就一直创建新的线程了

    Java识堂

扫码关注云+社区

领取腾讯云代金券