tac
1. 命令作用
tac命令和cat命令功能差不多,都是读取文件或者标准输入的文本,然后显示在标准输出,只不过tac是按行反序输出的,即先打印最后一行,然后倒数第二行,。。
例如有一个文件,它的内容如下:
1 | 123 |
那么使用tac输出的结果就是
1 | 789 |
2. 命令格式
1 | tac [options]... [file]... |
如果没有文件名称,或者文件名称是-,那么代表标准输入。
3. 命令原理
tac命令的工作原理是根据一个字符串把整个文本切分成分组,然后先打印最后一个分组,再倒数第二个,。。。,最后打印第一个分组,用来拆分的分割字符串默认被附加在每一个分组末尾,tac默认使用换行符作为分割字符串。
这可能不太好理解,下面我们结合-b选项,讲解一下tac的工作原理。
4. 选项
4.1. -b,--before
这个选项可以把分割字符串附加在每一个分组的前面,假设上面的文件每一行都有一个换行符,换行符使用$表示,
1 | 123$ |
因此整个文本被换行符分割成“123” “456” “789”,由于使用-b选项,因此换行符会被附加在每一个分组前面,因此每一个完整的分组如下:
“123” “$456” “$789”,“$”,反着打印结果如下:
1 |
|
即:
- 先打印换行符
- 打印$789(此时789前面有个换行)
- 打印$456
- 最后在456后面打印123,456和123之间没有换行
4.2. -s,--separator=str
这个选项可以修改分割字符串,例如我们使用-s “ww”,那么我们使用这个选项打印如下文本 “aaawwbwswwdd$”($代表换行),即
1 | echo "aaawwbwswwdd" > test.txt |
熟悉根据分割字符串“ww”,原始文本被分割成“aaaww”,“bwsww”,“dd$”,那么打印出来的结果就是
1 | dd |
如果此时加上-b选项,
1 | tac -b -s "ww" test.txt |
熟悉根据分割字符串“ww”,原始文本被分割成“aaa”,“wwbws”,“wwdd$”,那么打印出来的结果就是
1 | wwdd |
4.3. -r,--regex
把分割字符串当成正则表达式来解析
4.4. --help和--version
这两个选项会被大部分GNU coreutils 工具包中的程序支持,分别是打印帮助信息和打印当前工具命令的版本号。