这是我正在使用的文件的输出:
aaaaa
bbbbb
ccccc
ddddd
eeeee
fffff
ggggg
hhhhh
iiiii
jjjjj
我知道使用tail -n 5 filename
会显示这个:
fffff
ggggg
hhhhh
iiiii
jjjjj
我如何head
以这样的方式使用命令来显示相同的内容精确的线?
head -n 10 filename | tail -n 5 filename
有效,但这对于我正在寻找的东西来说是多余的。
答案1
你的命令
head -n 10 filename | tail -n 5 filename
毫无意义。的输出head
永远不会被读取,tail
因为tail
已经直接从 读取filename
。因此,结果与刚才的结果完全相同
tail -n 5 filename
该head
实用程序用于从顶部文件的内容(或者,对于 GNU head
,文件的所有行,除了从文件末尾算起的特定行数之外)。您不希望使用该head
实用程序来获取文件数据的尾部。为此,请tail
按照您所示的方式使用。
任何其他解决方案都会比您的基本解决方案更复杂tail -n 5
。
例如:
tac filename | head -n 5 | tac
假设已经tac
安装了 GNU coreutils。两者都head
将tail
安装在任何具有远程 POSIX 兼容 shell 环境的系统上,而tac
只能在 Linux 系统和其他安装了 GNU coreutils 的系统上找到。
或者,如果您只是不想使用,您可以实现自己的tail
:awk
tail
$ awk -vn=5 '{ lines[i++ % n] = $0 } END { for (j = 0; j < n; ++j) print lines[(i+j)%n] }' filename
fffff
ggggg
hhhhh
iiiii
jjjjj
答案2
我想,这就是你想要的。
foo@bar~$ cat 文件 啊啊啊 bbbb cccc 滴滴滴 诶诶诶 噗噗 嘎嘎嘎 哈哈哈 三三 杰杰杰杰
您想用来head
打印出与之前相同的行tail
。
foo@bar~$ tail -n 5 文件 噗噗 嘎嘎嘎 哈哈哈 三三 杰杰杰杰
解决方案
foo@bar~$ 排序 -r 文件 |头-5 |种类 噗噗 嘎嘎嘎 哈哈哈 三三 杰杰杰杰
答案3
此实现使用head
withouttail
仅显示文件的最后 5 行。
head -n -0 filename | sed 1,$(echo "$(wc -l filename | awk '{ print $1 }')-5" | bc -l)d
head -n -0 filename -- 显示文件中的所有行。
从man head:
-n, --lines=[-]N 打印前 N 行而不是前 10 行;以“-”开头,打印每个文件除最后 N 行之外的所有行
$(echo "$(wc -l filename | awk '{ print $1 }')-5" | bc -l) -- 根据文件总行数减 5 计算要删除的行数。
sed 1,(NUMBER_OF_LINES_TO_DELETE)d -- 根据先前的计算删除除最后 5 行之外的所有行。
答案4
head
是为了获得第一n文件的行。tail
是为了得到最后一个n文件的行。如果您想要更通用的东西,您可以查看这个线程。