linux tac命令

tac命令本质上是cat命令,但其目的是反向连接文件。 像 ,它有一个方便的回退模式打印到如果没有提供输出文件标准输出 (STDOUT),使其成为更经常用作懒惰类似寻呼机以下 -than它是函数的那些命令中的一个命名。

cat命令经常被过度使用和滥用,而tac通常被当作ddatecowsay之类的玩笑命令。 愚人节的文章中经常会详细介绍愚蠢的终端技巧。 因此, TAC实际上有一个合理的理由存在可能令人惊讶。

这实际上是一个有用的命令。

TAC的目的是什么?

tac手册页在描述其自身功能方面做得很差:

 Write each FILE to standard output, last line first. 

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


   
   
$ cat metasyntactic.list
foobar
foo
bar
baz

$ tac metasyntactic.list
baz
foobar
foo
bar

但这不是它的作用。 它的信息页面更加清晰:


   
   
copies each FILE (‘-’ means standard input),
or standard input if none are given,
to standard output, reversing the records
(lines by default) in each separately.

例如:


   
   
$ tac metasyntactic.list
baz
bar
foo
foobar

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

TAC和分隔符

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

对于CSV文件,该字符可能是逗号( ),但是您可以定义任何字符。 但是,如果文件没有以分隔符结尾,那么您将得到意外的结果:


   
   
$ tac --separator = "," metasyntactic.csv
bazbar,foo,foobar

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


   
   
$ tac --separator = "," --before metasyntactic.csv
baz,bar,foo,foobar

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

TAC和正则表达式

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


   
   
$ cat metasyntactic.txt
foobar123foo456bar789baz898

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

  • 导出您正在使用的Shell会话的变量。
  • 在外壳程序配置文件(例如〜/ .bashrc )中设置环境变量。
  • 将环境变量添加到tac命令(使用Bash,Zsh等格式)之前,如下例所示:

   
   
$ REG_EXTENDED = 1 tac --regex \
--separator = '[0-9]+' metasyntactic.txt
89baz898bar765foo432foobar1

regex选项不能很好地处理非终止记录,即使使用--before选项也是如此 。 如果该功能对您很重要,则可能需要调整源文件。

何时使用TAC

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

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

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

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

因此,当您发现系统需要哪些库来构建库所需的库(依此类推)时,依赖性列表将以自顶向下的形式增长。 在此过程结束时, tac是反转该列表的快速简便的方法。

另一个常见的烦恼是日志文件。 条目通常附加到日志文件中,因此管理员可以使用tail查看最新错误。 效果很好,但是有时您想看到条目的“块”,却不知道需要走多远。 通过tac命令传递给更少更多的命令,会将最新条目置于屏幕顶部。

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

交会

tac还有很多其他大用途,并且可能有很多原因使得tac太基本, 无法解决 。 您的系统可能已经安装它,然而,记住这个命令,下一次你发现在你的工作流程优势的情况下,真正真正需要在TAC反向糟透了。

翻译自: https://opensource.com/article/19/9/tac-command

linux tac命令

Logo

更多推荐