该{ head; tail; }
解决方案无法在管道(或套接字或任何其他不可搜索的文件)上使用,因为它head
可能会消耗过多的数据,因为它被块读取,并且无法在管道上找回,可能会将光标留在文件内,超出了tail
预期范围选择。
因此,您可以使用一种像外壳程序那样一次读取一个字符的工具read
(此处使用以标题行和结尾行的数量为参数的函数)。
head_tail() {
n=0
while [ "$n" -lt "$1" ]; do
IFS= read -r line || { printf %s "$line"; break; }
printf '%s\n' "$line"
n=$(($n + 1))
done
tail -n "${2-$1}"
}
seq 100 | head_tail 5 10
seq 20 | head_tail 5
或tail
在awk中实现为:
head_tail() {
awk -v h="$1" -v t="${2-$1}" '
{l[NR%t]=$0}
NR<=h
END{
n=NR-t+1
if(n <= h) n = h+1
for (;n<=NR;n++) print l[n%t]
}'
}
与sed
:
head_tail() {
sed -e "1,${1}b" -e :1 -e "$(($1+${2-$1})),\$!{N;b1" -e '}' -e 'N;D'
}
(尽管要注意,某些sed
实现对其模式空间的大小限制很小,所以对于较大的尾线数量而言,这样做会失败)。
head and tail
对您不起作用?