Answers:
您可以使用它来去除前两行:
tail -n +3 foo.txt
这将去除最后两行:
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
如果只需要前N-1行,请tail
用行数进行呼叫+N
。(数字是您要保留的第一行的数字,从1开始,即+1表示从顶部开始,+ 2表示跳过一行,依此类推)。
tail -n +3 foo.txt >>other-document
没有简单,可移植的方式跳过最后N行。GNU head
允许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))"
您不能在一开始就截断文件,尽管如果您需要删除一个大文件的前几行,则可以在中移动内容。
虽然tail -n +4
输出文件的第4行(前3行除外)是标准且可移植的,但其head
对应文件(head -n -3
,除后3行以外的所有文件)却不是可移植的。
可移植地,您可以:
sed '$d' | sed '$d' | sed '$d'
要么:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(请注意,在某些系统中,sed
其模式空间有限,无法缩放为的大值n
)。
要么:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
希望我清楚地了解您的需求。
您有几种方法可以完成请求:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
凡/ etc / passwd文件是文件
如果文件很大,第二种解决方案可能会有用:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
”。结尾“时。它对所有负整数都有效,除了-n -0
它根本不返回任何东西-n 0
(使用:head(GNU coreutils)7.4)...但是,当出现尾随时\n
,-n -0
会打印如预期的那样-
,即。它会打印整个文件...因此它适用于所有非零的负值..但是-0
在没有尾\n