作为问题本身,我无法找出为什么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
答案 0 :(得分:3)
tail -c+1 myfile.txt
与cat 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感知。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个”字节开始的所有内容,但由于cat
,0 < 1
是第一个实际的字节位置,您仍然可以将整个输入作为输出。
1
完全没有输出,因为你要求从结尾返回零字节(换句话说: nothing )输入。