head
和 tail
— 行提取
head
和 tail
实用程序可分别用于获取文件的开头或结尾部分。两者都会从命令行中指定的文件读取,如果未提供文件,则从标准输入读取。
head
实用程序接受一个参数 -n
,后面必须跟一个整数,表示要显示的行数。
警告:使用 GNU 的
-c
选项不可移植,应避免使用。有关完整详细信息,请参阅 IEEE Std 1003.1-2017-head。请注意,GNU 系统上的 head(1)
描述了许多不可移植的选项。
tail
实用程序类似,但从文件末尾获取行。 -n
参数指定要显示的行数。
要指定“最后五行”,请使用 tail -n 5
。要指定“除前五行之外的所有行”,请使用 tail -n +6
。
# bad: drop first five lines, clumsily computing line count
tail -n $(($(wc -l in.txt | awk '{print $1}') - 5)) in.txt > out.txt
# good: let tail count lines from the beginning of the file
tail -n +6 in.txt > out.txt
警告:
head/tail -5
语法已弃用,不符合 POSIX 标准。有关完整详细信息,请参阅 IEEE Std 1003.1-2017-tail。请注意,GNU 系统上的 tail(1)
描述了许多不可移植的选项。
将 head
或 tail
与 sed
链接
将 head
或 tail
与 sed
链接通常是不必要的。使用地址和提前退出可以使用单个 sed
调用实现相同的功能。
# bad: get the first five lines of input.txt with all 'foo'
# replaced with 'bar'
head -n 5 input.txt | sed -e 's/foo/bar/g' > output.txt
# good: use sed's address ranges and command groups to do
# the same thing with only one fork
sed -n -e '1,5{ s/foo/bar/g ; p }' input.txt > output.txt
# good: another way is with an extra command which exits
# on line 5
sed -n -e 's/foo/bar/gp ; 5q' input.txt > output.txt
# bad: set foo to the first line containing somestring
foo=$(sed -n -e '/somestring/p' input.txt | head -n 1 )
# good: use early exit to do the same thing in pure sed
foo=$(sed -n -e '/somestring/{ p ; q }' input.txt )
# bad: output the last line matching 'somestring'
sed -n -e '/somestring/p' input.txt | tail -n 1
# good: do this in pure sed using the hold space
sed -n -e '/somestring/h ; $ {x;p}'
tail -n X
(其中 X
大于 1)可以在纯 sed
中实现,但很棘手。在这种情况下,使用链接命令可能是最简单的。
最后,要提取特定的一行,请使用 sed
而不是。
sed -n -e '123p'