![如何获得“tail”和“head”的逆行为?](https://linux22.com/image/17409/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97%E2%80%9Ctail%E2%80%9D%E5%92%8C%E2%80%9Chead%E2%80%9D%E7%9A%84%E9%80%86%E8%A1%8C%E4%B8%BA%EF%BC%9F.png)
有没有办法head
/ tail
a 文档并获得反向输出;因为你不知道文档中有多少行?
即我只想将除前两行之外的所有内容foo.txt
附加到另一个文档。
答案1
您可以使用它来剥离第一的两行:
tail -n +3 foo.txt
这是为了剥离最后的两行,如果您的实现head
支持它:
head -n -2 foo.txt
(假设文件\n
以后者结尾)
就像 的标准用法一样tail
,head
这些操作不是破坏性的。>out.txt
如果要将输出重定向到某个新文件,请使用:
tail -n +3 foo.txt >out.txt
如果out.txt
已经存在,则会覆盖该文件。>>out.txt
如果>out.txt
您希望将输出附加out.txt
到.
答案2
如果您想要除前 N-1 行之外的所有行,请tail
使用 number oflines进行调用+N
。 (数字是你要保留的第一行的行号,从1开始,即+1表示从顶部开始,+2表示跳过一行,依此类推)。
tail -n +3 foo.txt >>other-document
没有简单、可移植的方法来跳过最后 N 行。 GNUhead
允许head -n +N
作为tail -n +N
.否则,如果你有tac
(例如GNU或Busybox),你可以将它与tail结合起来:
tac | tail -n +3 | tac
可移植的是,您可以使用 awk 过滤器(未经测试):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
如果要从大文件中删除最后几行,可以确定要截断的部分的字节偏移量,然后使用 执行截断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))"
您无法从一开始就截断文件,但如果您需要删除大文件的前几行,您可以移动内容。
答案3
要删除前 n 行,可以使用 GNU sed。例如,如果 n = 2
sed -n '1,2!p' input-file
意思!
是“排除这个区间”。正如你可以想象的,可以获得更复杂的结果,例如
sed -n '3,5p;7p'
将显示第 3,4,5,7 行。更强大的功能来自于使用正则表达式而不是地址。
限制是必须提前知道行号。
答案4
{ head -n2 >/dev/null
cat >> other_document
} <infile
如果<infile
是一个常规的,lseek()
-able 文件,那么是的,无论如何,随意。以上是完全 POSIX 支持的构造。