为什么'尾巴'命令在使用-c + 1或-c-1时返回整个文件内容?

时间:2016-10-31 02:05:55

标签: linux bash

作为问题本身,我无法找出为什么tail以这种方式行事。 我有一个名为myfile.txt的文件,其内容为:

 firstline
 secondline
 thirdline

所以当我使用:

 tail -c-1 myfile.txt

 tail -c+1 myfile.txt

输出:

 firstline
 secondline
 thirdline

man tail

  

-c, - times = [+] NUM
   输出最后NUM个字节;或使用-c + NUM输出开始    每个文件的字节NUM

1 个答案:

答案 0 :(得分:3)

  • tail -c+1 myfile.txtcat myfile.txt相同:您告诉tail使用第一个+1)开始输出字节(-c),换句话说: 整个文件

  • tail -c-1 myfile.txt(更常见的是:tail -c1 myfile.txt)仅在myfile.txt中输出 最后一个字节
    假设myfile.txt是格式正确的文本文件,以尾随\n结尾,并使用单字节编码(如ASCII)或使用单字节ASCII编码作为子集,例如UTF-8,这将只输出\n,即空行

tail的基本逻辑置于一般术语中(涵盖 GNU BSD / macOS 实现) :

注意:
- tail支持此处未讨论的其他选项 - 请参阅man 1 tail - 在下面的所有表单中,选项(-<units>)及其选项参数(<count> / -<option>+<index>)之间的空格是< em>可选 - 这一般适用于与POSIX兼容的实用程序。

# Output <count> units *from the end* of the input.
# The following two forms are equivalent.
tail -<units>  <count>
tail -<units> -<count>
  # This next form is equivalent to: tail -n <line-count>.
tail -<line-count>

# Output everything *starting from* 1-based unit index <index>.
# In other words: Skip <index> - 1 units at the *start* of the input.
tail -<units> +<index>
  • 选项-<units>为选项参数<count> / <index>指定单位

    • -n 指的是
      • 省略-<units>并仅使用-<count> - 请注意所需的-前缀 - 与-n <count>相同。 (BSD / macOS tail也支持+<count>表单-n +<count>,但GNU tail不支持。{/ li>
    • -c 指的是字节(!),并且在任一实现中都 UTF8感知。
    • BSD / macOS tail还支持 -b ,用于512字节
  • 如果 <count>没有迹象(例如1)或明确减去(例如{{1} };从不必要),-1单位从输入的 end 返回

  • <count> - 前缀值被视为来自 + - 基于(!)单位索引 开始输入,从中输出输入行。 换句话说:1表示:在开头跳过+<index>单位,然后输出所有其余单位;例如,<index> - 1输出从 - 和包括 - 2nd 行开始的所有内容。

  • 省略tail -n +2-<units> / <count> / -<count> +<index>相同,这意味着tail -n 10的默认行为是输出输入的 最后 tail

如果我们将此逻辑应用于OP关于10-c+0行为的后续问题:

  • -c-0被视为与-c+0相同,因此输出整个输入(与-c+1相同):您要求从“第0个”字节开始的所有内容,但由于cat0 < 1是第一个实际的字节位置,您仍然可以将整个输入作为输出。

  • 1完全没有输出,因为你要求从结尾返回字节(换句话说: nothing )输入。