快速头/尾命令问题

快速头/尾命令问题

这是我正在使用的文件的输出:

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。两者都headtail安装在任何具有远程 POSIX 兼容 shell 环境的系统上,而tac只能在 Linux 系统和其他安装了 GNU coreutils 的系统上找到。

或者,如果您只是不想使用,您可以实现自己的tailawktail

$ 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

此实现使用headwithouttail仅显示文件的最后 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文件的行。如果您想要更通用的东西,您可以查看这个线程

相关内容