如何获得“tail”和“head”的反向行为?

chr*_*lee 62 tail text-processing head

有没有办法head/tail一个文件并获得反向输出;因为您不知道文档中有多少行?

即我只想获取除前两行之外的所有内容foo.txt以附加到另一个文档。

Sté*_*nez 64

您可以使用它来去除两行:

tail -n +3 foo.txt
Run Code Online (Sandbox Code Playgroud)

这是剥离最后两行:

head -n -2 foo.txt
Run Code Online (Sandbox Code Playgroud)

(假设文件以后者结尾\n


就像为标准的使用tailhead这些操作不是破坏性的。使用>out.txt,如果你想将输出重定向到一些新的文件:

tail -n +3 foo.txt >out.txt
Run Code Online (Sandbox Code Playgroud)

out.txt已经存在的情况下,它会覆盖这个文件。使用>>out.txt替代>out.txt,如果你宁愿输出追加到out.txt

  • `head -n -2` 不是 [POSIX 兼容](http://pubs.opengroup.org/onlinepubs/009604499/utilities/head.html)。 (10认同)
  • re *"head, 当文件以 `\n`"* 结尾时.. 它适用于除 `-n -0` 之外的所有负整数,它返回 * 什么都没有*,就像 `-n 0` 一样(使用: head (GNU coreutils) 7.4) ... 但是,当出现尾随的 `\n` 时,`-n -0` 确实会按照 `-` 的预期进行打印,即。它打印整个文件......所以它确实适用于所有非零负值......但是当没有尾随`\n`时`-0`失败 (3认同)

Gil*_*il' 9

如果您想要除前 N-1 行以外的所有行,请tail使用行数调用+N。(数字是要保留的第一行的编号,从1开始,即+1表示从最上面开始,+2表示跳过一行,以此类推)。

tail -n +3 foo.txt >>other-document
Run Code Online (Sandbox Code Playgroud)

没有简单、便携的方法可以跳过最后 N 行。GNUhead允许head -n +N作为tail -n +N. 否则,如果你有tac(例如 GNU 或 Busybox),你可以将它与 tail 结合起来:

tac | tail -n +3 | tac
Run Code Online (Sandbox Code Playgroud)

便携地,您可以使用 awk 过滤器(未经测试):

awk -vskip=2 '{
    lines[NR] = $0;
    if (NR > skip) print lines[NR-skip];
    delete lines[NR-skip];
}'
Run Code Online (Sandbox Code Playgroud)

如果要从大文件中删除最后几行,可以确定要截断的片段的字节偏移量,然后使用dd.

total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
Run Code Online (Sandbox Code Playgroud)

您不能在一开始就原地截断文件,但如果您需要删除大文件的前几行,您可以将内容移动到.