tac
2022-09-03 18:19:28 # 操作系统 # Linux # shell # 常用命令 # 文件展示命令

1. 命令作用

tac命令和cat命令功能差不多,都是读取文件或者标准输入的文本,然后显示在标准输出,只不过tac是按行反序输出的,即先打印最后一行,然后倒数第二行,。。

例如有一个文件,它的内容如下:

1
2
3
123
456
789

那么使用tac输出的结果就是

1
2
3
789
456
123

2. 命令格式

1
tac [options]... [file]...

如果没有文件名称,或者文件名称是-,那么代表标准输入。

3. 命令原理

tac命令的工作原理是根据一个字符串把整个文本切分成分组,然后先打印最后一个分组,再倒数第二个,。。。,最后打印第一个分组,用来拆分的分割字符串默认被附加在每一个分组末尾,tac默认使用换行符作为分割字符串。

这可能不太好理解,下面我们结合-b选项,讲解一下tac的工作原理。

4. 选项

4.1. -b,--before

这个选项可以把分割字符串附加在每一个分组的前面,假设上面的文件每一行都有一个换行符,换行符使用$表示,

1
2
3
123$
456$
789$

因此整个文本被换行符分割成“123” “456” “789”,由于使用-b选项,因此换行符会被附加在每一个分组前面,因此每一个完整的分组如下:

“123” “$456” “$789”,“$”,反着打印结果如下:

1
2
3
4


789
456123

即:

  1. 先打印换行符
  2. 打印$789(此时789前面有个换行)
  3. 打印$456
  4. 最后在456后面打印123,456和123之间没有换行

4.2. -s,--separator=str

这个选项可以修改分割字符串,例如我们使用-s “ww”,那么我们使用这个选项打印如下文本 “aaawwbwswwdd$”($代表换行),即

1
2
echo "aaawwbwswwdd" > test.txt
tac -s "ww" test.txt

熟悉根据分割字符串“ww”,原始文本被分割成“aaaww”,“bwsww”,“dd$”,那么打印出来的结果就是

1
2
dd
bwswwaaaww

如果此时加上-b选项,

1
tac -b -s "ww" test.txt

熟悉根据分割字符串“ww”,原始文本被分割成“aaa”,“wwbws”,“wwdd$”,那么打印出来的结果就是

1
2
wwdd
wwbwsaaa

4.3. -r,--regex

把分割字符串当成正则表达式来解析

4.4. --help和--version

这两个选项会被大部分GNU coreutils 工具包中的程序支持,分别是打印帮助信息和打印当前工具命令的版本号。